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-sanitize.jsangular.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);
エラーメッセージは次のとおりです。
Uncaught TypeError:未定義のajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-sanitize.js:148のメソッド'extend'を呼び出せません
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: ...
}
});
}
});
誰かがこの質問を次の重複としてマークしました: modernizrはスクリプトを非同期でロードできますが、順番に実行できますか?—ただし、この質問を注意深く読むと、この質問自体に他の質問への回答がすでに含まれていることがわかります(つまり、「[...]は常にリストされている順序で実行されます」 —これは他の質問への回答)。代わりに、この質問は、ドキュメントによると、物事が期待どおりに機能しない理由についてです。