2012-02-23 126 views
1

附加一个事件监听器,我需要做这样的事情:对象范围在JavaScript

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

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

+1

可能重复http://stackoverflow.com/questions/1331769/access-outside-variable-in-loop-from -javascript-closure) – davin 2012-02-23 09:47:09

回答

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

+0

+1并不意味着在这一个上面发布相同的答案 – Shea 2012-02-23 10:19:15

+0

我想你错过了大括号? '(function(result){ ... })(results [i]);' – roshanvid 2012-02-23 11:29:16

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); 
    }); 
} 
+0

详细解释这个答案;问题在于“我”在不断变化。 – Shea 2012-02-23 09:39:27

+1

这是行不通的,因为就像'i'改变了一样,'element'也改变了。请参阅解决关闭问题的其他答案。 – davin 2012-02-23 09:44:37

+1

您的代码已损坏。例如,对于两个,存在错字“int”而不是“var”,结果处理程序将始终使用结果数组的最后一个元素作为参数激发“doSomething”函数。看看这里:http://jsfiddle.net/9hTBa/ – WTK 2012-02-23 09:46:15

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]); 
    }) 
} 

如果这样做不起作用...请确保您没有在第E显示了索引相同VARNAME:

for (var i = 0; ...) { 
    for (var i = 0; ...) { 
    } 
} 
[从Javascript闭合外部变量访问环路(的
+0

我很抱歉,我没有意识到WTK已经为此发布了答案。 – Shea 2012-02-23 10:18:11