Почему обработчик javascript должен быть присоединен в другой функции? - PullRequest
0 голосов
/ 04 ноября 2011

В коде, доступном здесь: https://gist.github.com/1338861

если бы я включил код функции function attachEvent (marker) {...} в тело функции функция addResults (json) {...}

как это:

    function addResults(json) {
    if (json.results && json.results.length) {
        for (var i = 0, placemark; placemark = json.results[i]; i++) {
            var pos = new google.maps.LatLng(parseFloat(placemark.point.latitude, 10),
                    parseFloat(placemark.point.longitude, 10));
            var marker = new google.maps.Marker({
                  map: map,
                  title : placemark.name,
                  position: pos
                });

            google.maps.event.addListener(marker, 'click', function(){
                    var text = marker.getTitle();
                showInContentWindow(text);

                profileMarkers.push(marker);                            
        }
    }       
}

в результате при нажатии на любой маркер с карты в окне содержимого будет отображаться только информационная характеристика последнего маркера, добавленного в массив profileMarkers (вместо информации о клике по маркеру). *

Мой вопрос: почему прослушиватель onclick для маркера должен быть присоединен в другой функции (в этом контексте attachEvent)?

1 Ответ

0 голосов
/ 04 ноября 2011

Поскольку вы продолжаете изменять marker на последний, продолжая цикл. Попробуйте это:

(function(mkr) {
    google.maps.event.addListener(marker, 'click', function(){ 
        var text = mkr.getTitle();
        showInContentWindow(text);
        profileMarkers.push(mkr);
    }
})(marker);

Вместо текущего кода google.maps.event.addListener. Это создаст замыкание и эффективно «исправит» значение переменной.

...