[解決済み] JavaScript ファイルを動的に読み込む
質問
JavaScriptファイルを確実に、かつ動的に読み込むにはどうしたらよいでしょうか? これは、モジュールやコンポーネントを実装するために使用され、コンポーネントが「初期化」されたときに、必要なすべてのJavaScriptライブラリスクリプトを必要に応じて動的にロードすることができます。
このコンポーネントを使用するクライアントは、すべてのライブラリー・スクリプトファイルを読み込む必要がない(そして、手動で
<script>
タグをウェブページに追加します)。
主流のJavaScriptライブラリ(Prototype、jQueryなど)は、どのようにこれを実現しているのでしょうか? これらのツールは、複数のJavaScriptファイルを1つの再配布可能な「ビルド」バージョンのスクリプトファイルにマージしているのでしょうか? あるいは、補助的な「ライブラリ」スクリプトの動的読み込みを行っているのでしょうか?
この質問に対する補足です。
動的にインクルードされた JavaScript ファイルが読み込まれた後のイベントを処理する方法はありますか?
プロトタイプには
document.observe
をドキュメント全体のイベントに使用します。例
document.observe("dom:loaded", function() {
// initially hide all containers for tab content
$$('div.tabcontent').invoke('hide');
});
script要素で利用できるイベントにはどのようなものがありますか?
どのように解決するのですか?
script 要素を動的に作成する場合は プロトタイプ :
new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"});
ここで問題となるのは いつ 外部スクリプトファイルが完全にロードされます。
私たちはしばしば、依存するコードを次の行に書きたいことがあります。
if (iNeedSomeMore) {
Script.load("myBigCodeLibrary.js"); // includes code for myFancyMethod();
myFancyMethod(); // cool, no need for callbacks!
}
コールバックを使わずに、スクリプトの依存性を注入するスマートな方法があります。単にスクリプトを 同期AJAXリクエスト で、グローバルレベルでスクリプトを評価します。
Prototypeを使用する場合、Script.loadメソッドは次のようになります。
var Script = {
_loadedScripts: [],
include: function(script) {
// include script only once
if (this._loadedScripts.include(script)) {
return false;
}
// request file synchronous
var code = new Ajax.Request(script, {
asynchronous: false,
method: "GET",
evalJS: false,
evalJSON: false
}).transport.responseText;
// eval code on global level
if (Prototype.Browser.IE) {
window.execScript(code);
} else if (Prototype.Browser.WebKit) {
$$("head").first().insert(Object.extend(
new Element("script", {
type: "text/javascript"
}), {
text: code
}
));
} else {
window.eval(code);
}
// remember included script
this._loadedScripts.push(script);
}
};
関連
-
vueネットワークリクエストソリューション ネイティブネットワークリクエストとjsネットワークリクエストライブラリ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vueにシンプルなメモ帳機能を実装
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
jsを使った簡単な照明スイッチのコード
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
JavaScriptのクロージャの説明
-
vue ディレクティブ v-html と v-text
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
JavaScriptのStringに関する共通メソッド
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?