使用闭包迭代jQuery选择器和变量

时间:2014-12-02 05:38:19

标签: javascript jquery jquery-selectors closures

[第一次在stackoverflow上。]我试图动态地将html按钮添加到我的页面,然后使用jQuery的点击给它们一个javascript函数,当它们被点击时运行。我想为一个数组中的每个元素都有一个按钮,所以我使用了for循环。我的代码看起来像这样(简化)

for (var i = 0; i < results.length; i++) {
    $("#" + place[i].place_id).click(function(){console.log("Test");})        
    $("#" + place[i].place_id).click();
}

(我在同一个循环中注入了具有正确id的按钮。)此代码在运行时,控制台记录&#34;测试&#34;正确的次数,但之后,只有最后一个按钮响应&#34;测试&#34;点击时。 (这种情况有点荒谬。)所以,我认为事件处理程序最终只使用i的最终值来分配事件处理程序。我认为问题与闭包有关,但我不确定如何从jQuery Selector中进行闭包(通常我不熟悉它们)。

相比之下,作为黑客解决方案,我手动&#34;编写如下右下方和for循环之外的代码,它按预期工作,因为单击会导致控制台日志。

$("#" + place[0].place_id).click(function(){console.log("Test"););
$("#" + place[1].place_id).click(function(){console.log("Test");});
etc.

(当然,这一切都发生在更大的背景下 - 特别是Google Maps Places API调用的回调。)

首先,我是否正确理解了这个问题?第二,什么会起作用?我应该采取不同的方法,比如使用.each()?

(我以后想点击时显示place [i]的属性,我认为需要另外一个回调 我的最终黑客代码如下所示:

$("#" + place[0].place_id).click(function(){google.maps.event.trigger(placeMarkers[0], "click"); repeated 20 times

1 个答案:

答案 0 :(得分:1)

为此,您可以在for循环中创建一个自执行函数,如下所示:

for (var i = 0; i < results.length; i++) {
    (function(index) {
        $("#" + place[index].place_id).click(function() { 
            //Do something with place[index] here 
        });
    })(i);
}