我目前有一堆标记存储在数组中以跟踪它们。当我点击特定链接时,它会打开该标记的信息窗口。有没有办法检查点击监听器,看看我想要打开的infowindow是否是当前打开的?如果是这样,不要关闭并重新打开infowindow?
当前的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>
答案 0 :(得分:2)
您可以将infowindow内容包装到一个带有id的元素中,该ID可以提供与标记的关系:
html: '<div id="infowin'+stored_markers.length+'">'+sites[4]+'</div>'
现在您可以从任何地方查看特定信息窗是否已打开,例如对于第3个标记(注意索引以0开头)
try{if(typeof(document.getElementById('infowin2').nodeType))
{alert('infowindow for marker3 is open');}}
catch(e){alert('infowindow for marker3 is not open');}
答案 1 :(得分: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);
});
答案 2 :(得分:0)
使用API v3,您只需要检查infowindow是否已打开:
if (infoWindow.getMap())
如果要将标记与特定的infoWindow链接,您可能需要创建一个数组,其中每个infoWindow的索引与其标记的索引匹配。然后使用infoWindow[marker_index]
,您可以轻松查看所需内容。
答案 3 :(得分: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);
}