JavaScriptの埋め込み場所についてです
JSでDOMの操作をしたい場合対象となるhtmlの要素を読み込んだあとでないと動作しないと思います。
そこで、HTML内の最後の方に書こうと思ったのですが、</body>
の直前に書いても直後に書いても動作しました。
簡単にググってみたところ、</body>
の直前に書くと書いてあったのですが、実際のところどこに記入するのが適切なのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
何を重視したいかで決まります。
- HTML構造の綺麗さを重視: JSは
head
内に全て設置 - パフォーマンスを重視: JSは
</body>
の直前に全て設置
インターネット上には回線速度やマシンスペックが速い人も遅い人も居ます。
特にスマホユーザーは多くのケースで回線速度やマシンスペックが低速になってしまいます。
パフォーマンスを重視する為に</body>
直前に設置する事が基本です。
対するheadに設置する主張は、CSSやメタ情報等と同じ位置にあり統一感が取れていることですね。
何故構造と速度で分けたか?
理由としては、JavaScriptはダウンロードから実行完了まで描画が停止します。
その為Googleの検索エンジンでは「head要素内にJavaScriptは入れないでください」とアナウンスしています。
アナリティクス等のコードも「</body>タグの直前に挿入してください」という一文があり徹底しています。
JSでDOMの操作をしたい場合対象となるhtmlの要素を読み込んだあとでないと動作しないと思います。
その通り!
DOMツリー構造が読み込まれる前なので、先に書いても期待通りの動作はされません。
しかしJavaScriptはイベント駆動で動作しており、ブラウザが発行する様々なイベントをトリガーに関数を実行することが可能です。
その中には「DOMツリー構造をブラウザが全て読み終わった」というイベントも用意されています。
下記のような記述のスクリプトを見たことはありませんか?
JavaScript
1function fn () { 2 // DOMを読み終わってから実行してほしい処理 3} 4document.addEventListener("load", fn); 5 6// fnは1度きりの使い捨て関数なのでこのように書いても良い 7document.addEventListener("load", function () { 8 // DOMを読み終わってから実行してほしい処理 9}); 10 11// document.addEventListenerは超長いので、jQueryでは下記の書き方を推奨 12// jQueryを使う場合は是非 13$(fn); 14$(function () { 15 // DOMを読み終わってから実行してほしい処理 16});
これならばhead要素内にJSを設置してもDOMツリー構造を解析するまで処理が遅延されます。
【追記】おまけ: 速度を犠牲にせず、headに設置できないか?
結論から言えば可能です。
例えばあまりの速さで大騒ぎになってるdev.toというサイトでは、
headタグ内に全てのscriptタグが設置されています。
GoogleのPageSpeed Insightsでは
head要素内に設置したscriptタグは減点扱いになりますが、dev.toは減点されてません。
なぜ?Googleにお金払ったから?
HTML5で実装されたasyncという属性を利用しています。
この属性が付与されたscriptタグはDOMの読み込みを停止することなく裏で読み込み続けてくれます。
(デメリットもあります。詳しくはコメント欄へ)
他にも最近ではSPA(シングルページアプリケーション)という
JavaScriptで画面全ての面倒を見るWebアプリが増えています。
その場合ODMツリーを先に描画しようがしまいがあまり関係なくなってしまいますね。
とりあえずは</body>の直前が好ましいと覚えておくと良いでしょう。
ただし、フロントエンド技術者としての技術力が十分にあればhead内に設置してあっても構いません。
色々調べてみたり試してみてください。
投稿2017/11/17 03:52
編集2017/11/17 06:34総合スコア21158
0
投稿2017/11/17 03:04
総合スコア36115
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
普通は外部ファイルに書いてhead内で読み込みます。
ようはdomの処理後に発生すればよいのですから
javascript
1window.addEventListener('DOMContentLoaded', function(){ 2 初期処理; 3});
(もしくはwindow.onload=function(){})
とすればどこからよんでも問題ありません
また、呼び出すタイミングで処理がされるので初期処理以外たとえば
関数内から呼び出すquerySelectorやgetElement(s)By・・・などは
影響をうけません。
投稿2017/11/17 02:59
総合スコア114843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
例えば、
<!doctype html> <html> <head> <meta charset='utf-8'> <script> let d = document.getElementById('t1'); alert(d.value); </script> </head> <body> <input id='t1' type='text' value='hello' /> </body> </html>
↑これだとalertが出ませんが、
<!doctype html> <html> <head> <meta charset='utf-8'> <script> window.onload=function(){ let d = document.getElementById('t1'); alert(d.value); } </script> </head> <body> <input id='t1' type='text' value='hello' /> </body> </html>
↑こうするとalertが出ますね。
DOMの解析が終わってるので。
投稿2017/11/17 03:04
総合スコア5572
0
趣味でC++やっています。
普通は headタグ内で記述すると思います。
ただ、一応bodyタグ内で、使用する直前に書いているのも見かけます。
たぶんどちらでもいいと思います。
が、私のイメージとしては headタグ内。
yambejpさんの回答を読みました。
私の回答をちょっと訂正。
headタグ内に書きますが、厳密には jsファイル ( JavaScript用ファイル ) に記述して、
C++で言えばインクルード?にあたる処理 ( 読み込み ) をする。
投稿2017/11/17 02:52
編集2017/11/17 03:02総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/17 04:55
2017/11/17 06:33