【问题标题】:google maps api multiple markers with info windows谷歌地图 api 带有信息窗口的多个标记
【发布时间】:2012-02-02 12:03:26
【问题描述】:

刚刚开始使用 google maps API。

我正在尝试在地图上绘制几个标记。完毕。但是,我正在为每个标记回收一个变量/对象。

我最初使用选项创建标记并添加到地图,然后采用相同的标记变量,重新调整它的用途,然后再次将其添加到地图。这确实会产生两个带有单独标题标签的独特标记。

我想为每个标记显示一个信息窗口,但我不知道什么是最好的方法。我还看到一个问题标志弹出,将点击事件分配给每个标记,因为我使用相同的变量来添加每个标记,我不确定如何将其点击事件添加到唯一标记(按名称,因为名称是两者都一样,因为它从不接收任何 id?)

var marker_obj = new google.maps.Marker({
    position: myLatlng,
    title:"This is Marker 1",
});

marker_obj.setMap(map);

marker_obj = new google.maps.Marker({
    position: myLatlng,
    title:"This is Marker 2",
});

marker_obj.setMap(map);

为了创建信息窗口,我考虑使用一个变量/对象来保留信息窗口,然后在每个标记单击事件中使用新文本重新调整它的用途。

我的问题是:

1:我应该为每个标记(开销?)使用单独的唯一变量/对象,如果不是,我如何识别它的点击事件。

2:是否可以在信息窗口对象弹出之前用新文本重新调整(重新分配)它的用途,或者我应该为每个标记创建一个唯一的信息窗口?

我有点Java n00b,所以任何帮助将不胜感激。

【问题讨论】:

    标签: google-maps google-maps-api-3


    【解决方案1】:

    你在正确的路线上。拥有一个 infowindow 对象,就像拥有一个标记对象一样。然后信息窗口的内容会根据您单击的标记而变化。需要注意的一件事(如果您在循环中创建标记也会发生这种情况),危险在于所有信息窗口都以最后一个的内容结束。所以让我们创建一个更新内容的新函数。

    另外,顺便说一句,您不必在标记对象上调用 setMap() 函数,只需在创建标记时传递的选项中指定地图属性即可。

    var infowindow = new google.maps.InfoWindow({
        content: ''
    });
    
    var marker_obj = new google.maps.Marker({
        position: myLatlng,
        title:"This is Marker 1",
        map: map
    });
    
    bindInfoWindow(marker_obj, map, infowindow, 'Marker 1');
    
    marker_obj = new google.maps.Marker({
        position: myLatlng,
        title:"This is Marker 2",
        map: map
    });
    
    bindInfoWindow(marker_obj, map, infowindow, 'Marker 2');
    

    然后是一个新函数:

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

    【讨论】:

    • 嘿,感谢代码和解释。您的代码破坏了第二个标记...。显示第一个,而不是没有信息窗口,第二个标记消失了..如果我删除 bindInfoWindow(marker_obj, map, infowindow, 'Marker 1');线条,两个标记都显示......有什么想法吗?附:有没有一个不错的在线 IDE 或者可以帮助我格式化我的 java 代码块等的东西?
    • infowindow 未定义 [Break On This Error] bindInfoWindow(marker_obj, map, infowindow, 'This is info for marker 1');
    • 您是否记得并在调用该函数之前放入了第一位,var infowindow = ...?记住 Javascript 是区分大小写的
    • 是的,哈哈,上面没有贴花……现在像魅力一样工作!!!,谢谢伙计。 P.s.,我打算动态构建jave脚本,然后在运行时将其注入/添加到页面中。我主要在 asp.net 中进行开发,并想用 200 个标记创建整个长 java 脚本,然后将脚本传递到页面......我应该注意哪些主要反对意见?
    • 如果你正在做 200 个标记,我会说在 javascript 中编写一个循环来创建标记并调用 bindInfoWindow 函数。循环应该在您的 ASP.net 作为 javascript 变量创建的数组或结构上。这应该确保您的 Javascript 更简洁。
    【解决方案2】:

    创建全局信息窗口对象。 var infowindow = new google.maps.InfoWindow();

    并为您的全局标记添加监听器。

    google.maps.event.addListener(marker, "click", function (e) {
                infowindow.setContent("set marker specific content here");
                infowindow .open(map, this);
            });
    

    【讨论】:

    • 嗨,我添加了 var infowindow = new google.maps.infowindow();就在我的地图 obj decleration 下方,但错误信息窗口不是构造函数
    • 那是因为Javascript是区分大小写的,应该是InfoWindow而不是infowindow
    • 谢谢小伙子,第一个示例可以正常工作,也会测试你的,谢谢。
    • 好的,这个选项也有效...谢谢。那么两者中哪一个更好/更有效?
    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多