我正在使用Gulp和Browserify捆绑我的JavaScript。我需要公开一个应该在Google Maps API加载后执行的回调函数。如何在使用Browserify时公开Google地图的回调函数?
如何在不使用类似window.initMap
的情况下完成此操作?问题在于我需要在initMap中激发大量其他方法,因此除了使用window.functionName
以及污染全局名称空间之外,还有更好的方法。
另一方面,排除callback
参数并改为执行此操作可以吗?
$.getScript('https://maps.googleapis.com/maps/api/js').done(function() {
initMap();
});
任何帮助将不胜感激。我花了更多的时间,我会承认,让这个工作。
gulpfile.js:
gulp.task('browserify', ['eslint'], function() {
return browserify('/src/js/main.js')
.bundle()
.pipe(source('main.js'))
.pipe(buffer())
.pipe(gulp.dest('/dist/js'))
.pipe(reload({ stream: true }));
});
main.js:
require('jquery');
require('./map');
map.js:
var map = (function() {
'use strict';
var mapElement = $('#map');
function googleMapsAPI() {
$.getScript('https://maps.googleapis.com/maps/api/js?callback=initMap');
}
function initMap() {
var theMap = new google.maps.Map(mapElement);
// functions...
}
function init() {
googleMapsAPI();
}
});
map.init();
问题在于'initMap()'被触发后,我需要调用各种其他自定义函数。如果我用'map.functionName()'调用它们,我得到一个函数未定义的错误。唯一的解决方法是使用'window.functionName()',但是会污染全局名称空间。 – Cofey
@Cofey - 你别无选择,只能*污染全局名称空间*,因为这是Google地图可以使用'callback'的唯一方式。许多人认为“从来没有把任何东西放在全球范围内,因为这样做很糟糕,但这是错误的。你应该考虑的是“不要在全球范围内放置任何你不需要在那里的东西。”您需要**由'callback = initMap'(即'initMap')定义的函数位于全局名称空间中。不要冒汗。 – Adam
此外,当我开发客户端时,我通常会定义自己的名称,以便我可以*挂上东西*。我经常有'window.myNameSpace = window.myNameSpace || {}'在我的项目中,然后像window.myNameSpace.constants = {CONSTANT_ONE = 123456}那样挂掉'window.myNameSpace'的各种东西' – Adam