24
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

$(docment).ready(...)は非推奨+必要ない

Posted at

一言でいうと

  • $(document).ready(...)という書き方は、もう推奨されていません。
  • <body>の末尾に<script>を配置しているのなら、
    ほとんどの場合、$(document).ready(...)を使う必要はありません。

推奨されていない

jQueryの公式ドキュメントには以下のように書かれています:

jQuery offers several ways to attach a function that will run when the DOM is ready. All of the following syntaxes are equivalent:

・$( handler )
・$( document ).ready( handler )
・$( "document" ).ready( handler )
・$( "img" ).ready( handler )
・$().ready( handler )

As of jQuery 3.0, only the first syntax is recommended; the other syntaxes still work but are deprecated.

つまり、jQuery3.0では、DOM要素の構築を待ついくつかの構文のうち、$(...)という構文のみが推奨されており、$(document).ready(...)という構文はDeprecatedです。

今まで書いてきた書き方と比較すると以下のようになります。

Bad (推奨されていない書き方):


$(document).ready(function() {
  ...
});

Good (推奨されている書き方):


$(function() {
  ...
});

使う必要がない

<body>の末尾に<script>を配置した場合、<script>より上にあるDOM要素は、読み込みと解析が完了しており、jQueryからアクセスすることができます。

なので、<script>より上にあるDOM要素にアクセスできるのを待つために、$(document).ready(...)を使おうとしているのであれば、$(document).ready(...)は必要ありません。

Bad (必要ない処理が含まれている):

...
<div class="some"></div>
...
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(document).ready(function() {
  var element = $('.some'); //要素にアクセスできる
});
</script>
</body>
</html>

Good:

...
<div class="some"></div>
...
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
var element = $('.some'); //ready()を使わなくても要素にアクセスできる
</script>
</body>
</html>

もしスコープをつくりたいのであれば、即時関数で包めばOKです。

(function() {
  var element = $('.some');
})();

では、どんな時に使う必要がある?

<script>を<body>の末尾に配置することができない場合

以下のような状況では、上記の構文$(...)を使って、DOMの読み込みを待つ必要があります:

  • なんらかの事情で<script>を<body>の末尾に配置することができない場合
  • 自分が書いたスクリプトがどこでロードされるか予測できない場合

例えば<script>を<head>内でロードした場合は、$(...)が必要です。

<head>
...
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(function() {
  var element = $('.some');
});
</script>
</head>
...

DOMContentLoadedイベントを完全に待ちたいとき

$(...)は、DOMContentLoadedイベントを待ちます。<body>末尾の<script>を実行したタイミングでは、DOMContentLoadedイベント自体は発火していないので、もしDOMContentLoadedイベントを確実に待ってから処理を行いたい場合は、$(...)が必要です。(とはいえ、このようなシチュエーションはほぼ無いでしょう)

雑感

自分の身近で、jQueryを使った場合に、$(document).ready(...);を使うことを強制する指導をしている場面がありました。非推奨な書き方は修正すべきとして、なぜこの指導が続けられているのかというと、以下の2点を手軽に実現できるからなのではないかと思います。

  • どこに<script>を配置しても、DOMの読み込みを待つことができる
  • これだけでスコープを作り出すことができる

JavaScriptやjQueryの初学者には、この指導をしてもよいかもしれません。でも、もし学んでいる相手にある程度の理解力があって、かつ指導する時間を確保できるのであれば、きちんと使うべき状況を説明すべきなのではないかと思います。

参考

24
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?