Modernizr .load({ both: [a, b] }) 似乎之前执行b
过,a
但这不是 Modernizr 应该如何工作的?“ yepnope.js [Modernizr 使用的] 总是按照它们列出的顺序执行事物”
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.extend(...)
在angular-sanitize.js中的一行,即此摘录的最后一行:(第 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);
这是错误消息:
未捕获的类型错误:无法调用未定义 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 不存在”并在稍后死去(当 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: ...
}
});
}
});
有人将此问题标记为重复: modernizr 可以异步加载脚本但按顺序执行它们吗?——但是,如果你仔细阅读这个问题,你会注意到这个问题本身实际上已经包含了另一个问题的答案(即:“[...] 总是按照它们列出的顺序执行事情” ——这就是回答另一个问题)。相反,根据文档,这个问题是关于为什么事情没有按照他们应该的方式工作。