2009-05-31 3 views
2

여러 마커가있는 Google지도를 만들려고합니다. 마커를 클릭하면 경고가로드됩니다. 작업의 예에서 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()에 마커 개체를 전달하고 정보창을로드,하지만 지금, 난 그냥 마커를 클릭 할 때 발생하는 동작을 얻으려고합니다. 실제로 일어나는 일은지도가로드 될 때 경고 상자가로드되는 것입니다 (예상대로 '1'이 표시됨). 여러 마커는 여러 개의 경고 상자를로드하지 않으며 초기 경고 상자가로드 된 후 마커를 클릭해도 아무 것도하지 않습니다.

도움을 주셔서 감사합니다.

답변

5

, 당신은 실제로 loadInfo를 호출하는 대신 그것을 참조를 전달하고 있습니다. 다음 대신보십시오 :

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

이것은 당신의 loadInfo 방법을 랩하는 익명 함수를 만들 것이다, 익명 함수가 실행될 때 메소드를 호출. 당신이 loadInfo에서 매개 변수를 사용하지 않은 경우

또는, 단순히 괄호를 제거하는 것은 너무 일 것입니다 : 같은 함수 참조를 사용할 때 염두에두고 가치

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

뭔가가있을 것입니다있는 범위입니다 라는. 'this' 참조를 사용하려면 콜백 함수 내의 'this'이 실제로 생성 된 범위를 참조하지 않고 실행되는 범위 내에서 실행될 가능성이있는 상황으로 실행됩니다. 호출 할 필드 또는 메서드가 포함되어 대신 Undefined이라는 오류가 발생합니다. Jonathan이 지적한 것처럼 call()apply() 메서드를 사용하여 함수가 올바른 범위 내에서 실행되도록 명시 적으로 바인딩해야합니다.

1

.addListener에서 loadInfo를 호출하고 참조를 제공하지 않습니다.

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를 참조 (또한 당신이 전화를 보면 권장()뿐만 아니라) 당신의 addListener 호출에

1

loadInfo(1)은이 함수를 즉시 실행하지만 GEvent.addListener() 메서드에 콜백 함수를 전달해야한다는 것을 의미합니다. 이를 위해, 당신은 익명 함수를 사용할 수 있습니다

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

비록 GEvent.addListener (MARKER1, 기능을 "클릭"() { loadInfo (1) }); 을 사용 했으므로 다음 이동 표식으로 연결되는 링크가 없습니다.

관련 문제