Javascript JS:innerHTML和DOM是';不合作
我注意到一个有趣的行为,想知道是否有人能解释一下原因 它分解如下:Javascript JS:innerHTML和DOM是';不合作,javascript,dom,innerhtml,Javascript,Dom,Innerhtml,我注意到一个有趣的行为,想知道是否有人能解释一下原因 它分解如下: 我使用Javascript的“appendChild”添加了一个div和一个按钮 我在按钮上添加了一个onclick处理程序,效果很好 我添加并分配div的innerHTML,以添加更多内容 按钮onclick完全停止工作 下面是一个示例脚本: var D = document.createElement("DIV"), B = document.createElement("BUTTON"); B.innerHTML =
- 我使用Javascript的“appendChild”添加了一个
和一个div
按钮
- 我在按钮上添加了一个
处理程序,效果很好onclick
- 我添加并分配
的div
,以添加更多内容innerHTML
- 按钮
完全停止工作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?";
…按钮坏了。所以,我现在只对所有元素使用appendChild
但—
- 为什么会发生这种情况(“似乎它应该起作用:)”)
- 是否有修复(除了附加所有额外元素)
- 不是答案,只是一个测试页面-看起来很奇怪-我可以确认你的发现
<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>
window.onload=function(){
var D=document.createElement(“DIV”),B=document.createElement(“按钮”);
D.id=“div1”
B.innerHTML=“这是真的吗?”;
B.onclick=function(){alert(“猫王活着!”);}
D.儿童(B);
文件.正文.附件(D);
}
更新:经验教训-保持一致 这是意料之中的事
<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>
window.onload=function(){
var D=document.createElement(“DIV”);
D.id=“div1”
D.innerHTML='Elvis'
文件.正文.附件(D);
}
(这是很多有根据的猜测)我认为当您修改D
的innerHTML
时,D
中的dom将被销毁,并从新值创建。因此,当构建新内容时,您将得到一个全新的按钮
,它与B
节点不同。由于通过js而不是通过原始元素上的属性设置onclick
处理程序,因此新的按钮
没有该函数引用。但是B
仍然可以通过调用
B.click();
附加到innerHTML
之后
要防止在D
中对dom进行抖动,可以这样做,而不是使用innerHTML
:
D.appendChild(document.createTextNode("What about Tupac?"));
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 = D.innerHTML + "What about Tupac?";
D.innerHTML = "<button>Is it true?</button>" + "What about Tupac?";
D.innerHTML=“这是真的吗?”+“Tupac呢?”;
最后变成了这个,
D.innerHTML = "<button>Is it true?</button>What about Tupac?";
D.innerHTML=“这是真的吗?Tupac呢?”;
现在在最后一步中,我们用一个包含HTML的新字符串完全替换了div的现有内容。就DOM而言,它不关心用户是手工输入HTML,还是通过在DOM节点上调用
innerHTML
来输入HTML。它所关心的是,它有一个HTML字符串,必须将其转换为DOM。此时创建了一个新的按钮元素,这就是为什么onclick
停止工作的原因-它不再是同一个元素。听起来不错,但我可能会等待一些其他意见。是的,我到处都在使用appendChild
,但是innerHTML
只是简单了几行而已……我甚至不能降低自己的身份去看一个奇怪的页面!这是什么玩意儿?:)只是开玩笑。谢谢你的确认。。。