我到处找这个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的支持不当造成的。