【发布时间】:2011-04-09 10:26:35
【问题描述】:
注意:我确实不想使用任何框架。
目标只是创建一个函数,该函数将基于 HTML 字符串返回一个元素。
假设一个简单的 HTML 文档如下:
<html>
<head></head>
<body>
</body>
</html>
所有提到的函数都包含在 head 部分中,所有 DOM 创建/操作都在脚本标签中的主体末尾完成。
我有一个函数 createElement,它将格式良好的 HTML 字符串作为参数。它是这样的:
function createElement(str)
{
var div = document.createElement('div');
div.innerHTML = str;
return div.childNodes;
}
现在,当您像这样调用它时,这个函数效果很好:
var e = createElement('<p id="myId" class="myClass">myInnerHTML</p>');
由于创建的元素不是“真正的”元素这一小问题(可能是巨大的),它仍然有一个“div”的父节点。如果有人知道如何解决这个问题,那就太棒了。
现在,如果我用更复杂的字符串调用相同的函数:
var e = createElement('<p id="myId" class="myClass">innerHTML<h2 id="h2ID" class="h2CLASS">Heading2</h2></p>');
它会创建两个孩子,而不是一个孩子,另一个孩子有另一个孩子。
一旦你做了 div.innerHTML = str. innerHTML 而不是
`<p id="myId" class="myClass">innerHTML <h2 id="h2ID" class="h2CLASS">Heading2</h2> </p>`
转向
`<p id="myId" class="myClass">innerHTML</p> <h2 id="h2ID" class="h2CLASS">Heading2</h2>`
问题:
- 我能否在使用 .innerHTML 后以某种方式获取没有父节点的元素?
- 我能否(在稍微复杂的字符串的情况下)让我的函数返回一个带有适当子元素的元素,而不是两个元素。 [它实际上返回三个,
<p.myClass#myId>,<h2.h2CLASS#h2ID>,和另一个<p>]
【问题讨论】:
-
(1) 您可以从容器中删除节点 (
removeNode) 或克隆它们 (cloneNode) (2) 不适用于该示例,因为关于如何使用<p>的复杂规则标签工作。您的<h2>隐式关闭前面的<p>标记,因为<h2>是块级元素(与其他各种元素一样)。 -
尖刻地说 不是有效的 html 字符串 ;)
-
好吧是的,这是有道理的。
的不要进入 标签。这解决了这个问题。
-
您只能使用 removeNode 来删除 CHILDREN。编辑:nvm。一半的浏览器不支持它。奇怪的是只有IE。
标签: javascript string dom innerhtml