我感到非常沮丧,希望这里有人能帮忙。我有一个地图应用程序,地图上有几个带有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:)
谢谢你的帮助。。。