JavaScript のイベントと処理実行のタイミング
JavaScript にはイベントという概念があります。
https://developer.mozilla.org/ja/docs/Learn/JavaScript/Building_blocks/Events
- ウェブページのロード(画像の読み込みなど)の完了
- HTMLの解析(DOMの構築)の完了
などがあります。
JavaScript のコードは、スクリプトが読み込まれたタイミングで実行されます。
<p>hogehoge</p>
<script>
document.querySelectorAll('p').forEach(p => p.textContent = 'foo');
</script>
<p>fugafuga</p>
例えばこのスクリプトは、「全ての p 要素を探して、中身を foo に書き換える」処理ですが、このまま実行すると「hogehoge」のみが書き換えられ、fugafuga はそのままになります。これは、スクリプトが実行されたタイミングでは、まだ fugafuga が読み込まれていないためにそのような結果になります。
これを、スクリプトの読み込み位置によらず、全ての HTML 中にある p 要素を対象に処理を実行したいと思ったときには、イベントを利用します。
<p>hogehoge</p>
<script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('p').forEach(p => p.textContent = 'foo');
});
</script>
<p>fugafuga</p>
HTMLを解析し終えたら(DOM構築が完了したら)、引数の function()
の中身を実行するというコードです。これによって fugafuga も foo に書き換わります。
jQuery の $(function(){ ... });
の意味
jQuery の $(function(){ ... });
は、document.addEventListener('DOMContentLoaded', function() { ... });
と基本的には等価です(フォールバックがある分、実装に差異はありますが)。
つまり、HTMLを解析し終えたら(DOM構築が完了したら)、中身を実行するというコードになります。
試したコードが実行されなかった理由
以下のコードは、ウェブページのロード(画像の読み込みなど)が完了したら、ローディング表示を消すという処理ですね。
function loadingStop() {
$('#loadingWrap').addClass('loadingNone'); // 'loadingNone' クラスを追加
// 1秒後に display: none; を設定
setTimeout(function() {
$('#loadingWrap').css('display', 'none');
}, 2000);
}
$(window).on('load', function() {
loadingStop();
});
このコードは「load イベントの登録(予約処理)」を実行しています。
予約処理なので、できるかぎり早く、つまり、スクリプトが読み込まれた時点で実行すべきです。それにもかかわらず、$(function(){ ... });
の中で実行してしまうと、「HTMLを解析し終えたら、load イベントを予約する」という処理になってしまい、予約処理が遅すぎるのです。
実際、そのようなコードは期待通り実行されたりされなかったりするでしょう。load イベントの発行前に load イベントへの予約が完了することが保証されないためです。うまくいくこともあるかもしれませんが、予約が遅すぎてイベント処理が既に終わってしまっているかもしれません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/18 11:21