私のページ本文に、AJAX呼び出しの結果としてこのコードを挿入する必要があります。
_ <p>Loading jQuery</p>
<script type='text/javascript' src='scripts/jquery/core/jquery-1.4.4.js'></script>
<p>Using jQuery</p>
<script type='text/javascript'>
$.ajax({
...
});
</script>
_
$.load()
は使用できません。ドキュメントが既に読み込まれているため、イベントは発生しません。
これは安全ですか?そうでない場合、カスタムの生成されたコードが実行される前にjqueryスクリプトがロードされたことを確認するにはどうすればよいですか。
かなり安全です。歴史的に、<script>
タグは完全にブロックされているため、2番目の<script>
タグは、前者が解析/実行を完了するまでは検出できません。唯一の問題は、「最新の」ブラウザがスクリプトを非同期に読み込み、遅延する傾向があることです。したがって、順序が正しいことを確認するには、次のように使用します。
<p>Loading jQuery</p>
<script type='text/javascript' async=false defer=false src='scripts/jquery/core/jquery-1.4.4.js'></script>
<p>Using jQuery</p>
<script type='text/javascript'>
$.ajax({
...
});
</script>
ただし、これをHTML文字列としてDOMにプッシュする代わりに、動的スクリプトタグ挿入を使用することをお勧めします。同じ話になるでしょう
var scr = document.createElement('script'),
head = document.head || document.getElementsByTagName('head')[0];
scr.src = 'scripts/jquery/core/jquery-1.4.4.js';
scr.async = false; // optionally
head.insertBefore(scr, head.firstChild);
クエリできるように、スクリプトファイルにIDを追加します。
<script id="hljs" async src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.0.0/highlight.min.js"></script>
次に、JavaScriptでロードリスナーを追加します
<script>
var script = document.querySelector('#hljs');
script.addEventListener('load', function() {
hljs.initHighlightingOnLoad();
});
</script>
_jQuery 1.6
_にも新機能があります。 jQuery.holdReady()
と呼ばれます。実際には自明です。 jQuery.holdReady(true)
を呼び出すと、jQuery.holdReady(false)
を呼び出すまで、ready
イベントは発生しません。これをfalseに設定しても、準備完了イベントは自動的に起動されず、保留が解除されるだけです。
ドキュメントから取得したスクリプトをロードするノンブロッキングの例を次に示します。
_$.holdReady(true);
$.getScript("myplugin.js", function() {
$.holdReady(false);
});
_
詳細については、 http://api.jquery.com/jQuery.holdReady/ を参照してください
複数のスクリプトがロードされるのを待つ
次のヘルパーは、複数のスクリプトを一度だけロードし、promiseを返します。
async function cirosantilli_load_scripts(script_urls) {
function load(script_url) {
return new Promise(function(resolve, reject) {
if (cirosantilli_load_scripts.loaded.has(script_url)) {
resolve();
} else {
var script = document.createElement('script');
script.onload = resolve;
script.src = script_url
document.head.appendChild(script);
}
});
}
var promises = [];
for (const script_url of script_urls) {
promises.Push(load(script_url));
}
await Promise.all(promises);
for (const script_url of script_urls) {
cirosantilli_load_scripts.loaded.add(script_url);
}
}
load_scripts.loaded = new Set();
(async () => {
await cirosantilli_load_scripts([
'https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js',
]);
// Now do stuff with those scripts.
})();
Chromium 75でテスト済み。