2014-12-02 37 views
1

[第一次在stackoverflow。]我试图动态地添加html按钮到我的页面,然后给他们一个JavaScript函数运行时,他们被点击,使用jQuery的点击。我想为数组中的每个元素都有一个按钮,所以我使用了一个for循环。我的代码看起来像这样(简体)迭代jQuery选择器变量,使用闭包

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

(我注射用正确的ID在同一回路的按钮。)此代码,在运行时,控制台日志“测试”的时间正确的号码,但事后,只最后一个按钮在点击时响应“测试”。 (这种情况有点荒谬。)所以,我认为事件处理程序最终只使用了我的最终值来分配事件处理程序。我认为这个问题与闭包有关,但我不确定如何从jQuery Selector中取出一个闭包(通常我不熟悉它们)。相反,作为一种黑客解决方案,我“手动”编写了类似于下面和下面的for循环的代码,并且它按预期工作,因为点击会导致控制台日志。

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

(当然,这一切都更大范围内发生 - 特别是谷歌地图的地方API调用的回调)

首先,我在正确认识这个问题?其次,有什么用?我应该完全采取不同的方法,比如使用.each()?

(我后来想显示的地方属性[I]点击时,我会觉得需要另一个回调 我最后黑客的代码如下所示:

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

它在[这](http://jsfiddle.net/Cerlin/koj2efmg/) – 2014-12-02 05:55:23

+0

[创建循环中关闭精细:一常见的错误](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide /Closures#Creating_closures_in_loops.3A_A_common_mistake) – 2014-12-02 05:56:06

+0

[JavaScript闭合内部循环 - 简单实用示例](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – 2014-12-02 05:56:34

回答

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