2

Modernizr .load({ both: [a, b] }) 似乎之前执行b过,a但这不是 Modernizr 应该如何工作的?yepnope.js [Modernizr 使用的] 总是按照它们列出的顺序执行事物

Modernizr 版本 2.5.3 和 2.6.2。

我正在加载angular.jsangular-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 可以异步加载脚本但按顺序执行它们吗?——但是,如果你仔细阅读这个问题,你会注意到这个问题本身实际上已经包含了另一个问题的答案(即:“[...] 总是按照它们列出的顺序执行事情” ——这就是回答另一个问题)。相反,根据文档,这个问题是关于为什么事情没有按照他们应该的方式工作。

4

0 回答 0