JavaScript:XMLSerializer.serializeToString() 的替代品?

标签 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 属性时似乎发生了。

这很奇怪,因为它在大多数情况下都有效,但只在少数情况下失败(框架的这一部分似乎相当重要)。

谁能想到什么时候 XMLSerializer 的输出(从调试器显示的内容来看,它看起来是非常有效的 HTML)不可分配给元素的 outerHTML 属性

最奇怪的是,如果我要克隆元素(使用 cloneNode(true))然后设置 outerHTML,它似乎可以工作。

最佳答案

在 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);

关于JavaScript:XMLSerializer.serializeToString() 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4916327/

相关文章:

CSS 动画无处不在,但在 IE 和 Edge 中不行?

javascript - 使用 iFrame 的跨域 Javascript 调用

javascript - 如何使状态栏/地址栏在 Firefox 或 IE 中消失?

HTML 复选框 - 跨浏览器问题

javascript - 根据给定范围向上或向下舍入数字

javascript - 使用 JSON 将 Javascript 数组传递给 PHP 数组,使用 PHP 数组查询 mysql

javascript - 通过 Lodash 从数组创建对象映射

javascript - 从网络浏览器外部停止 HTML5 动画

javascript - 为什么这个 JavaScript 可以在 Safari 上运行,但不能在 Firefox 上运行?

internet-explorer - IE 11 "sometimes"阻止显示 "font-awesome"webfonts