3

私には解決できない問題があり、アイデアがないのでアドバイスが必要です:

コンテキスト: 私は自分の Web サイトで tinyMCE エディターを使用しており、外部の xml ファイルを含めるカスタム プラグインを開発しました。これまでのところ、すべてが期待どおりに機能しています。外部 xml ファイルへのリンクは、span-Tags として表されます。

<span id="-[XML Document 1]-" title="erg" class="xml_embed xml_include">-[XML Document 1]-</span>

ただし、通常のテキストと区別するためのカスタム クラス (xml_include) を持つ tinyMCE エディターでのみ、html/ソース コード ビューに切り替えるか保存すると、これらのスパン タグは xi:include 要素に置き換えられます。

<xi:include xmlns:xi="http://www.w3.org/TR/XInclude" show="xml_embed" href="erg">-[XML Document 1]-</xi:include>

span タグの innerHTML ("-XML Document 1]-") として設定されたテキストは、エディターでプレースホルダーとして機能し、ソース ビューで xi:include タグに移動され、プレースホルダーとして機能します。そこにも。


今問題に:

ソース コード ポップアップが表示される前に、変換先のコードspan.xml_includeが呼び出されます。xi:include

ed.onPreProcess.add(function(ed, o) {
var elm;
var domelm;
//get all span.xml_include elements
tinymce.each(ed.dom.select('span.xml_include', o.node), function(n) {
//IE ignores innerHTML when created with tinymce.dom, therefore use native JS createElement method to tell IE that custom tag is valid HTML
    if(tinymce.isIE)
    {
        domelm = document.createElement('xi:include');
        domelm.setAttribute("xmlns:xi", "http://www.w3.org/TR/XInclude");
        domelm.href = n.title;
        domelm.innerHTML = n.innerHTML;
        domelm.show = n.className.split(/\s+/)[0];
        document.body.appendChild(domelm);
        ed.dom.replace(domelm, n);
    }
    else
    {
        //ed = tinyMCE.activeEditor
        elm = ed.dom.create('xi:include', {href: n.title, show: n.className.split(/\s+/)[0]}, n.innerHTML);
        elm.setAttribute("xmlns:xi", "http://www.w3.org/TR/XInclude");
        ed.dom.replace(elm, n);
    }
  });
});

このコードは FF と Chrome では問題なく動作しますが、IE では動作しません (私は 7 と 8 をテストしました): IE では、新しい要素「domelm」の innerHTML を設定できません。空白のままにするか、明示的に設定するとエラーがスローされます。n.innerHTML にアクセスできます。行に「不明なランタイム エラー」が表示されるdomelm.innerHTML = n.innerHTML;

他に何を試しましたか?

  • ネイティブ JS の方法:domelm.appendChild(document.createTextNode(n.innerHTML));テキスト ノードを作成し、それを "domelm" に追加して成功しませんでした (エラーが発生しました: "メソッドまたはプロパティ アクセスへの予期しない呼び出し"、これは "Unerwarteter Aufruf oder Zugriff" (ドイツ語版) からの翻訳である必要があります)。 )))

  • tinyMCE API の方法:tinymce.DOM.setHTML(domelm, n.innerHTML);エラーは発生しませんでしたが、通常の空白の innerHTML も発生しました

  • jQueryの方法:$('#domelm').html(n.innerHTML);または最初var jQelm = $(domelm);に、jQelm.text(...);またはjQelm.html(...);問題ではない、どちらも機能しない、IEは常にjqueryコアで「メソッドへの予期しない呼び出し」エラーを返しますが、明らかに触れません..

  • 上記の if 条件の「else」部分に見られるように、tinyMCE で要素を作成する方法..ifdomelm.innerHTML = n.innerHTML;が明示的に設定されていない場合、elm.innerHTML は空白のままです。それ以外の場合は、上記のアプローチと同じエラーが発生します。よく検出をスキップしif(tinymce.isIE)ます..

他に何ができますか?提案?

また、カスタム xml 名前空間を適切に宣言し、MIME タイプをapplication/xhtml+xml単に の代わりにに変更し、 IE のノードをtext/html「アナウンス」し、一般的にコードを IE に喜ばせるように変更しました..これが最後の大きなバグのようです。克服する必要があります..FFとChromeはローカルとリモートで正常に動作し、エラーが表示されないため、コードのエラーかどうかはわかりません..?xi:includedocument.createElement('xi:include');

助けていただければ幸いです。私の意図が明確になるように、十分なコンテキストを提供していただければ幸いです。間違いをお詫びします。英語は私の母国語ではありません:)

4

1 に答える 1

4

わかりました、カスタム要素を ap/div/span タグでラップすると、最終的にトリックが実行されました: 私はスパンを使用して書式設定を変更せずに残しました..ここに私がしたことがあります:

onPreProcess 関数の「if(tinymce.isIE)」部分では、「xi:include」が作成される前に、ラッパーが必要です。

var wrapper = document.createElement('span');

カスタム タグ要素をラッパーに追加します。

wrapper.appendChild(domelm);

そして、domelm に追加するとエラーがスローされるため、textNode をラッパーに追加します。

wrapper.appendChild(document.createTextNode(n.innerHTML));

最後にラッパーを dom に追加し、"span" タグ (n) をラップされた "xi:include" に置き換えます (ラッパー、変更する span タグ):

document.body.appendChild(wrapper);
ed.dom.replace(wrapper, n);`

結果は、正しい innerHTML を持つ IE のカスタム "xi:include" タグです。

<span><xi:include xmlns:xi="http://www.w3.org/TR/XInclude" href="eh" show="xml_embed">-[XML Document]-</xi:include></span>
于 2011-06-08T09:46:11.070 に答える