IE中的异步谷歌地图加载错误



我到处找这个bug,但没有找到任何有效的东西。这是代码:

MapsLoader.prototype._setup = function () {
var promise = new RSVP.Promise(function (resolve) {
// Callback for Google Maps that resolves the promise
window.gmapsLoaded = function () {
console.log('[Maps Loader] Loaded');
resolve();
};
console.log('[Maps Loader] Loading...');
// Create a URL with the API key pointing to the gmapsLoaded callback
var mapsURL = 'https://maps.googleapis.com/maps/api/js?key=' + config.googleMaps.APIKey + '&sensor=false&callback=gmapsLoaded',
// Create script object
script = $('<script />').attr('src', mapsURL);
$('head').append(script);
});
// Remove the gmapsLoaded function from global scope
promise.then(function () {
window.gmapsLoaded = undefined;
});
// Return the promise
return promise;
};

它是MapsLoader模块的一部分,只需将Google Maps脚本添加到head中(仅在需要时),等待Google Maps加载回调,然后解析promise(此时使用它的文件可以开始执行操作)。

适用于Safari、Chrome、Firefox和IE10。然而,在IE 8和9中,我得到了一个错误:

  • Object doesn't support property or method 'Load'(IE9)
  • Object doesn't support property or method(IE8)

它来自main.js谷歌地图文件的第55行:

k.google.maps.Load(...)

这发生在"[Maps Loader]Loaded"日志消息之后,因此回调正在运行,页面继续正常加载,但谷歌地图区域为空。

如果我打开缓存(即不使用IE Developer Tools),页面有时会第二次工作,这表明这可能是某种加载竞争条件。

我可以通过在条件注释中加载head中的谷歌地图代码来修复它,因此它只会加载在IE中的所有页面上(然后检测google是否已经存在于MapsLoaded模块中)。这确实奏效了,但并不愉快,我宁愿找到路线原因。


其他信息:我使用RequireJS加载模块。

我尝试过的东西:

  • 使用谷歌地图URL上的async=2参数(如这里所建议的)
  • 附加到body而不是head(如Google API示例)
  • 将所有内容放入$.ready调用

感谢

使用$.getScript(mapsURL)(即通过AJAX请求加载)而不是手动将脚本附加到head似乎有效。

不知道为什么以这种方式加载它会有什么不同,但它确实做到了。

您可以在项目的索引文件中添加此脚本<script src="https://cdn.polyfill.io/v3/polyfill.min.js"></script>。问题是由于项目中对polyfill的支持不当造成的。

最新更新