我正在使用Seam框架和RichFaces AJAX库开发一个网站(这些对于手头的问题并不是那么重要 - 只是一些背景)。
然而,我似乎在RichFaces中发现了一个错误,在某些情况下会导致基于AJAX的更新在IE8中失败(有关详细信息,请参阅此处:http://community.jboss.org/message/585737)。
以下是发生异常的代码:
var anchor = oldnode.parentNode;
if(!window.opera
&& !A4J.AJAX.isWebkitBreakingAmps()
&& oldnode.outerHTML
&& !oldnode.tagName.match( /(tbody|thead|tfoot|tr|th|td)/i ) ) {
LOG.debug("Replace content of node by outerHTML()");
if (!Sarissa._SARISSA_IS_IE || oldnode.tagName.toLowerCase()!="table") {
try {
oldnode.innerHTML = "";
} catch(e){
LOG.error("Error to clear node content by innerHTML "+e.message);
Sarissa.clearChildNodes(oldnode);
}
}
oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
}
最后一行(使用XMLSerializer的那一行)是IE中发生异常的地方。我想知道是否有人知道我可以在那里使用的任何替换方法/库/等(仅在IE上很好)。感谢。
编辑:在做了一些进一步的研究之后,似乎异常不是由XMLSerializer定义的,而是当我尝试将XMLSerializer的输出分配给oldnode的outerHTML属性时。 / p>这很奇怪,因为它大部分时间都有效,但仅在几个场景中失败(这个框架似乎相当重要)。
任何人都可以想到什么时候XMLSerializer的输出(从调试器显示的内容看起来是非常有效的HTML)对元素的outerHTML属性不可分配?
最奇怪的是,如果我要克隆元素(使用cloneNode(true)
)然后设置outerHTML,它似乎有效。
答案 0 :(得分:17)
在IE中,您可以简单地使用XML节点的xml
属性,前提是newnode
实际上是XML节点而不是HTML节点:
function serializeXmlNode(xmlNode) {
if (typeof window.XMLSerializer != "undefined") {
return (new window.XMLSerializer()).serializeToString(xmlNode);
} else if (typeof xmlNode.xml != "undefined") {
return xmlNode.xml;
}
return "";
}
oldnode.outerHTML = serializeXmlNode(newnode);
我不会使用outerHTML
来替换元素。它并非普遍支持。相反,您可以使用innerHTML
和标准DOM方法的混合,如下所示:
var tempEl = document.createElement("div");
tempEl.innerHTML = serializeXmlNode(newnode);
oldnode.parentNode.replaceChild(oldnode, tempEl.firstChild);
答案 1 :(得分:2)
我已经发现了原因(前一段时间)。事实证明,IE半插入HTML进行半验证(它会忽略一些错误但忽略其他错误)。它抛出了一些“未知错误”或类似的东西,几乎完全没用,因为它没有说明出了什么问题 - 只是出了点问题。
在我的情况下,这是因为< li />与父母一起插入。如果您遇到类似问题,可能需要确保不要试图对HTML过于聪明。
答案 2 :(得分:1)
边缘案例答案(主要是我以后可以找到):
将HTML文档作为String发送到api以生成PDF。
对于任何需要将document.body转换为String的人,他们通过POST将其提交给服务以将文档转换为PDF - IE8不支持XMLSerializer
。话虽如此,你可以使用:$(document.body).html();
用于IE8。
/**
* Decides the method by which to turn the document.body into a string that we can post to the PDF Api.
* Most browsers support XMLSerializer, for others (ie8) use jquery's html method to generate a string.
* @param xmldom - document.body
* @return - string representation of the document body
*/
function serializeXml(xmldom){
if (typeof XMLSerializer != "undefined"){
return (new XMLSerializer()).serializeToString(xmldom);
} else {
return $(xmldom).html();
}
}
用var dom = serializeXml(document.body);
答案 3 :(得分:0)
建议的解决方案对我不起作用。这是我解决这个问题的方法。
我换了一行:
oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
由此:
if(navigator.appName.indexOf('Internet Explorer')>0){
oldnode.outerHTML = newnode.xml
}else{
oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
}