【问题标题】:How can I add a body element to an empty DOM document?如何将 body 元素添加到空的 DOM 文档?
【发布时间】:2011-12-22 02:16:01
【问题描述】:

我有一个代表页面正文的字符串,我想解析它以获取一些元素。我相信(随意反驳我)最好的方法是创建一个空文档,然后添加正文并使用标准 JS 方法来获得我想要的。
但我似乎无法将正文添加到文档中。在 chrome 中,以下代码在第 2 行以NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7 失败。

 var dom = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
 dom.firstChild.innerHTML = "<body><p>Hello world</p></body>";

有什么方法可以实现我想要的吗?

【问题讨论】:

标签: javascript dom


【解决方案1】:

由于我们比最初接受的答案要早几年,我想给出一个更现代的答案。

在 Firefox 50.0.2 中,您可以这样做:

document.body = document.createElement("body");
document.body.innerHTML = "<p>Hello World!</p>";

这里创建了正文并直接分配给“document.body”。 一些阅读(https://html.spec.whatwg.org/multipage/dom.html#the-body-element-2)让我明白,文档的属性“body”可以是“null”,也可以包含“body”或(不推荐)“frameset”类型的对象。

以下内容不起作用,即生成一个空白页,因为缺少对“document.body”的分配:

var body = document.createElement("body");
body.innerHTML = "<p>Hello World!</p>";

您可以这样做:document.documentElement.appendChild(body);,而不是 document.body = body;,而 document.firstChild.appendChild(body); 会引发错误(“HierarchyRequestError:无法在层次结构中的指定点插入节点”)。

有人可能会争论通过评估 innerHTML 添加段落是否是最好的方法,但那是另一回事了。

【讨论】:

    【解决方案2】:

    我注意到在最新版本的 chrome 中,Antoine 的回答不起作用 - 你得到一个空白页。但是,这在 chrome 中确实有效:

    var dom = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
    var body = dom.createElement("body");
    dom.documentElement.appendChild(body);
    
    // set timeout is needed because document.body is created after the current continuation finishes
    setTimeout(function() {    
      document.body.innerHTML = "Hi"
    },0)
    

    【讨论】:

    • @Mahi 我不知道。为什么不试一试并在这里报告呢? :)
    • 我认为文档是对象,正文是节点,所以我们不能这样做?
    • 如果页面上没有正文,您将不会有 document.body。这就是这个问题的全部意义所在。我想我不明白你的困惑
    • 下午好。我想我们也做不到html.createElement
    • 为什么文档只能创建元素 为什么其他元素不能创建元素。 ?
    【解决方案3】:

    无法编辑文档根元素的 innerHTML,但可以编辑子节点。所以,这行得通:

        var dom = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
        var body = dom.createElement("body");
        body.innerHTML = "<p>hello world</p>";
        dom.firstChild.appendChild(body);
    

    【讨论】:

    • 这在 chrome 40.0.2214.93 m 中不起作用。如果我把它放在脚本标签中,我会得到一个空白页
    • 我注意到添加到该 body 对象上的任何内容都不会出现,但如果您执行 setTimeout(function(){document.body.innerHTML="something"},0) 它确实有效跨度>
    猜你喜欢
    • 2013-05-27
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2014-08-14
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多