我正在使用数据库来获取不同的位置,这些位置将在Google地图上设置为标记。我正在使用JavaScript来为所有这些动态加载的标记设置事件侦听器,但是我对此有一个疑问:
var markerCollection = [];
//pushing data into the array...
for ( var j = 0; j < markerCollection.length; j++) {
console.log(j + ' ' + markerCollection[j].shopId);
$.proxy(google.maps.event.addListener(markerCollection[j].gmapMarker, "click", function(e) {
console.log(markerCollection[j].shopId);
}),this);
}
该代码告诉我
markerCollection[j]
是未定义的。但是,如果我输入一种硬编码方式(markerCollection [0]),它将起作用。为什么会发生这种情况,我该如何解决? 最佳答案
注释之一中链接的答案中的代码比需要的复杂。有一种更简单的方法可以更容易理解:
var markerCollection = [];
//pushing data into the array...
for ( var j = 0; j < markerCollection.length; j++) {
addMarker( markerCollection[j] );
}
function addMarker( marker ) {
console.log( marker.shopId );
google.maps.event.addListener( marker.gmapMarker, "click", function(e) {
console.log( marker.shopId );
});
}
这就是您真正需要的。每次调用
addMarker()
函数时,对该函数的调用都有其自己的marker
变量,该变量引用markerCollection
数组中的元素之一。并且marker
变量在以后响应单击而调用侦听器回调时仍然有效。它的作用与更复杂的版本相同,但我认为它更容易理解。注意
addMarker
中的代码如何使用marker
变量,而不必每次都说markerCollection[i]
。另外,除非需要传递
$.proxy()
值,否则不需要this
位,在此不使用该值。因此,如果您不需要它,请忽略它。越简单越好!