使用jQuery作为DOM元素的Google Maps infowindow.setContent似乎只能运行一次?

时间:2012-03-14 17:10:21

标签: google-maps google-maps-api-3

我变得非常沮丧,我希望有人可以提供帮助。我有一个地图应用程序,地图上有几个标记,其中infoWindows的内容定期更新。我的解决方案是将进入DOM中infoWindow的div放在一个隐藏容器中,该容器可以在后台通过我的更新程序代码进行更新。然后我使用单个infoWindow,并使用query:

将内容设置为DOM元素
google.maps.event.addListener(marker, 'click', function(){
     infoWindow.setContent($(#"+id+"-window-content)[0]);
     infoWindow.open(map, marker);
}

事情很有效......曾经。然后它不会再为该制造商打开。我注意到如果我在一个标记(标记A)上打开窗口,然后关闭它,然后在另一个制造商(标记B)上打开它,然后返回标记A,窗口将出现在标记A旁边,但有Marker B的内容。

为什么我的脚本不会再次将内容设置为DOM元素......这几乎就像使用jQuery选择器从DOM中删除元素一样。

干杯,

whiteatom


再次问好,

当我试图在这里解释时,我可能已回答了我自己的问题。

将DOM元素传递给setContent()函数似乎实际上将它从DOM中删除并将其放在infoWindow中,所以下次我尝试抓住它时,它就不再存在了。我的修复是在jQuery调用中添加一个clone(),它现在似乎正常工作。

google.maps.event.addListener(marker, 'click', function(){
     infoWindow.setContent($(#"+id+"-window-content).clone()[0]);
     infoWindow.open(map, marker);
}

任何人都可以确认这是将DOM元素传递给它时setContent的行为吗?这是解决这个问题的最佳方法吗?

干杯,

whiteatom

2 个答案:

答案 0 :(得分:6)

当您更改DOM中元素的父元素时,元素将被移动,而不是复制。

所以我会假设这一行...

infoWindow.setContent($(#"+id+"-window-content)[0]);

将从原来的位置删除元素“#id-window-content”。

当infoWindow关闭时,其中的DOM元素将被丢弃。

因此,当您再次单击标记时,该元素将不再存在。

尝试克隆元素或向infoWindow提供HTML字符串。

希望这有帮助

答案 1 :(得分:2)

它实际上变得更复杂,因为我在infoWindows中有标签(使用jQuery Tools)和一个克隆(即使是事件和数据的深层副本 - 克隆(true,true))似乎不想将它们带过来......标签在infoWindow中已经死了。

所以..我正在移动div,就像我原来一样,然后在添加新的infoWindow内容之前将其移回:

google.maps.event.addListener(marker, 'click', function(){
     infoWindow.close();
     if(typeof infoWindow.content == "object")
         $("#info-window-container").append(infoWindow.getContent());
     infoWindow.setContent($(#"+id+"-window-content)[0]);
     infoWindow.open(map, marker);
}

我认为这也有一个好处,就是允许我的更新程序脚本只更新#“+ id +” - window-content div,它甚至会在打开时更新infoWindow:)

感谢您的帮助......