JavaScript:XMLSerializer.serializeToString()的替换?

时间:2011-02-06 21:38:24

标签: javascript internet-explorer

我正在使用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,它似乎有效。

4 个答案:

答案 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); 
}