javascript - Javascript 循环内的事件处理程序 - 需要闭包吗?

标签 javascript dom loops closures

我正在使用从其他人那里接管的一些 html 和 Javascript 代码。该页面每十秒重新加载一个数据表(通过异步请求),然后使用一些 DOM 代码重新构建该表。有问题的代码看起来像这样:

var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function() {
        onStatusChanged(select, callid, anotherid);
    };
    td.appendChild(select);
}

onchange<select> 触发事件然而,似乎相同的值被传递给了 onStatusChanged()。每个 <select> 的方法在表中(我已经验证在循环的每次迭代中,callidanotherid 都被赋予了新的、不同的值)。

我怀疑这是因为我设置事件处理程序的方式的性质,使用 select.onchange = function()句法。如果我理解这是如何正常工作的,那么这个语法将 onchange 事件的闭包设置为一个函数,它引用这两个引用,最终的最终值是它们在循环的最后一次迭代中设置的值。当事件触发时,callid 引用的值和 anotherid是上次迭代时设置的值,不是单次迭代时设置的值。

有没有办法可以复制传递给 onStatusChanged() 的参数值? ?

我更改了标题以更好地反射(reflect)问题和已接受的答案。

最佳答案

你确实需要在这里实现一个闭包。这应该工作(让我知道 - 我没有测试它)

var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function(s,c,a)
    {
        return function()
        {
            onStatusChanged(s,c,a);
        }
    }(select, callid, anotherid);
    td.appendChild(select);
}

关于javascript - Javascript 循环内的事件处理程序 - 需要闭包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/341723/

相关文章:

R - 如何将这个嵌套的 for 循环转换为可以改变列表的 lapply 函数

javascript - Ajax Form 和 Django 集成发布错误

javascript - 移动div时计算x值

javascript - 通过 javascript 删除 html 元素样式

javascript - document.getElementById 为 null

php - 检查 php 上的空字段

java - Swing 选项条件

Javascript:| 有什么区别?和||?

javascript - 按 F5 后首先触发 Youtube iframe API

javascript - 如何使用 Javascript 和 Dom 克隆元素并在多个地方使用它