2

我目前有一堆标记,我将它们存储在一个数组中以跟踪它们。当我单击特定链接时,它会打开该标记的信息窗口。有没有办法在点击侦听器中进行检查,以查看我要打开的信息窗口是否是当前打开的信息窗口?如果是这样,不要关闭并重新打开信息窗口?

当前的javascript:

<script type="text/javascript">
    var infowindow = null;
    var stored_markers = new Array();

    function initialize() 
    {
        var latlng = new google.maps.LatLng(0,0);
        var myOptions = {
            zoom: 1,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };

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

        setMarkers(map, items);
        infowindow = new google.maps.InfoWindow({
        content: "holding..."
        });
    }

    var items = [
        ['title 1 to display on hover', latitude 1, longitude 1, z-index 1, 'infowindow 1 content'],
        ['title 2 to display on hover', latitude 2, longitude 2, z-index 2, 'infowindow 2 content'],
        ['title 3 to display on hover', latitude 3, longitude 3, z-index 3, 'infowindow 3 content']
    ];

    function setMarkers(map, markers) 
    {
        for (var i = 0; i < markers.length; i++) 
        {
            var sites = markers[i];
            var siteLatLng = new google.maps.LatLng(sites[1], sites[2]);
            var marker = new google.maps.Marker({
                position: siteLatLng,
                map: map,
                title: sites[0],
                zIndex: sites[3],
                html: sites[4]
            });
            stored_markers.push(marker);
            //initial content string
            var contentString = "Some content";

            //attach infowindow on click
            google.maps.event.addListener(marker, "click", function () 
            {
                infowindow.setContent(this.html);
                infowindow.open(map, this);
            });

        }
    }

</script>
4

4 回答 4

3

您可以将 infowindow-content 包装到具有 id 的元素中,该 id 为您提供与标记的关系:

html: '<div id="infowin'+stored_markers.length+'">'+sites[4]+'</div>'

现在您可以从任何地方检查特定信息窗口是否打开,例如第三个标记(注意索引以 0 开头)

try{if(typeof(document.getElementById('infowin2').nodeType))
    {alert('infowindow for marker3 is open');}}
catch(e){alert('infowindow for marker3 is not open');}

演示: http: //fiddle.jshell.net/doktormolle/Ye3Wh/

于 2012-11-11T00:17:16.333 回答
0

Marker 能够保存和获取您自己的属性,因为 Marker 类扩展了 MVCObject。所以我推荐这样的代码:

var marker = new google.maps.Marker({
                position: siteLatLng,
                map: map,
                title: sites[0],
                zIndex: sites[3],
                html: sites[4],
                markerIdx : "idx" + i  //Add your property
            });

听者是这样的。

//attach infowindow on click
google.maps.event.addListener(marker, "click", function () 
{
    alert(this.get("markerIdx"));      //Get the property of the marker which was clicked.
    infowindow.setContent(this.html);
    infowindow.open(map, this);
});
于 2012-11-11T03:05:37.960 回答
0

使用 API v3,您只需检查信息窗口是否打开: if (infoWindow.getMap())

如果要将标记与特定的 infoWindow 链接,您可能需要创建一个数组,其中每个 infoWindow 的索引与其标记的索引匹配。然后,infoWindow[marker_index]您可以轻松检查您需要什么。

于 2017-01-06T15:57:56.027 回答
0

按照@wf9a5m75 的建议,我将 infoWindow 作为属性添加到标记

marker.infoWindow = new google.maps.InfoWindow({
 content: 'Some info window content'
});

我还为点击事件添加了一个监听器

marker.addListener('click', () => markerClickHandler(marker));

在这个处理程序上,我检查像这样打开的信息窗口

function markerClickHandler(marker) {
 if (mapHasOpenInfo()) {
   // some code
 }  
}

这是查找任何打开标记的方法,您所需要的只是包含地图对象所有标记的数组。

function mapHasopenInfo(markers) {
  return markers.find(marker => marker.isOpen === true);
}
于 2021-01-30T16:53:22.030 回答