附加一个事件监听器,我需要做这样的事情:对象范围在JavaScript
for(int i =0; i< results.length; i++){
$('ul').append('<li>'+results[i].name+'</li>').bind('click',function(){
doSomething(results[i]);
})
}
但是当点击发生时,传递给DoSomething的对象是不确定的。我该如何解决这个问题?
附加一个事件监听器,我需要做这样的事情:对象范围在JavaScript
for(int i =0; i< results.length; i++){
$('ul').append('<li>'+results[i].name+'</li>').bind('click',function(){
doSomething(results[i]);
})
}
但是当点击发生时,传递给DoSomething的对象是不确定的。我该如何解决这个问题?
results[i]
只有有效的变量在时间机器是for
循环内,以后,触发事件处理程序时,result[i]
是不确定的。
这就是为什么你需要确保results[i]
得到保存作为一个函数的上下文中的变量。
for(var i=0; i< results.length; i++){
(function(result) {
$('<li>'+result.name+'</li>').appendTo($('ul')).bind('click',function(){
doSomething(result);
})
})(results[i]);
}
这里的工作示例http://jsfiddle.net/T9aUq/。首先,点击处理程序绑定到匹配$('ul')的元素而不是新的li元素(因为append()
jQuery的函数。不返回附加元素,而是坚持以前的范围(这是ul
)
先保存你的元素!
for(var i =0; i< results.length; i++){
var element = results[i];
var li = $('<li/>').html(element.name);
$('ul').append(li);
li.click(function(){
doSomething(element);
});
}
我居然遇到了最近这个同样的问题...傻是对的,但是这些变量需要某种形式的封装:
for(var i =0; i< results.length; i++) doThisFirst(i);
function doThisFirst(index) {
$('ul').append('<li>'+results[index].name+'</li>').bind('click',function(){
doSomething(results[index]);
})
}
如果这样做不起作用...请确保您没有在第E显示了索引相同VARNAME:
for (var i = 0; ...) {
for (var i = 0; ...) {
}
}
[从Javascript闭合外部变量访问环路(的
我很抱歉,我没有意识到WTK已经为此发布了答案。 – Shea 2012-02-23 10:18:11
可能重复http://stackoverflow.com/questions/1331769/access-outside-variable-in-loop-from -javascript-closure) – davin 2012-02-23 09:47:09