我使用的是AMD模块模式,到现在为止,它已经比较简单的隐藏,否则这将是全球对象的对象m好奇是否可以用谷歌的全局对象来做类似的事情(我想他们真的是这些地图和几乎所有的API都使用它们)。隐藏全球window.google.maps与AMD
只是做我以前做的事实际上打破了代码,因为。看起来在内部,谷歌自动引用自身的动态脚本调用全局window.google对象。
我打算继续调查,但很好奇你的想法!
谢谢。
我使用的是AMD模块模式,到现在为止,它已经比较简单的隐藏,否则这将是全球对象的对象m好奇是否可以用谷歌的全局对象来做类似的事情(我想他们真的是这些地图和几乎所有的API都使用它们)。隐藏全球window.google.maps与AMD
只是做我以前做的事实际上打破了代码,因为。看起来在内部,谷歌自动引用自身的动态脚本调用全局window.google对象。
我打算继续调查,但很好奇你的想法!
谢谢。
如果您使用RequireJS作为AMD装载机,您可以使用config shims包裹非AMD模块,表达自己的依赖关系,执行任何必要的初始化(你能明确自己的全球性的,如果脚本支持的话)并出口其全球。
对于谷歌地图,这将是这个样子(没有,你可能不希望清除谷歌全球变量):
require.config({
paths: {
"maps": "https://maps.googleapis.com/maps/api/js?key=API_KEY"
},
shims: {
"maps": {
exports: "google.maps"
}
}
});
之后,你可以用这个作为一个经常性AMD模块:
require(["maps"], function(maps) {
var map = new maps.Map(document.getElementById("map-canvas"), ....);
...
});
谢谢。我确实使用了RequireJS。这不仅仅是我在代码中手动完成的标准方法吗?它仍然离开window.google,这可能是我必须忍受的事情,我只是想完全理解。 –
这与代码中所做的几乎完全相同,除了它还允许您指定先决条件。这对Google地图来说不是问题,但对于希望先加载另一个脚本的脚本来说,这可能是个问题。我不确定删除Google全局变量是否安全,或者地图脚本是否依赖它的存在。如果你想删除它,你可以通过在垫片中指定一个init()方法来实现。 –
此外,您的jQuery示例实际上并未从全局范围中删除$变量(您正在清除本地$)。 FWIW,jQuery 1.7和更高版本已经可以作为AMD模块加载(你可以谷歌它)。在任何情况下,删除jQuery全局$的正确方法是调用jQuery.noConflict()。 –
取决于哪些谷歌的东西 - 在iFrame中加载? –
@JeremyJStarcher以谷歌地图为例。我想参考maps API,但是我想用AMD模式来做。所以一个iframe在这里似乎很棘手,但我不太熟悉如何有效地使用它们,也许你可以说一些光。 –