我正在Google地图上的重叠标记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个标记)。我错过了什么。
答案 0 :(得分:3)
每次添加标记时都添加相同的侦听器(请注意,侦听器不会覆盖以前添加的侦听器)。
添加1个侦听器并使用1个InfoWindow就足够了(除了你想让多个InfoWindow同时打开)。
您的第一次尝试按预期工作,因为您在循环内覆盖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]);
}