Google地图 - 点击标记时加载窗口

时间:2009-05-31 15:28:20

标签: javascript google-maps

我正在尝试创建一个包含多个标记的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 个答案:

答案 0 :(得分:5)

addListener调用中,您实际上是在调用loadInfo而不是传递对它的引用。请尝试以下方法:

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

这将创建一个匿名函数,它包装你的loadInfo方法,在执行匿名函数时调用该方法。

或者,如果您没有在loadInfo中使用任何参数,只需删除括号也可以使用:

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

使用此类函数引用时值得记住的是调用它的范围。如果您要使用'this'引用,您将遇到回调函数中'this'实际上不会引用它的创建范围的情况,而是涉及其中的范围。它正在执行,很可能不会包含您希望调用的字段或方法,从而导致错误显示Undefined。正如Jonathan指出的那样,您必须使用call()apply()方法明确绑定,以确保您的函数在正确的范围内执行。

答案 1 :(得分: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以获取有关非常有用的apply()的更多信息(也建议您查看call())

答案 2 :(得分:1)

loadInfo(1)表示立即执行此函数,但您需要将回调函数传递给GEvent.addListener()方法。为此,您可以使用匿名函数:

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

答案 3 :(得分:0)

即使GEvent.addListener(marker1,“click”,function(){   loadInfo(1); });  使用过,我没有得到下一步移动标记的链接