Javascript event function is called multiple times

I am integrating maps in a webpage using Overlapping Marker Spiderfier on google maps. I have added a marker click listener as shown below.

$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);
        });
    }
};

      

and it works fine, but jshint is giving me an error to execute the function inside the loop. So I changed it to.

$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);
    });
};

      

now when I click on a marker, it opens up to 90 information windows one by one (I have 90 markers in the array). What I am missing.

+3


source to share


1 answer


you add the same listener every time you add a marker (note that the listener does not overwrite previously added listeners).

It is enough to add 1 listener and use 1 InfoWindow (except that you want to open multiple InfoWindow at the same time).

Your first try works as expected because you are overwriting iw

inside the loop.



Possible Solution:

//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/

+3


source







All Articles