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

时间:2012-02-02 19:01:36

标签: javascript dom innerhtml cdata

我正在将html作为字符串传递。我的目标是从html创建一个包含所有相应节点的新文档,以便我可以在我创建的文档上调用doc.getElementsByTagName,并使其按预期工作。我的代码就是一个例子。

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

我遇到以下问题:

  1. 如果脚本标记内的某些内容包含&lt; (例如,在上面的例子中,“var foo = x + y;”语句将+更改为&lt;符号),我得到一个INVALID_STATE_ERR:DOM异常11。
  2. 即使脚本标记内没有任何内容使用这些字符,当我运行上面的内容时,我得到输出“[object Element] code = undefined”
  3. 所以我的问题是:

    一个。如何处理诸如&lt;之类的字符?当我尝试在我将innerHTML设置为的任何内容中使用它时,会给出DOM Exception 11  B.如何使文档正确解析脚本标记并将其代码放入innerHTML属性中,以便稍后阅读。

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

2 个答案:

答案 0 :(得分:4)

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

doc = document.implementation.createHTMLDocument("");
doc.open("replace");
doc.write(html);
doc.close();

html应该是你的html内容。 我没有测试它,也不知道你是否应该首先逃避角色。

答案 1 :(得分:0)

一个。你需要转换任何&lt;到HTML实体(&amp; lt;)。规则不会因为你在脚本标签中而停止应用。

B中。您调用变量'doc'但尝试从未定义的变量'tempDoc'获取脚本标记。当我在更改该变量后在浏览器中运行代码时,一切似乎都正常。