Проблема с закрытием маркеров Слушателя и Карт Google - PullRequest
3 голосов
/ 24 февраля 2010

Я хочу добавить событие Listener к каждому сгенерированному маркеру, чтобы при нажатии на маркер вы перенаправлялись на постоянную ссылку. С кодом ниже значение постоянной ссылки одинаково для каждого маркера (оно получает последнее значение). Я читал о проблемах с закрытием, и это, похоже, то, что я имею. Я не совсем понимаю примеры, на которые смотрел.

Может ли кто-нибудь взглянуть на мой код и указать мне правильное направление? Любая помощь с благодарностью!

downloadUrl("http://localhost/map/generatexml.php", function(data) {
            var xml = parseXml(data);
            var markers = xml.documentElement.getElementsByTagName("marker");
            for (var i = 0; i < markers.length; i++) {
              var permalink = markers[i].getAttribute("permalink");
              var point = new google.maps.LatLng(
                  parseFloat(markers[i].getAttribute("lat")),
                  parseFloat(markers[i].getAttribute("lng")));
              var marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
              google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
            }

Ответы [ 3 ]

11 голосов
/ 24 февраля 2010

Попробуйте это:

for (var i = 0; i < markers.length; ++i) {
  // ... like what you have already ...
  (function(permalink) {
    google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
  })(permalink);
}

Создавая новую лексическую область видимости с копией значения «постоянная ссылка» на каждой итерации, ваши обработчики должны работать лучше.

2 голосов
/ 24 февраля 2010

JavaScript имеет только область действия функции, поэтому, когда вы объявляете var в середине цикла for, вы фактически объявляете их только один раз для всей функции. Первое, что вы должны сделать, это перенести все объявления var наверх, чтобы понять, что происходит:

downloadUrl("http://localhost/map/generatexml.php", function(data) {
            var xml = parseXml(data);
            var markers = xml.documentElement.getElementsByTagName("marker");
            var i, permalink, point, marker;
            for (i = 0; i < markers.length; i++) {
              permalink = markers[i].getAttribute("permalink");
              point = new google.maps.LatLng(
                  parseFloat(markers[i].getAttribute("lat")),
                  parseFloat(markers[i].getAttribute("lng")));
              marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
              google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
            }

Ваша функция щелчка будет использовать окончательное значение постоянной ссылки для каждого события маркера, поскольку постоянная ссылка заменяется новым значением каждый раз при цикле цикла for.

Редактировать: Так что да, Пойнти побил меня, чтобы я на самом деле решил вашу проблему. Но там у вас есть, по крайней мере, объяснение проблемы

1 голос
/ 28 февраля 2014

Мы должны использовать замыкания для решения этой проблемы

Используйте приведенный ниже фрагмент кода для добавления информационного окна к маркеру

function AddInfoWidnow(marker,message)
{
     var infowindow = new google.maps.InfoWindow({ content: message });

     google.maps.event.addListener(marker, 'click', function() {

     infowindow.open(marker.get('map'), marker);

    }); 

}

Чтобы увидеть рабочий образец см. здесь

...