javascriptは順番にjsを実行する方法をロードします。
2697 ワード
まず、JSの動きについて理解していないところがあれば、参照してください。
javascriptダイナミックローディングの実現方法
JSファイルを動的にロードする3つの方法
どのようにあなたのscriptには何の非同期、ブロックなどの表示がないですか?
ブラウザは、javascriptファイルを非同期的にロードしますが、引用ファイルの書き込み順に上から下まで解析を行います。
Defer属性フラグ
deferはhttml 4.0で定義されています。この属性はブラウザがスクリプトの実行を遅らせることができます。ドキュメントの解析が完了すると、ドキュメントの出現順に解析をダウンロードします。
つまりdefer属性のscriptは、scriptをbodyに置くローディング効果と同じです。
しかし、defer属性は各ブラウザでのサポートレベルが少し違っています。つまり、完全にサポートされていないブラウザもあります。
Async属性表示
asyncはHTML 5によって追加された属性で、ほとんどが先進的にこの属性をサポートしています。
このプロパティの役割は、スクリプトを非同期的にロードすることです。つまり、ブラウザがasync属性のscriptに会ったら、ブラウザがcssをロードするのと同じです。
javascriptダイナミックロードjsファイル
原理はとても簡単で、scriptノードを作って、ノードにscriptの属性を与えて、それからappndからdomのheadラベルの中に行きます。
ですから、b.jsファイルがa.jsに依存しているものがあれば、間違いを報告します。b.jsを実行する時、a.jsはまだロード中です。
javascriptロードの実行順序を制御する
コードを下記のように改善します。
成功すれば、コールバック関数success();
この方法を呼び出すと、現在ノードがロード済みであることをloadJSコールバック関数で知ることができます。その後、コールバック関数で他のscriptファイルを引き続きロードします。
もしあなたのjavascriptファイルが相互依存関係がないなら、この方法を使わないでください。
javascriptダイナミックローディングの実現方法
JSファイルを動的にロードする3つの方法
どのようにあなたのscriptには何の非同期、ブロックなどの表示がないですか?
ブラウザは、javascriptファイルを非同期的にロードしますが、引用ファイルの書き込み順に上から下まで解析を行います。
Defer属性フラグ
deferはhttml 4.0で定義されています。この属性はブラウザがスクリプトの実行を遅らせることができます。ドキュメントの解析が完了すると、ドキュメントの出現順に解析をダウンロードします。
つまりdefer属性のscriptは、scriptをbodyに置くローディング効果と同じです。
しかし、defer属性は各ブラウザでのサポートレベルが少し違っています。つまり、完全にサポートされていないブラウザもあります。
Async属性表示
asyncはHTML 5によって追加された属性で、ほとんどが先進的にこの属性をサポートしています。
このプロパティの役割は、スクリプトを非同期的にロードすることです。つまり、ブラウザがasync属性のscriptに会ったら、ブラウザがcssをロードするのと同じです。
javascriptダイナミックロードjsファイル
原理はとても簡単で、scriptノードを作って、ノードにscriptの属性を与えて、それからappndからdomのheadラベルの中に行きます。
function loadJS(url){
var Script = document.createElement('script');
Script.setAttribute('src', url);
Script.setAttribute('type', 'text/javascript');
document.body.appendChild(Script);
return Script;
}
私たちが同時に複数のjavascriptファイルをロードするなら
loadJS('a.js');
loadJS('b.js');
上記の効果は、a.jsとb.jsファイルは非同期で同時にロードされます。b.jsファイルがa.jsファイルより小さい場合、先にロードして実行する可能性があります。ですから、b.jsファイルがa.jsに依存しているものがあれば、間違いを報告します。b.jsを実行する時、a.jsはまだロード中です。
javascriptロードの実行順序を制御する
コードを下記のように改善します。
function loadJS(url, success) {
var domScript = document.createElement('script');
domScript.src = url;
success = success || function () {
};
domScript.onload = domScript.onreadystatechange = function () {
if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
success();
this.onload = this.onreadystatechange = null;
this.parentNode.removeChild(this);
}
}
document.getElementsByTagName('head')[0].appendChild(domScript);
}
scriptノードのonloadとonreadystatechange属性によってノードsrcのロードが完了したかどうかをモニターします。成功すれば、コールバック関数success();
この方法を呼び出すと、現在ノードがロード済みであることをloadJSコールバック関数で知ることができます。その後、コールバック関数で他のscriptファイルを引き続きロードします。
loadJS(getUrl('a.js'), function () {
loadJS(getUrl('b.js'), function () {
console.log('a.js ,b.js ');
});
});
上記の方法でロードすると、同期ブロックローディングです。a.jsローディングが完了したら、b.jsファイルをロードします。もしあなたのjavascriptファイルが相互依存関係がないなら、この方法を使わないでください。