谷歌地图infowindow.setContent作为一个带有jQuery的DOM元素似乎只起作用一次



我感到非常沮丧,希望这里有人能帮忙。我有一个地图应用程序,地图上有几个带有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旁边,但带有标记B的内容。

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

干杯,

白原子


你好,

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

将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时,有人能确认这是它的行为吗?这是处理这个问题的最好方法吗?

干杯,

白原子

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

所以我假设这条线。。。

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

将从其原始位置移除元素"#id window content"。

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

因此,当您第二次单击标记时,该元素就不存在了。

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

希望这能帮助

事实上,它变得更复杂了,因为我在infoWindows中有选项卡(使用jQuery Tools),而克隆(即使有事件和数据的深层副本-克隆(true,true))似乎不想把它们带过去。。。infoWindow中的选项卡已失效。

所以。。在添加新的infoWindow内容之前,我将按原来的方式移动div,然后将其移回:

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内容div,它甚至会在打开时更新infoWindow:)

谢谢你的帮助。。。

最新更新