【发布时间】:2010-09-25 09:33:15
【问题描述】:
我正在处理一些我从别人那里接手的 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);
}
但是,当为 <select> 元素触发 onchange 事件时,似乎对于表中的每个 <select> 都将相同的值传递给 onStatusChanged() 方法(我已经在每个循环的迭代,callid 和 anotherid 被赋予新的、不同的值)。
我怀疑这是因为我使用select.onchange = function() 语法设置事件处理程序的性质。如果我理解它是如何正常工作的,那么这个语法将 onchange 事件的闭包设置为一个引用这两个引用的函数,这最终具有在循环的最后一次迭代中设置的任何值的最终值。当事件触发时,callid 和 anotherid 引用的值是上一次迭代中设置的值,而不是单个迭代中设置的值。
有没有办法可以复制我传递给onStatusChanged()的参数值?
我已更改标题以更好地反映问题和接受的答案。
【问题讨论】:
标签: javascript dom loops closures