我注意到了一个有趣的行为,并且想知道是否有人可以说明原因。
它像这样崩溃:
div
和button
。onclick
处理程序,工作正常innerHTML
的{{1}}以添加更多内容div
完全停止工作以下是一个示例脚本:
onclick
此时,它工作正常。然后,添加以下行:...
var D = document.createElement("DIV"), B = document.createElement("BUTTON");
B.innerHTML = "Is it true?";
document.body.appendChild(D);
D.appendChild(B);
B.onclick = function() { alert("Elvis Lives!"); }
......按钮坏了。所以,我现在只对所有元素使用D.innerHTML += "What about Tupac?";
。
但是 -
答案 0 :(得分:4)
(这是很多有根据的猜测)我认为当你修改D
的{{1}}时,innerHTML
中的dom会被销毁并从新值中创建。因此,在构建新内容时,您将获得一个全新的D
,它与button
不是同一个节点。由于您通过js而不是原始元素上的属性设置B
处理程序,因此新onclick
没有该函数引用。但button
仍然有效,可以通过调用
B
追加B.click();
。
为防止dom在innerHTML
内发生颠簸,您可以执行此操作而不是使用D
:
innerHTML
答案 1 :(得分:3)
innerHTML
是创建DOM元素的快捷方式。当您使用innerHTML
将某些内容附加到外部div时,会发生以下情况:
D.innerHTML += "What about Tupac?";
与
相同D.innerHTML = D.innerHTML + "What about Tupac?";
与
相同D.innerHTML = "<button>Is it true?</button>" + "What about Tupac?";
最终成为了这个,
D.innerHTML = "<button>Is it true?</button>What about Tupac?";
现在,在最后一步中,我们用一个包含HTML的新字符串完全替换了div的现有内容。就DOM而言,它并不关心用户是手动输入HTML,还是来自在DOM节点上调用innerHTML
。所有它关心的是,它有一个HTML字符串,必须转换为DOM。此时会创建一个新的按钮元素,这就是onclick
停止工作的原因 - 它不再是同一个元素了。
答案 2 :(得分:1)
不是答案,只是一个测试页面 - 看起来很奇怪 - 我可以确认你的发现
<script>
window.onload=function() {
var D = document.createElement("DIV"), B = document.createElement("BUTTON");
D.id = "div1"
B.innerHTML = "Is it true?";
B.onclick = function() { alert("Elvis Lives!"); }
D.appendChild(B);
document.body.appendChild(D);
}
</script>
<a href="" onclick="document.getElementById('div1').innerHTML += 'What about Tupac?'; return false">Click</a><br>
<a href="" onclick="alert(document.getElementsByTagName('button')[0].onclick); return false">Test</a>
更新:经验教训 - 保持一致。
这可以按预期工作
<script>
window.onload=function() {
var D = document.createElement("DIV");
D.id = "div1"
D.innerHTML = '<button onclick="alert(\'Elvis Lives!\')">Elvis</button>'
document.body.appendChild(D);
}
</script>
<a href="" onclick="document.getElementById('div1').innerHTML += 'What about Tupac?'; return false">Click</a><br>