我有一个问题,我无法解决,需要你的建议,因为我没有想法:
上下文:我在我的网站上使用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 /源代码视图或保存时,这些span标记将替换为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&amp; 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核心中的错误,我显然不会触及..
创建元素的tinyMCE方式如上面if条件的“else”部分所示..if domelm.innerHTML = n.innerHTML;
没有明确设置,elm.innerHTML只是保持空白,否则相同的错误因为在上面的方法发生,因此我也可以跳过if(tinymce.isIE)
检测..
我还能做什么?建议?
我还确保正确声明自定义xml命名空间,将MIME类型更改为application/xhtml+xml
而不是简单地text/html
,“宣布”IE的xi:include
节点document.createElement('xi:include');
1}}并且通常更改代码以取悦IE ..这似乎是我必须克服的最后一个主要错误..
我不确定我的代码中是否有错,因为FF和Chrome工作正常本地和远程并且没有显示任何错误..?
感谢任何帮助,我希望我为您提供了足够的背景,以便明确我的意思。抱歉错误,英语不是我的第一语言:))
答案 0 :(得分:4)
好的,将自定义元素包装在p / div / span标签中最终实现了诀窍:我使用span来保持格式不被修改。我做了以下事情:
在onPreProcess函数的“if(tinymce.isIE)”部分中,在创建“xi:include”之前,需要一个包装器:
var wrapper = document.createElement('span');
将自定义标记元素附加到包装器:
wrapper.appendChild(domelm);
并将textNode附加到包装器,因为将其附加到domelm会引发错误:
wrapper.appendChild(document.createTextNode(n.innerHTML));
最后将包装器附加到dom并用包装的“xi:include”替换“span”标签(n)(包装器,要修改的span标签):
document.body.appendChild(wrapper);
ed.dom.replace(wrapper, n);`
结果是在IE中使用正确的innerHTML自定义“xi:include”标记:
<span><xi:include xmlns:xi="http://www.w3.org/TR/XInclude" href="eh" show="xml_embed">-[XML Document]-</xi:include></span>