我正在用outerHTML
替换DOM元素来替换它的内容。这个技巧很有用,但我需要立即访问新创建的DOM元素。用outerHTML替换元素并立即访问新创建的元素
不幸的是,创建元素<x>
和生成var code
的内容不受我控制。
var code, e;
(function() {
/**
* Things done inside this IIFE is not under my control
*/
code =
'<div style="border: 1px solid black;">' +
' <span>I </span>' +
' <span>want </span>' +
' <span>to </span>' +
' <span>access </span>' +
' <span>all </span>' +
' <span>these </span>' +
' <span>spans.</span>' +
'</div>';
e = document.getElementById('replace_this');
}());
e.outerHTML = code;
// by this point, element e is replaced with newly added HTML. Let's do
// an alert to make sure
alert('Check the document. New HTML is rendered.');
var spans = e.getElementsByTagName('span'); // oops! empty collection
alert(spans.length); // alerts 0
alert(e.outerHTML); // alerts '<x></x>'
<div id="container" style="padding: 20px; border: 1px dashed grey;">
<div>Don't replace this.</div>
<x id="replace_this"></x>
<div>Don't replace this either.</div>
</div>
行为处于MDN's notes on outerHTML
说明:
另外,虽然元素将文档,其可变的outerHTML属性设定将仍持有参考被替换原始元素
所以我的问题是,我如何在替换旧元素后立即访问新添加的元素? PS:我准备放弃outerHTML
,如果还有另一种方法可以用来替换元素,然后访问新创建的元素,则可以使用outerHTML
。
你不会能够,因为你已经有效地删除了父元素“e”。该对象仍然保留在HTML的旧副本中。您可以通过将'code'应用于'e.innerHTML'来欺骗它,然后设置'e.outerHTML = e.innerHTML',但这又是在现在不存在的节点列表中运行。我不会建议这种方法,因为它可能在不同的浏览器中有不同的功能。 –
我没有任何困难使用你的代码访问它:var target = document.getElementById('container'); alert(elementChildren(target)[0] .children.length); (var i = 0; i
这不是你要找的吗? –