这里是完整的演示代码:http://jsfiddle.net/DF2Uw/4/
基本上,我使用 FOR
生成多个事件监听器环形。我生成多个 <selects>
并希望检测 onChange 事件并返回已更改的特定选择的 ID。然而,似乎只有最后一个事件监听器幸存下来,因为其他事件监听器没有触发。
对这种行为有什么解释吗?
HTML
<ol id="slots"></ol>
JavaScript
var slotnameHtml = '';
for (var i = 0; i < 3; i += 1) {
var slotname = document.createElement('select'),
slottime = document.createElement('select'),
slotlist = document.createElement('li');
slotname.innerHTML = slotnameHtml;
slottime.innerHTML = '<optgroup><option value="1">00:01</option><option value="2">00:02</option></optgroup>';
slottime.id='test'+i;
slotlist.appendChild(slotname);
slotlist.appendChild(slottime);
document.getElementById('slots').appendChild(slotlist);
slottime.addEventListener('change', function () {
alert(slottime.id)
});;
}
最佳答案
那是因为您绑定(bind)到 change
的处理程序不要立即运行,而是稍后运行。同时,您的 for
循环已经运行,并且 slottime
已经反弹到它的最终值(你创建的最后一个 <select>
元素)。所有处理程序只会看到该值。
您可以引入一个闭包,以便处理程序可以访问正确的元素:
document.getElementById("slots").appendChild(slotlist);
(function(slottime) {
slottime.addEventListener("change", function() {
alert(slottime.id);
});
})(slottime);
正如 Teemu 在评论中正确地说的那样,最简单的解决方案是利用 this
这一事实绑定(bind)到处理程序内的目标元素:
slottime.addEventListener("change", function() {
alert(this.id);
});
关于javascript - 生成的事件监听器列表仅触发最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966135/