在javascript中附加事件侦听器时的对象范围

时间:2012-02-23 09:29:56

标签: javascript jquery

我需要做这样的事情:

for(int i =0; i< results.length; i++){
    $('ul').append('<li>'+results[i].name+'</li>').bind('click',function(){
        doSomething(results[i]);
    })
}  

但是当点击发生时,传递给doSomething的对象是未定义的。我该如何解决这个问题?

3 个答案:

答案 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; ...) {
    }
}