【问题标题】:Using document.implementation.createDocument to create a new HTML document使用 document.implementation.createDocument 创建一个新的 HTML 文档
【发布时间】:2012-02-25 11:01:27
【问题描述】:

我正在将 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. 如果脚本标签中的某些内容包含像
  2. 即使脚本标签内没有使用此类字符,当我运行上述代码时,我会得到输出“[object Element] code =undefined”

所以我的问题是:

A.当我尝试在我将 innerHTML 设置为的任何内容中使用它们时,如何处理诸如

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

【问题讨论】:

    标签: javascript dom innerhtml cdata


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经确认这可以工作(尽管我认为空的“”是不必要的)。
    • "" 将告诉文档不要加载 HTML 中指定的请求,例如图像、脚本等......换句话说,"" 不会在里面加载 HTTP 请求,否则,如果没有指定,它会运行,甚至运行 JS。你可能不想要这个,所以引号应该是非常必要的。
    【解决方案2】:

    A.您需要将任何

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

    【讨论】:

    • 感谢您的回复! tempDoc vs doc 是我将代码放入堆栈溢出的错误。我最初有两个功能。有趣的是,在阅读了您的回复后,我尝试在 FF 中运行我的代码并且它可以工作,但它在 chrome 中不起作用。知道为什么会这样吗?你能确认这种行为吗?还有一个标准的正则表达式可以将所有必要的字符转换为它们的 HTML 实体等效项吗?
    • 是的,我用的是FF。签入 Chrome 和 innerHTML 不起作用,但 textContent 适用于 Chrome 和 FF。不知道 IE。
    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2020-01-16
    • 2019-10-05
    • 2014-03-04
    • 1970-01-01
    • 2016-06-28
    • 2016-04-30
    • 2014-03-26
    相关资源
    最近更新 更多