我需要做这样的事情:
for(int i =0; i< results.length; i++){
$('ul').append('<li>'+results[i].name+'</li>').bind('click',function(){
doSomething(results[i]);
})
}
但是当点击发生时,传递给doSomething的对象是未定义的。我该如何解决这个问题?
答案 0 :(得分:3)
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
)。
答案 1 :(得分:0)
首先保存你的元素!
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);
});
}
答案 2 :(得分:0)
我最近遇到了同样的问题......傻是对的,但变量需要某种形式的封装:
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]);
})
}
如果这不起作用...确保在循环内没有循环,并且索引具有相同的varname:
for (var i = 0; ...) {
for (var i = 0; ...) {
}
}