javascript - 生成的事件监听器列表仅触发最后一个

标签 javascript select for-loop onchange

这里是完整的演示代码: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/

相关文章:

C 套接字 : Avoiding garbage when socket is closed

python - 如何在python中的循环外设置变量

javascript - 检查输入字符串是否包含(有符号)数字

python - 如何在 sqlalchemy 中执行 LIKE 查询?

javascript - 逆转功能或效果

mysql - SQL注入(inject)中insert语句的用法

Javascript for 循环,在比较部分进行赋值

python - 为什么不同的变量名得到不同的结果(python2.7)?

javascript - 使用 css 和 javascript 在 div 背景中创建一个透明窗口

javascript - 为什么这张表没有正确排序?