Google maps infowindow showing on wrong marker

后端 未结 5 535
失恋的感觉
失恋的感觉 2020-12-30 02:40

I have a piece of javascript code where I create markers and attach InfoWindows to them, like this:

for (var i = 0; i < 8; i++) {
    var marker = new goo         


        
相关标签:
5条回答
  • 2020-12-30 02:55
    for (var i = 0; i < 8; i++) {
        var marker = new google.maps.Marker({
           map: map,
           position: new google.maps.LatLng(lat[i], lng[i]),
           icon: '/static/images/iconsets/gmap/iconb' + (i+1) + '.png',
           content: 'test string'
        });
        google.maps.event.addListener(marker, 'click', function() {
            new google.maps.InfoWindow({
                content: this.content
            }).open(map, this);
        });
    }
    
    0 讨论(0)
  • 2020-12-30 03:03

    As a new option that was not available 7 years ago:

    all modern browsers (which is all browsers supporting ECMAScript 6) support block scoped variables which are defined using the let statement. let initializes a variable inside of a given scope e.g. inside of a loop whereas var defines variables on global or function level. In your case exchanging the var with let will make sure that each marker is properly initialized as a new variable:

    for (var i = 0; i < 8; i++) {
        let marker = new google.maps.Marker({
           map: map,
           position: new google.maps.LatLng(lat[i], lng[i]),
           icon: '/static/images/iconsets/gmap/iconb' + (i+1) + '.png',
        });
        let infowindow = new google.maps.InfoWindow({
            content: 'test string'
        });
        google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map,marker);
        });
    }
    
    0 讨论(0)
  • 2020-12-30 03:03

    Try this:

            // Create a marker for each place.
             marker = new google.maps.Marker({
                 map: map,
                 icon: icon,
                 title: place.name,
                 animation: google.maps.Animation.DROP,
                 position: place.geometry.location
             });
             var infowindow = new google.maps.InfoWindow({
             content:'<div><strong>' + place.name + '</strong><br>' +
                'Place ID: ' + place.place_id + '<br>' +
                place.formatted_address + '</div>'
                });
            marker.addListener('click', function() {
            infowindow.open(map, this);
            });
    

    Thank you

    0 讨论(0)
  • 2020-12-30 03:12

    There's a very simple solution to your problem, which is to put the loop's code into a function. Your problem is that you overwrite the variable marker, so that when it is accessed in the click event, it uses the latest version of that variable, which is the last marker you added.

    So, when you put it into a function, the variable is in a separate namespace and therefore not overwritten. In other words, this should work:

    for (var i = 0; i < 8; i++) {
        createMarker(i);
    }
    
    function createMarker(i) {
        var marker = new google.maps.Marker({
            map: map,
            position: new google.maps.LatLng(lat, lng),
            icon: '/static/images/iconsets/gmap/iconb' + (i+1) + '.png',
        });
        var infowindow = new google.maps.InfoWindow({
            content: 'test string'
        });
        google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map,marker);
        });
    }
    
    0 讨论(0)
  • google.maps.event.addListener(Marker, 'click', function() {
        InfoWindow.open(map, this);
    });
    

    You shoud use this instead of marker because marker will hold the value of last placed marker.

    0 讨论(0)
提交回复
热议问题