关于infowindow:打开错误的信息窗口Google Maps v3

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);
}

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

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

由于您指示的页面不起作用,我不得不使用旧版本来运行演示。
这是我的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 - 简单多标记示例。