Ручной обход массива JavaScript работает, но по циклу не - PullRequest
1 голос
/ 16 сентября 2010

Я помещаю маркеры карт Google в массив, и все работает нормально, когда я делаю это вручную:

var m =[];

   m[0] = new google.maps.Marker(.....

   google.maps.event.addListener(m[0], 'click', function() 
   {
    alert('Markerklik');
    $("#trasa").append(m[0].getPosition().toString()+"<br>");
   });  

   m[1] = new google.maps.Marker( .....

   google.maps.event.addListener(m[1], 'click', function() 
   {
    alert('Markerklik');
    $("#trasa").append(m[1].getPosition().toString()+"<br>");
   }); 

Но если я захочу зацикливаться на:

    for ( var i=0 ; i<2; i++ )
{
// do the same with m[i]
}

Я получаю m [i] не определено при нажатии на маркер (m [i] .getPosition ()).

Любые предложения, как сделать это автоматически с циклом?

Обратите внимание, что если я поместил маркер в переменную temp, добавлю слушателя в temp и сделаю m.push (temp); в цикле - нажатие на любой маркер дает мне позицию последнего добавленного маркера.

Это похоже на то, что добавление события в m [i] даже не проверяет значение i, оно не ищет, например, m [1], но что-то вроде переменной "named" m [i]

если я делаю весь код вручную с помощью m [0] и m [1] - все работает нормально, есть события, связанные с m [0] и m [1], но создаются маркеры с циклом for с m [i ] выглядит как событие привязки не к m [0], а после одного цикла m [1], но добавляет событие к «m [i]», когда i это просто буква i , а не значение i

Хорошо, похоже, этот код из ответа работает :

for (var i=0 ; i<2; i++ ) 
  {
   (function(x) {
    m[x] = new google.maps.Marker( {
     position: getRandomPoint(),
     title: 'Mojmarkers'
    });

    google.maps.event.addListener(m[x], 'click', function() {
     alert('Markerklik');
     $("#trasa").append(m[x].getPosition().toString()+"<br>");
    }); 

    return m[x];
   })(i);
  }

Кто-нибудь может объяснить, почему это необычное решение работает так, как я хочу?

Ответы [ 4 ]

2 голосов
/ 16 сентября 2010

Вы можете попробовать этот код ниже, это может быть проблема с закрытием памяти.

for (var i=0 ; i<2; i++ ) {
    (function(i) {
        m[x] = new google.maps.Marker(.... ;
        return  google.maps.event.addListener(m[x], 'click', function() {
            alert('Markerklik');
            $("#trasa").append(m[x].getPosition().toString()+"<br>");
         });
    })(x);
}
1 голос
/ 16 сентября 2010

Что произойдет, если вы создадите объект маркера в отдельной функции, которая возвращает маркер, добавите к нему прослушиватель событий в функции создания, а затем поместите этот объект в массив вне функции?

0 голосов
/ 16 сентября 2010

Попробуйте использовать

m.push(new google.maps.marker...);

А затем, как упоминает Пранай, используйте свойство length и просматривайте массив m.

0 голосов
/ 16 сентября 2010

Попробуйте удалить var из оператора for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...