У вас будет очень распространенная проблема закрытия в цикле for
. Кстати, Я только вчера ответил на похожий вопрос по этой теме, который вы, возможно, захотите проверить.
Переменные, заключенные в замыкание, совместно используют одну и ту же среду, поэтому к тому времени, когда будет вызван обратный вызов click
, цикл завершит свою работу, а переменная infoWindowContent
останется указывающей на последнее значение, которое было ей присвоено к.
Одним из способов решения этой проблемы является использование большего числа замыканий с использованием фабрики функций:
function makeInfoWindowListener (pMarker, pContent) {
return function() {
InStorePickup.openInfoWindow(pMarker, pContent);
};
}
// ...
for (var i = 0; i < 3; i++) {
// ...
var infoWindowContent = '<div style="font-size: 8pt;">' + city + '...</div>';
google.maps.event.addListener(
marker,
'click',
makeInfoWindowListener(marker, infoWindowContent)
);
}
Это может быть довольно сложной темой, если вы не знакомы с тем, как работают замыкания. Возможно, вам будет интересно ознакомиться со следующей статьей для краткого введения:
UPDATE:
Причина, по которой работает пример jQuery, заключается в том, что функция, которую вы передаете методу each()
, заключает каждую итерацию в свою область видимости. Вы можете практически сделать то же самое в своем простом примере JavaScript:
for (var i = 0; i < 3; i++) {
// each iteration will now have its own scope
(function () {
var infoWindowContent = '<div style="font-size: 8pt;">' + city + '...</div>';
google.maps.event.addListener(marker, 'click', function() {
InStorePickup.openInfoWindow(marker, infoWindowContent);
});
})();
}
2-е ОБНОВЛЕНИЕ:
Обратите внимание, что первый пример также можно переписать, используя анонимную функцию:
for (var i = 0; i < 3; i++) {
// ...
var infoWindowContent = '<div style="font-size: 8pt;">' + city + '...</div>';
google.maps.event.addListener(marker, 'click', (function (pMarker, pContent) {
return function() {
InStorePickup.openInfoWindow(pMarker, pContent);
};
})(marker, infoWindowContent));
}