打开错误的信息窗口 Google Maps v3 [重复]

Posted

技术标签:

【中文标题】打开错误的信息窗口 Google Maps v3 [重复]【英文标题】:Opening wrong info window Google Maps v3 [duplicate] 【发布时间】:2012-09-06 22:31:43 【问题描述】:

可能重复:Google Maps JS API v3 - Simple Multiple Marker Example

在我的项目中,您可以在地图上创建标记,然后打开一个信息窗口以放置一些信息并保存在数据库中,但是当您创建一个标记时,如果您单击第一个标记,然后再创建另一个标记它会打开第二个标记的信息窗口。

有什么问题吗?这是我的代码: (这是简化代码,完整代码access here)

var marker;
var infoWindow;
function goma()

  google.maps.event.addDomListener(teste, 'click', function() 
   
     doMark = true;     
     doMark2 = false;           
    );
    markNow()

    function markNow()   

//Marker1
google.maps.event.addListener(map, "click", function(event) 


    if (doMark == true && doMark2 == false)


    marker = new google.maps.Marker(
                 position: event.latLng, 
                 map: map, icon: 'Imagens/Oficina.png',
                 shadow: 'Imagens/Oficinasombra.png',
                 draggable : true,
                 animation: google.maps.Animation.DROP);
    google.maps.event.addListener(marker,'click',showWindow);

    doMark = false;
    

    //Marker2
    else if (doMark2 == true && doMark == false)

   marker = new google.maps.Marker(
                 position: event.latLng, 
                 map: map, icon: 'Imagens/Lojas.png',
                 shadow: 'Imagens/Oficinasombra.png',
                 draggable : true,
                 animation: google.maps.Animation.DROP);
    google.maps.event.addListener(marker,'click',showWindow);


    doMark2 = false;
    

);
var html = "<table>" +
   "<tr><td>Nome:</td> <td><input type='text' id='name'/> </td> </tr>" +
   "<tr><td>Endereco:</td> <td><input type='text' id='address'/></td> </tr>" +
   "<tr><td>Tipo:</td> <td><select id='type'>" +
   "<option value='oficina' SELECTED>oficina</option>" +
   "<option value='restaurante'>restaurante</option>" +
   "</select> </td></tr>" +
   "<tr><td></td><td><input type='button' value='Salvar' onclick='saveData()'/>     </td></tr>";



function showWindow(event) 

infoWindow.setContent(html); 
infoWindow.open(map,marker); 
 

【问题讨论】:

【参考方案1】:

调用infowindow.open(map, marker) 调用您所看到的最后一个标记。您需要识别单击的标记以将信息窗口附加到此标记。

infowindow.open(map, marker); 更改为infowindow.open(map, this);

由于您指示的页面无法正常工作,我不得不使用旧版本来运行演示。 这是我的 markNow() 代码

function markNow()   

google.maps.event.addListener(map, "click", function(event) 

    if (doMark == true)
    alert("Marker 1 Chosen");
    marker = new google.maps.Marker(
    position: event.latLng,
    map: map,
    icon: 'Imagens/Oficina.png',
    );
    
    if (doMark2 == true)
    alert("Marker 2 Chosen");
    marker = new google.maps.Marker( 
    position: event.latLng,
    map: map,
    icon: 'Imagens/Lojas.png',
    );
    
    //if (doMark ==1)
    google.maps.event.addListener(marker, "click", function() 
    
        infowindow.open(map, this);

    


    );


);
var html = "<table>" +
   "<tr><td>Nome:</td> <td><input type='text' id='name'/> </td> </tr>" +
   "<tr><td>Ensdereco:</td> <td><input type='text' id='address'/></td> </tr>" +
   "<tr><td>Tipo:</td> <td><select id='type'>" +
   "<option value='oficina' SELECTED>oficina</option>" +
   "<option value='restaurante'>restaurante</option>" +
   "</select> </td></tr>" +
   "<tr><td></td><td><input type='button' value='Salvar' onclick='saveData()'/>        </td></tr>";

infowindow = new google.maps.InfoWindow(content: html);

【讨论】:

【参考方案2】:

实际上应该为函数markNow()中的每个标记附加一个单独的侦听器-

 marker = new google.maps.Marker(
                     position: event.latLng, 
                     map: map, icon: 'Imagens/Oficina.png',
                     shadow: 'Imagens/Oficinasombra.png',
                     draggable : true,
                     animation: google.maps.Animation.DROP);
google.maps.event.addListener(marker,'click',showWindow);

然后-

function showWindow(event) 

infoWindow.setContent(html); 
infoWindow.open(map,marker); 
 

【讨论】:

希望这能解决您的问题。如果您有任何问题,请告诉我 我尝试将此代码放在我的项目中,在 markNow();并超出功能,但不起作用=/。 您可以显示您所做更改的代码吗?某处可能有错误 我更新了我的代码,检查一下 =),我不知道为什么不工作。标记没有打开,如果需要,您可以在我提出的链接上查看我的完整代码 您有一些错误。您的 var html 实际上无法在 showWindow 中访问。因此,您应该在全局范围内声明 var html 以及 var 标记;和 var infoWindow;然后像你一样分配文本。看看这个改变是否能解决。【参考方案3】:

这是闭包的问题,​​因为您的循环变量总是引用最后一个值。

见Google Maps JS API v3 - Simple Multiple Marker Example。

【讨论】:

以上是关于打开错误的信息窗口 Google Maps v3 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Maps API v3 禁用兴趣点信息窗口

关闭 Google Maps API v3 中的所有信息窗口

检查 infowindow 是不是打开 Google Maps v3

Google Maps V3:通过 AJAX 加载信息窗口内容

Google Maps v3 在地图初始化后调整缩放级别

Google Maps API v3 infowindow 关闭事件/回调?