JavaScript事件函数被多次调用

3

我正在将地图与 Overlapping Marker Spiderfier 集成到谷歌地图的网页上。我在标记上添加了以下点击侦听器。

$scope.setMarkers = function() {
    for (var i = 0; i < $scope.markers.length; i++) {
        $scope.markers[i].setMap($scope.map);
        $scope.oms.addMarker($scope.markers[i]);
        var marker = $scope.markers[i];
        var iw = new google.maps.InfoWindow({
            content: ""
        });
        $scope.oms.addListener('click', function(marker) {
            iw.setContent(marker.desc);
            iw.open($scope.map, marker);
        });
    }
};

我写的代码可以正常运行,但是 jshint 报错了,说在循环体内定义了函数。所以我进行了修改。

$scope.setMarkers = function() {
    for (var i = 0; i < $scope.markers.length; i++) {
        $scope.markers[i].setMap($scope.map);
        $scope.oms.addMarker($scope.markers[i]);
        $scope.addMarkerEventListener(i);
    }
};
$scope.addMarkerEventListener = function(i) {
    var marker = $scope.markers[i];
    var iw = new google.maps.InfoWindow({
        content: ""
    });
    $scope.oms.addListener('click', function(marker) {
        iw.setContent(marker.desc);
        iw.open($scope.map, marker);
    });
};

现在当我点击标记时,它会打开90个信息窗口,一个接一个地显示(我有一个包含90个标记的数组)。我错过了什么。

1个回答

3

每当您添加一个标记时,就会添加相同的侦听器(请注意,侦听器不会覆盖先前添加的侦听器)。

只添加1个侦听器并使用1个信息窗口即可(除非您想同时打开多个信息窗口)。

您的第一次尝试按预期工作,因为您在循环内部覆盖了 iw

解决方案:

//create a single InfoWindow-instance
$scope.iw = new google.maps.InfoWindow();

//add a single click-listener
$scope.oms.addListener('click', function (marker) {
    $scope.iw.close();
    $scope.iw.setContent(marker.desc);
    $scope.iw.open($scope.map, marker);       
});

//the loop
for (var i = 0; i < $scope.markers.length; ++i) {
    $scope.markers[i].setMap($scope.map);
    $scope.oms.addMarker($scope.markers[i]);
}

Demo: http://jsfiddle.net/doktormolle/qoko4425/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接