Динамическое добавление слушателей к маркерам Google Maps - PullRequest
7 голосов
/ 03 августа 2009

Я работаю над страницей, которая выбирает код с помощью Javascript httpObject и использует его для обновления двух элементов на странице - карты Google и DIV, в котором перечислены элементы, на которые указывает маркер.

Этот бит отлично работает. Проблема в том, что когда я создаю маркеры, я делаю это через цикл for и добавляю слушатели к маркеру в каждом цикле. Затем, когда я проверяю страницу, я обнаруживаю, что то же самое происходит с каждым маркером.

При наведении курсора на маркер должен изменить цвет границы соответствующего бита DIV. Вместо этого каждый маркер меняет границу последнего бита. Кажется, что каждый раз, когда я добавляю слушателей, я также перезаписываю слушателей ранее добавленных маркеров.

Я понял, что это связано с тем, что API Карт Google сохраняет идентификатор маркера даже при создании нового в Javascript. Что я не понимаю, как обойти это - я попытался создать массив вне цикла, и изменив

var newMarker = new GMarker(newLatLng);

с newMarker [count] = новый GMarker (newLatLng);

но все равно не работает.

Помогите мне, StackOverflow. Ты моя единственная надежда. :)

Редактировать: немного больше кода

for (count=0;count<=LatArray.length;count++)
{
  thisLat = LatArray[count];
  thisLong = LongArray[count];
  thisHTML = HTMLArray[count];
  newLatLng = new GLatLng(thisLat, thisLong, true);

  if (mapBounds.containsLatLng(newLatLng))
  {
      //alert(count);
      var  dinnerNumber = "dinner_"+count;
      newMarkers[count] = new GMarker(newLatLng); 
      map.addOverlay(newMarkers[count]);
      GEvent.addListener(newMarkers[count],'mouseover',function(){document.getElementById(dinnerNumber).style.borderColor = '#000000';
  });
}// for

Ответы [ 2 ]

7 голосов
/ 03 августа 2009

Проблема закрытия - все эти слушатели используют одну и ту же переменную dinnerNumber. Попробуйте это:

GEvent.addListener(newMarkers[count], 'mouseover', (function(dinnerNumber){ return function(){document.getElementById(dinnerNumber).style.borderColor = '#000000';}; })(dinnerNumber));

Таким образом, каждый слушатель создается со своей собственной закрытой копией DinnerNumber.

1 голос
/ 22 февраля 2010

Вы должны внимательно прочитать

GEvent.addListener(newMarkers[count], 'mouseover', 
       (function(dinnerNumber)
          { return function()
                { document.getElementById(dinnerNumber).style.borderColor = '#000000';};        
          }
      )(dinnerNumber)
);

вы пропустили один ();

3-й параметр (function (var) {return function () {// что вы хотите с var;};}) (var)

...