Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Google Maps API v3中只打开一个信息窗口_Javascript_Google Maps_Google Maps Api 3 - Fatal编程技术网

Javascript 在Google Maps API v3中只打开一个信息窗口

Javascript 在Google Maps API v3中只打开一个信息窗口,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我只需要在我的谷歌地图上打开一个信息窗口。在打开新窗口之前,我需要关闭所有其他信息窗口 有人能告诉我怎么做吗?谷歌地图只允许你打开一个信息窗口。因此,如果您打开一个新窗口,则另一个窗口将自动关闭。您需要跟踪上一个对象,并在处理新标记上的单击事件时对其调用close方法 N.B无需对共享信息窗口对象调用close,使用其他标记调用open将自动关闭原始窗口。有关详细信息,请参阅。在范围外创建您的信息窗口,以便您可以共享它 下面是一个简单的例子: var markers = [AnArrayOfMa

我只需要在我的谷歌地图上打开一个信息窗口。在打开新窗口之前,我需要关闭所有其他信息窗口


有人能告诉我怎么做吗?

谷歌地图只允许你打开一个信息窗口。因此,如果您打开一个新窗口,则另一个窗口将自动关闭。

您需要跟踪上一个对象,并在处理新标记上的单击事件时对其调用close方法


N.B无需对共享信息窗口对象调用close,使用其他标记调用open将自动关闭原始窗口。有关详细信息,请参阅。

在范围外创建您的信息窗口,以便您可以共享它

下面是一个简单的例子:

var markers = [AnArrayOfMarkers];
var infowindow = new google.maps.InfoWindow();

for (var i = 0, marker; marker = markers[i]; i++) {
  google.maps.event.addListener(marker, 'click', function(e) {
    infowindow.setContent('Marker position: ' + this.getPosition());
    infowindow.open(map, this);
  });
}

您只需要创建一个
InfoWindow
对象,保留对它的引用,并对所有标记重复使用if:

如果您一次只想显示一个信息窗口(就像谷歌地图上的行为一样),则只需创建一个信息窗口,您可以在地图事件(如用户单击)时将其重新分配到不同的位置或标记

因此,您可能只想在初始化地图之后创建
InfoWindow
对象,然后按如下方式处理标记的
单击事件处理程序。假设您有一个名为
someMarker
的标记:

google.maps.event.addListener(someMarker, 'click', function() {
   infowindow.setContent('Hello World');
   infowindow.open(map, this);
});

然后,当您单击一个新标记时,
InfoWindow
应该会自动关闭,而不必调用
close()
方法。

我也有同样的问题,但最好的答案并没有完全解决,我在for语句中要做的是使用与当前标记相关的this。也许这对某人有帮助

for(var i = 0; i < markers.length; i++){
    name = markers[i].getAttribute("name");
    address = markers[i].getAttribute("address");        
    point = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));                                     
    contentString = '<div style="font-family: Lucida Grande, Arial, sans-serif;>'+'<div><b>'+ name +'</b></div>'+'<div>'+ address +'</div>';                    
    marker = new google.maps.Marker({                       
        map: map,
        position: point,
        title: name+" "+address,
        buborek: contentString 
    });                                     
    google.maps.event.addListener(marker, 'click', function(){
        infowindow.setContent(this.buborek); 
        infowindow.open(map,this); 
    });                                                         
    marker.setMap(map);                 
}
for(变量i=0;icontentString='基本上,您需要一个函数来保持对一个
newinfobox()的引用。
=>委托onclick事件。 创建标记(在循环中)时,使用
bindInfoBox(xhr、map、marker);

var infoBox
是异步分配的,并保存在内存中。每次调用
bindInfoBox()
时,都会调用返回函数。只需传递
infoBoxOptions
一次也很方便

在我的示例中,由于选项卡事件延迟了初始化,我不得不向
映射添加一个额外的参数


有点晚了,但我通过将infowindow设置为全局变量,只打开了一个infowindow

var infowindow = new google.maps.InfoWindow({});
然后在listner中

infowindow.close();
infowindow = new google.maps.InfoWindow({   
    content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered                           
});

infowindow.open(map, this);
infowindow.close();
infowindow=新建google.maps.infowindow({
内容:''+区域+''+gemeentesFiltered
});
打开(地图,这个);

声明一个globar
var selectedInfo窗口;
并使用它保存打开的信息窗口:

var infoWindow = new google.maps.InfoWindow({
    content: content
});

// Open the infowindow on marker click
google.maps.event.addListener(marker, "click", function() {
    //Check if there some info window selected and if is opened then close it
    if (selectedInfoWindow != null && selectedInfoWindow.getMap() != null) {
        selectedInfoWindow.close();
        //If the clicked window is the selected window, deselect it and return
        if (selectedInfoWindow == infoWindow) {
            selectedInfoWindow = null;
            return;
        }
    }
    //If arrive here, that mean you should open the new info window 
    //because is different from the selected
    selectedInfoWindow = infoWindow;
    selectedInfoWindow.open(map, marker);
});
这样解决:

function window(content){
    google.maps.event.addListener(marker,'click', (function(){
        infowindow.close();
        infowindow = new google.maps.InfoWindow({
            content: content
        });
        infowindow.open(map, this);
    }))
}
window(contentHtml);

这里有一个解决方案,它不需要只创建一个infoWindow即可重用。您可以继续创建多个infoWindow,只需要构建一个closeAllInfoWindows函数,并在打开新infoWindow之前调用它。 因此,保留您的代码,您只需要:

  • 创建一个全局数组来存储所有信息窗口

    var infoWindows = [];
    
  • 在数组中存储每个新的infoWindow,就在infoWindow=new之后

    infoWindows.push(infoWindow);
    
  • 创建closeAllInfo窗口函数

    function closeAllInfoWindows() {
        for (var i=0;i<infoWindows.length;i++) {
            infoWindows[i].close();
        }
    }
    
    函数closeAllInfo窗口(){
    
    对于(var i=0;i来说,使用jQuery实现这一点的一种简单方法如下:

                google.maps.event.addListener(marker, 'click', function (e) {
                    jQuery(".gm-ui-hover-effect").click();
                    marker.info.open(map, this);
                });
    

    它将单击工具提示中的所有关闭按钮。

    这是不对的,我可以在地图上打开多达20个信息窗口。顺便说一句,这是v3。好的,谢谢更正。我不知道它在版本3中已更改。我知道这是一个旧答案,v3 API当时不太清楚……但实际上没有必要调用
    close()
    method,如果使用单个
    InfoWindow
    对象。如果对同一对象再次调用
    open()
    方法,它将自动关闭。@daniel vassallo感谢您的提示:)我相应地对您的答案投了赞成票,这是我认为最有用的。谢谢。使用“this”解决了我的大部分问题。我仍然不知道如何在setContent内部使用自定义内容。例如,在我的标记循环中,我使用“I”变量创建了一个contentHtml变量,并将其链接到数据库对象。我如何将该contentHtml变量传递给侦听器?在我的情况下,仅当我在infowindow.open中使用“this”时窗口才会打开(地图,此);而不是“标记”.Thx用于共享您的解决方案。我也这样做,但信息窗口在下一个标记上打开需要+1秒是正常的吗?有时它根本不会打开。我使用完全相同的代码。您传递内容字符串的方式对我很有用,Thx。我也这样做,但信息窗口在下一个标记上打开需要+1秒是正常的吗呃?有时它根本不会打开。我使用完全相同的代码Daniel,好主意!!在那之前我试图手动同步,但它显示奇怪的javascript错误(比如main.js中的“c is null”,或者类似(123超出范围43))。对我来说很好:)您尝试了什么?它可以工作,但不是一个很好的解决方案,因为您只是不断地向数组中添加信息窗口,所以有可能在一个数组中多次出现相同的信息窗口。
                google.maps.event.addListener(marker, 'click', function (e) {
                    jQuery(".gm-ui-hover-effect").click();
                    marker.info.open(map, this);
                });