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

Jam*_*man 2 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;
Run Code Online (Sandbox Code Playgroud)

在工作示例中,我将标记对象传递给loadInfo(),然后加载InfoWindow,但是现在,我只是尝试在单击标记时执行操作.实际发生的是当地图加载时正在加载警报框(其中包含"1").多个标记不会加载多个警报框,并且在加载初始警报框后(我不想要)单击标记不会执行任何操作.

非常感谢任何帮助,谢谢!

Ros*_*han 5

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

GEvent.addListener( marker1, "click", function() { 
  loadInfo(1); 
});    
Run Code Online (Sandbox Code Playgroud)

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

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

GEvent.addListener( marker1, "click", loadInfo);    
Run Code Online (Sandbox Code Playgroud)

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