【问题标题】:Google Maps API v3 - Markers All Share The Same InfoWindowGoogle Maps API v3 - 标记都共享相同的信息窗口
【发布时间】:2012-03-17 13:32:21
【问题描述】:

我一直在到处挖掘,但我似乎无法弄清楚这一点。这让我疯狂!一般来说,我是 javascript 的新手,所以我不能完全确定可以解决我的问题的翻译。我注意到很多人都有这个问题,但他们似乎都使用了比我更高级(或只是令人困惑)的代码。不管怎样,就这样吧!

我的所有标记共享相同内容的问题一直存在。

function initialize() {
var myOptions = {
    center: new google.maps.LatLng(34.151271, -118.449537),
    zoom: 9,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    mapTypeControl: false,
    streetViewControl: false,
    panControl: false,
    zoomControl: true,
    zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL },
};

var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

setMarkers(map, clubs);

}

var clubs = [
['Poop', 34.223868, -118.601575, 'Dookie'],
['Test Poop', 34.151271, -118.449537, 'Test Business']
];

function setMarkers(map, locations) {
var image = new google.maps.MarkerImage('images/image.png',
    new google.maps.Size(25, 32),
    new google.maps.Point(0,0),
    new google.maps.Point(0, 32)
);
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
for (var i = 0; i < locations.length; i++) {
var club = locations[i];
var myLatLng = new google.maps.LatLng(club[1], club[2]);
var infowindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker({
    position: myLatLng,
    map: map,
    icon: image,
    shape: shape,
    title: club[0],
});
google.maps.event.addListener(marker, 'click', function(){
    infowindow.setContent(club[3]);
    infowindow.open(map, this);
});
}
}

我知道我很糟糕,但请有人帮助我! :P

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 google-maps-markers infowindow


    【解决方案1】:

    问题是因为您正在为循环内的标记单击设置事件侦听器。因此,所有标记最终只能获得最后一个标记的内容。试试这个。创建一个新的全局函数:

    function bindInfoWindow(marker, map, infowindow, html) {
        marker.addListener('click', function() {
            infowindow.setContent(html);
            infowindow.open(map, this);
        });
    } 
    

    然后在你的循环中,替换这个:

    google.maps.event.addListener(marker, 'click', function(){
        infowindow.setContent(club[3]);
        infowindow.open(map, this);
    });
    

    用这个:

    // add an event listener for this marker
    bindInfoWindow(marker, map, infowindow, club[3]); 
    

    【讨论】:

    • 谢谢邓肯!效果很好,修复需要 2 秒。你就是男人!
    • @duncan 非常感谢!
    • 大家好,这个解决方案也对我有用,非常感谢。但是我想了解为什么它以这种方式而不是另一种方式工作?我们仍然在循环中绑定监听器,但是该代码现在被包装在一个函数中。为什么会有任何不同?谢谢!
    • @WPalombini 这样可以确保每个标记的事件侦听器每次都使用您想要显示的文本。另一种方式你仍然为每个标记附加一个事件监听器,但是信息窗口的内容来自club[3] 在你单击标记时所拥有的任何内容。这将是循环结束时的任何内容。
    • 谢谢!找了半天,这个简单的代码也解决了我的问题!
    【解决方案2】:

    设置标记对象(var marker = new ...)时,将这一行:“title: club[0]”更改为“title: club[i]”。是的,只需将 0 更改为 i。

    这应该可以解决问题。

    尝试此链接以获取有关 Google Maps API 的示例教程。

    http://code.google.com/apis/maps/documentation/javascript/tutorial.html

    它应该非常简单和有用。

    【讨论】:

    • 当我尝试将 '0' 替换为 'i' 时,它删除了我的最后一个标记并使它们都变得无用。 “0”指的是我的标记的名称。
    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2013-08-14
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多