1

我正在开发一个使用 google maps api 的小型 webapp。

有一次,我想放置标记并将事件侦听器附加到它。

//initialization of infowindow and markers
var points = [];
var infowindow = new google.maps.InfoWindow({
    content: "1234"
});

function addInfoWindow(point){
    infowindow.setContent(point.position + " " + point.title),
    infowindow.open(map, point);
}

这是问题,当我启动标记时

//initialize markers
{% for marker in mapMarkers %}
    points[{{ marker.id }}] = new google.maps.Marker({
        position: new google.maps.LatLng({{ marker.geometry.y }},
            {{ marker.geometry.x }}),
        map: map,
        title: '{{ marker.name }}',
        clickable: true
    });

    //add event llistener for infowindow
    points[{{ marker.id }}].content = "abc"
    //look here!!
    google.maps.event.addListener(points[{{ marker.id }}], 'click',
        addInfoWindow(points[{{ marker.id }}])
    );
{% endfor %}

它会立即显示第一个标记的信息窗口。放置了其他标记,但单击它们不会产生任何变化。

虽然如果我这样做

    google.maps.event.addListener(points[{{ marker.id }}], 'click',
    function(){
        addInfoWindow(points[{{ marker.id }}])
    });

东西工作得很好,信息窗口只在点击标记时出现。

我的问题:为什么需要使用

功能(){}
而不是直接使用 addInfoWindow。我认为这可能是 addInfoWindow 调用全局变量的函数调用问题,但如果是这种情况,显示的信息窗口应该显示来自最后一个标记实例化的信息,对吧?

4

1 回答 1

2

因为您需要将函数分配为单击处理程序-您可以使用...

google.maps.event.addListener(points[{{ marker.id }}], 'click',
function(){
    addInfoWindow(points[{{ marker.id }}])
});

addInfoWindow...因为这将创建一个匿名函数(在其主体中调用)。

但是有了这个...

google.maps.event.addListener(points[{{ marker.id }}], 'click',
    addInfoWindow(points[{{ marker.id }}])
);

...您尝试将调用结果分配为addInfoWindow事件处理程序,而不是函数本身。当然,它不起作用。

于 2012-11-05T03:02:35.800 回答