Google Maps API v3. Передача значений в функцию Listener (), чтобы при нажатии на маркер образовался круг? - PullRequest
3 голосов
/ 30 апреля 2011

Я хочу сформировать круг вокруг маркера при нажатии на маркер!

Итак, слушатель добавлен в маркер, и функция должна действовать на круг.

Вот мойКод:

   for(var j=0;j<lat.length;j++)
            {
                var pos = new google.maps.LatLng(lat[j],lng[j]);
                var marker_options = {position: pos, map:map, draggable:false};
                marker[j] = new google.maps.Marker(marker_options);
                circle_option = {strokeColor:"#FF0000",strokeOpacity:0.8,strokeWeight:2,fillColor:"#FF0000",fillOpacity:0.35,map:null,center:pos,radius:500};
                circle[j] = new google.maps.Circle(circle_option);
                google.maps.event.addListener(marker[j], 'click', function() {circle[j].setMap(map);});  // Error : circle[j] is undefined
            }

Ошибка: кружок [j] не определен ??(В строке event.addListener!)

Почему .. это должно быть там определено?

Как это сделать правильно?Пожалуйста, помогите!

1 Ответ

10 голосов
/ 30 апреля 2011

У вас проблема с закрытием j.Когда ваша функция вызывается, j будет ссылаться на последнее значение, которое j имело в цикле for.Таким образом, j будет lat.length, что больше, чем circle.Решение состоит в том, чтобы принудительно вычислять j при генерации функции обратного вызова:

function make_callback(circle, map) {
    return function() {
        circle.setMap(map);
    };
}

, а затем в цикле:

google.maps.event.addListener(marker[j], 'click', make_callback(circle[j], map));

Заключение процесса генерации обратного вызова в отдельную функциюдаст вам значение circle[j] в момент вызова make_callback, а не значение при вызове обратного вызова.

j - это ссылка на значение, значение, на которое оно указываетзависит от того, когда вы спросите j, каково его значение.Когда вы связываете функцию следующим образом:

google.maps.event.addListener(marker[j], 'click', function() { something(j); });

Анонимная функция не спрашивает j, каково ее значение, до тех пор, пока функция не будет вызвана, функция просто запоминает, что она собирается использовать j,Когда функция обратного вызова выполняется, она запросит j его текущее значение и будет использовать его.Это означает две вещи:

  • Все обратные вызовы, которые вы связали в этом цикле, будут использовать то же значение j.
  • j будет lat.length, так как этопоследнее значение, которое j было присвоено во время цикла.

Используя функцию make_callback для построения обратных вызовов, мы запрашиваем j его значение в то время, когда мы находимсяпривязка обратного вызова.Это просто стандартная уловка, заставляющая j вычисляться, когда она имеет желаемое значение.

...