【问题标题】:List of generated event listeners only triggers last one生成的事件监听器列表仅触发最后一个
【发布时间】:2014-04-09 14:45:34
【问题描述】:

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

【问题讨论】:

    标签: javascript select for-loop onchange


    【解决方案1】:

    这是因为您绑定到change 的处理程序不会立即运行,而是稍后运行。与此同时,您的for 循环已经运行,slottime 已反弹到其最终值(您创建的最后一个&lt;select&gt; 元素)。所有处理程序只会看到该值。

    您可以引入一个闭包,以便处理程序可以访问正确的元素:

    document.getElementById("slots").appendChild(slotlist);
    (function(slottime) {
        slottime.addEventListener("change", function() {
            alert(slottime.id);
        });
    })(slottime);
    

    正如 Teemu 在 cmets 中所说,最简单的解决方案是利用 this 绑定到处理程序内的目标元素这一事实:

    slottime.addEventListener("change", function() {
        alert(this.id);
    });
    

    【讨论】:

    • 在事件处理函数中使用this.id会不会简单很多?
    • @Teemu,是的,但是这样做并不能向提问者解释根本问题:) 不过,我会将其添加到我的答案中。
    • 我对闭包不太熟悉,所以会做一些研究:)。但代码似乎有效。非常感谢!
    • 你为什么在这里使用这个??..这对应什么..哪个全局对象?是时隙吗?..
    【解决方案2】:

    您必须使用以下警报参数:

    alert(this.getAttribute('id'));
    

    【讨论】:

    • 你为什么在这里使用这个??..这对应什么..哪个全局对象?是时隙吗?
    • 当您调用函数时,它将在调用函数时使用变量 slottime 的值,而不是在创建时...您必须获取元素的 id调用函数并为此你应该使用这个
    • 对应调用函数的元素,如果你打开浏览器的开发工具查看元素可以看到元素的id
    • 你没有正确回答问题兄弟..我在这种情况下问的是 $this 对应于变量 slottime..这里 slottime 调用函数...
    • 没有变量$this,有$(this)返回调用元素对应的jQuery元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2017-01-08
    相关资源
    最近更新 更多