使用 document.implementation.createDocument 创建一个新的 HTML 文档

asu*_*and 1 javascript dom innerhtml cdata

我正在将 html 作为字符串传递。我的目标是从具有所有适当节点的 html 创建一个新文档,以便我可以在我创建的文档上执行诸如调用 doc.getElementsByTagName 之类的操作,并使其按预期工作。我的代码的一个例子是here。

var doc = window.document.implementation.createDocument
    ('http://www.w3.org/1999/xhtml', 'html',  null);
doc.getElementsByTagName('html')[0].innerHTML =
      '<head><script>somejs</script>' +
      '<script>var x = 5; var y = 2; var foo = x + y;</script>' +
      '</head><body></body>';
var scripts = doc.getElementsByTagName('script');
console.log(scripts[0] + " code = " + scripts[0].innerHTML);
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

  1. 如果脚本标记中的某些内容包含像 < 的字符(例如,在上面的示例中,“var foo = x + y;”语句将 + 更改为 < 符号),我会收到 INVALID_STATE_ERR: DOM Exception 11。
  2. 即使脚本标签内没有使用这些字符,当我运行上面的代码时,我也会得到输出“[object Element] code =undefined”

所以我的问题是:

A. 我如何处理诸如 < 之类的字符,当我尝试在将 innerHTML 设置为 B 时使用它们时会出现 DOM 异常 11。如何使文档正确解析脚本标签并将它们的代码放入其 innerHTML 属性中以便我以后可以阅读。

编辑:正如 Ryan P 指出的,这段代码实际上适用于 FF。因此,如果有人能帮助我让它在 chrome 中工作,那将不胜感激!

小智 5

摘自https://github.com/rails/turbolinks,为什么不尝试以这种方式创建文档:

doc = document.implementation.createHTMLDocument("");
doc.open("replace");
doc.write(html);
doc.close();
Run Code Online (Sandbox Code Playgroud)

哪里html 应该是你的 html 内容。我还没有测试过,不知道你是否应该先转义字符。