如何正确使用innerHTML从html字符串创建一个元素(带有可能的子元素)?

San*_*hit 23 javascript string dom innerhtml

注:我希望使用任何框架.


目标只是创建一个基于HTML字符串返回元素的函数.


假设一个简单的HTML文档,如下所示:

<html>
<head></head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

提到的所有函数都包含在head部分中,所有DOM创建/操作都在body标记的主体末尾完成.


我有一个函数createElement,它将一个格式良好的HTML String作为参数.它是这样的:

function createElement(str)
{
  var div = document.createElement('div');
  div.innerHTML = str;
  return div.childNodes;
}
Run Code Online (Sandbox Code Playgroud)

现在这个函数在你调用它时效果很好:

var e = createElement('<p id="myId" class="myClass">myInnerHTML</p>');
Run Code Online (Sandbox Code Playgroud)

由于元素创建的次要(可能是巨大的)问题不是'true'元素,它仍然有一个'div'的parentNode.如果有人知道如何解决这个问题,那将是非常棒的.


现在,如果我使用更复杂的字符串调用相同的函数:

var e = createElement('<p id="myId" class="myClass">innerHTML<h2 id="h2ID" class="h2CLASS">Heading2</h2></p>');
Run Code Online (Sandbox Code Playgroud)

它创造了两个孩子,而不是一个孩子,另一个孩子有另一个孩子.

一旦你做了div.innerHTML = str.innerHTML而不是

`<p id="myId" class="myClass">innerHTML    <h2 id="h2ID" class="h2CLASS">Heading2</h2>    </p>`
Run Code Online (Sandbox Code Playgroud)

转向

`<p id="myId" class="myClass">innerHTML</p>        <h2 id="h2ID" class="h2CLASS">Heading2</h2>`
Run Code Online (Sandbox Code Playgroud)


问题:

  1. 在使用.innerHTML后,我可以以某种方式获取没有父节点的元素吗?
  2. 我可以(在稍微复杂的字符串的情况下)使我的函数返回一个元素与适当的子元素而不是两个元素.[它实际上返回三个,<p.myClass#myId>,<h2.h2CLASS#h2ID>,和另一个<p>]

use*_*716 17

这类似于答案palswim,除了它不打扰创建克隆,while()而是使用循环,总是在节点附加[0].

function createElement( str ) {
    var frag = document.createDocumentFragment();

    var elem = document.createElement('div');
    elem.innerHTML = str;

    while (elem.childNodes[0]) {
        frag.appendChild(elem.childNodes[0]);
    }
    return frag;
}
Run Code Online (Sandbox Code Playgroud)