感谢Dr.Molle 在回答中的观察,我找到了解决方案——这确实与infobubble.js代码中domready
事件触发器的位置有关。
不幸的是,它当前位于updateContent_()
由 调用的函数中,open_()
在调用之前setMap()
- 这意味着domready
在将 infoBubble 添加到 DOM 之前触发。
不可能在函数调用domready
之后简单地添加触发器,因为它是异步的......并且函数没有特定的回调。setMap()
open_()
setMap()
setMap()
但是,根据OverlayView 的文档(这是该插件所使用的),一旦使用有效的地图对象调用AFTER ,该函数就会setMap()
调用该函数:onAdd()
setMap()
onAdd():实现这个方法来初始化覆盖的 DOM 元素。此方法在使用有效地图调用 setMap() 后调用一次。此时,窗格和投影将已初始化。
更简单地说:
在 onAdd() 方法中,您应该创建 DOM 对象并将它们附加为窗格的子项。
因此,我们应该在函数中触发domready
事件,在附加到地图窗格之后:onAdd()
infoBubble
/**
* On Adding the InfoBubble to a map
* Implementing the OverlayView interface
*/
InfoBubble.prototype.onAdd = function() {
if (!this.bubble_) {
this.buildDom_();
}
this.addEvents_();
var panes = this.getPanes();
if (panes) {
panes.floatPane.appendChild(this.bubble_);
panes.floatShadow.appendChild(this.bubbleShadow_);
}
google.maps.event.trigger(this, 'domready'); // infobubble has now been added to DOM so we can fire `domready`
};
我为谷歌创建了一个拉取请求来更新infobubble.js 代码并解决这个问题。
JS Fiddle 更新代码(请参阅 javascript 窗口中的第 910 行以获取新domready
位置)
http://jsfiddle.net/goredwards/7r96we66/
注意:
-我在旧domready
调用和正确(更新)domready
调用的 jsfiddle 中添加了时间戳-您会在其中看到它们console.log
-在我的系统上大约需要 20 毫秒(它将随系统速度而变化)
-它显示旧的 domready 确实在infoBubble
被附加到窗格之前触发
- 这给出了setTimeout
您需要在domready
调用 中放置任何函数的最小值
如果你想在没有修复的情况下使用原始代码 - 和一个setTimeout
黑客:http: //jsfiddle.net/goredwards/xeL7dxye/
...你可以玩弄setTimeout
持续时间,看看最小值是多少 - 我开始了快速机器上的 5 毫秒。显然,您必须在生产代码中使用此 hack 以应对最慢的机器(即您将setTimeout
持续时间设置在您可以忍受的最大水平 - 没有烦恼〜 150-250 毫秒 - 以覆盖最慢的机器)系统)。
...或者您可以复制并更新infobubble.js代码并完成它。