Modernizr。load({both:[a,b]})似乎在b
之前执行a
,但这不是Modernizr应该如何工作的? "yepnope.js [used by Modernizr] always executes things in the order they are listed"
Modernizr版本2.5.3和2.6.2。
我正在加载angular.js和angular-sanitize.js,如下所示:
Modernizr.load({
both: [
cdnDir + 'angular.js',
cdnDir + 'angular-sanitize.js',
d.i.assetsUrlPathStart + 'debiki-dashbar.js'],
complete: bootstrapAngular
})
但是,angular-sanitize.js
很少会因为angular
尚未存在而死亡。
但是Modernizr.load(both: [a, b, c])
是不是保证按顺序执行a,b,c?发生了什么......?
详细说明:
错误发生在angular-sanitize.js的angular.extend(...)
行,这是摘录中的最后一行:(第148行)
// Elements that you can, intentionally, leave open (and which close themselves)
// http://dev.w3.org/html5/spec/Overview.html#optional-tags
var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),
optionalEndTagInlineElements = makeMap("rp,rt"),
optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements);
以下是错误消息:
未捕获的TypeError:无法调用未定义的方法'extend' ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-sanitize.js:148
并且Chrome的调试器显示window.angular
确实未定义 - 虽然它在angular.js的最后一行使用(应该首先执行)。
Chrome(版本24.0.1312.57)表示angular.js和angualar-sanitize.js都是从浏览器的缓存中加载的。
更新:我认为这个更明确的重写确实应该有效。但是当它运行时,它有时打印出“Angular absent”并且稍后会消失(当angular-sanitize.js运行时) - 尽管Angular“必须”刚刚创建。
Modernizr.load({
load: cdnDir + 'angular.js', // <-- creates `angular`
complete: function(){
if (typeof angular == 'undefined' || angular === null) {
console.log('Angular absent.'); // <-- printed sometimes, and everything fails
}
Modernizr.load({
load: cdnDir + 'angular-sanitize.js',
complete: ...
}
});
}
});
有人将此问题标记为重复:Can modernizr load scripts asychronously but execute them in order? - 但是,如果您仔细阅读此问题,您会发现此问题本身已经包含 回答到另一个问题(即:“[...]总是按照列出的顺序执行事情” - 这是另一个问题的答案)。相反,根据文档,这个问题是关于为什么事情不以他们应该的方式工作的原因。