Google Maps - загрузить окно при нажатии на маркер - PullRequest
2 голосов
/ 31 мая 2009

Я пытаюсь создать карту Google с несколькими маркерами, которая загружает оповещение при нажатии на маркер.

var map = null;
function setupMap() { 

    map = new GMap2(document.getElementById("map")); 
    map.setUIToDefault();
    map.setCenter(new GLatLng( 0, 0 ), 1); 
    map.enableDoubleClickZoom(); 

    // Create the marker icon - will be repeated for each icon but
    // truncated for brevity in example
    var icon1 = new GIcon(G_DEFAULT_ICON);
    icon1.image = "uploads/1.jpg";
    icon1.shadow = "";
    icon1.iconSize = new GSize( 50, 50 );

    var latlng = new GLatLng( 0, 0 );
    markerOptions = { icon:icon1 };     
        marker1 = new GMarker( latlng, markerOptions );
    map.addOverlay( marker1 );
    GEvent.addListener( marker1, "click", loadInfo(1) );    

} 

function loadInfo( a ) {
    alert( a );
}

window.onload = setupMap;

В рабочем примере я передам объект маркера в loadInfo (), а затем загрузлю InfoWindow, но сейчас я просто пытаюсь заставить действие произойти при нажатии маркера. На самом деле происходит загрузка окна с предупреждением (с «1», как и ожидалось), когда загружается карта. Несколько маркеров не загружают несколько блоков предупреждений, и после загрузки исходного блока предупреждений (что мне не нужно) нажатие маркеров ничего не делает.

Любая помощь очень ценится, спасибо!

Ответы [ 4 ]

5 голосов
/ 31 мая 2009

В вашем addListener вызове вы на самом деле звоните loadInfo вместо передачи ссылки на него. Вместо этого попробуйте следующее:

GEvent.addListener( marker1, "click", function() { 
  loadInfo(1); 
});    

Это создаст анонимную функцию, которая обернет ваш метод loadInfo, вызывая метод при выполнении анонимной функции.

В качестве альтернативы, если вы не использовали какие-либо параметры в loadInfo, просто удалите скобки:

GEvent.addListener( marker1, "click", loadInfo);    

При использовании таких ссылок на функции следует помнить о том, в какой области они будут вызываться. Если бы вы использовали ссылку 'this', вы столкнетесь с ситуацией, когда 'this' в функции обратного вызова будет фактически ссылаться не на область, в которой она была создана, а на область, в которой она выполняется, скорее всего, не будет содержать полей или методов, которые вы ожидаете вызвать, что приведет к ошибкам с указанием Undefined. Как указывает Джонатан, вам придется использовать методы call() и apply() для явного связывания, чтобы обеспечить выполнение вашей функции в правильной области.

1 голос
/ 31 мая 2009

loadInfo(1) означает немедленное выполнение этой функции, но вам необходимо передать функцию обратного вызова методу GEvent.addListener (). Для этого вы можете использовать анонимную функцию:

GEvent.addListener( marker1, "click", function() { loadInfo(1) });
1 голос
/ 31 мая 2009

Вы вызываете loadInfo в .addListener, не предоставляя ссылку на него.

GEvent.addListener( marker1, "click", loadInfo(1) );  

попробовать:

function wrap(method) {
    var args = Array.prototype.slice.apply(arguments,1);
    return function () {
         return method.apply(this,args);
    }
}


GEvent.addListener( marker1, "click", wrap(loadInfo,1) );  

см. http://www.alistapart.com/articles/getoutbindingsituations для получения дополнительной информации о привязке аргументов к функциям. также см. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/apply для получения дополнительной информации об очень полезной apply () (также рекомендуется также взглянуть на call ())

0 голосов
/ 21 августа 2009

Даже если GEvent.addListener (marker1, "click", function () { loadInfo (1); }); был использован, я не получаю ссылку на маркер для перехода к следующему

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