Opening wrong info window Google Maps v3
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Google Maps JS API v3 - Simple Multiple Marker Example
在我的项目中,你可以在地图上创建标记,然后打开一个infowindow来放置一些信息然后保存在数据库中,但是当你创建一个标记,然后另一个标记时,如果你点击第一个标记,它就会打开 infowindow的第二个标记。
有什么不对? 这是我的代码:
(这是一个简化的代码,这里有完整的代码访问)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 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); } |
调用
将
由于您指示的页面不起作用,我不得不使用旧版本来运行演示。
这是我的markNow()代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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}); } |
实际上,应该在函数markNow()中的每个标记上附加一个单独的监听器 -
1 2 3 4 5 6 7 | 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); |
然后-
1 2 3 4 5 | function showWindow(event) { infoWindow.setContent(html); infoWindow.open(map,marker); } |
这是闭包的一个问题,因为你的循环变量总是引用最后一个值。
请参阅Google Maps JS API v3 - 简单多标记示例。