質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1531閲覧

【JavaScript】DOMContentLoadedイベントより早くloadイベントが実行される

t-ochi

総合スコア51

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

3クリップ

投稿2022/03/04 04:11

内容

ローディングの非表示処理を、window.loadイベントで実行しています。
・初回アクセス時は問題なし。
・2回目以降のアクセスでは、ファイルキャッシュが使用され、
loadイベントハンドラが先に実行されている(console.logで確認)。

document.DOMContentLoadedイベント と
window.loadイベントの順番保証はできるのでしょうか?

imgタグにおけるloadイベント登録の記事は、teratail上で見つけましたが、
windowオブジェクトにはcompleteプロパティがないため非該当かと思いました。

環境

HTML上では、script1.js → script2.jsで記載。
共用レンタルサーバー。.htaccess使用可能。
ソースは以下です。

JavaScript

1// script1.js 2(function($,underfined) { 3 'use strict'; 4 5 $(window).on('load',function(){ 6 console.log("load"); 7 // 初期化後の処理 8 }); 9})(jQuery); 10 11// script2.js 12(function($, undefined) { 13 'use strict'; 14 15 $(function() { 16 console.log("DOMContentLoaded"); 17 // 初期化 18 }); 19})(jQuery);

現状対応

.htaccess内に、画像ファイルキャッシュを禁止にすることで、
loadイベントの遅延を強制的に起こしてコントロールしています。
発生しているのがWebサイトであるため、
ユーザーの速度対応の向上を含めてキャッシュを有効なまま対応を行いたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/03/04 04:12

> HTML上では、script1.js → script2.jsで記載。 asyncやdeferredを付けたりはしていませんか?
m.ts10806

2022/03/04 04:19

順番が保証されるようなコードを組みたいのか、単になぜ起きてるのか知りたいのか どちらでしょうか。
t-ochi

2022/03/04 04:39

maisumakun様、m.ts10806様、 ご質問ありがとうございます。 > asyncやdeferredを付けたりはしていませんか?  確認しました。  ついていませんでした。 > 順番が保証されるようなコードを組みたいのか、単になぜ起きてるのか知りたいのか どちらでしょうか。  順番が保障されるようなコードを組みたい   が優先高くなります。 何か他の対応が必要になった時のために、 なぜ起きてるのか も知りたいです。 画像がブラウザキャッシュが使用されているため、 DOMを読み込むよりも早く、ブラウザ内では先にloadが終わったと思っていました。 他に気づけていない要因があるのでしょうか? ご教示いただけると嬉しいです。 よろしくお願いします。
t-ochi

2022/03/05 13:09

ご質問ありがとうございます。 開発環境上で再現させようと元に戻したのですが再現しませんでした。 その際に、ブラウザを変更して(Firefox)でネットワークタブを見た中で、 原因となりそうな箇所を見つけましたので、自己解決として投稿いたします。 きっかけ、および、質問する際の 「良いサンプルコード」のガイドラインをご紹介いただきありがとうございました! 今後、より良い質問ができるようにいたします!
guest

回答2

0

(function($,underfined) {

の中で「$(window).on('load',」を呼んでるからでは?
並列に書いてみてください

javascript

1window.addEventListener('pageshow', e=>{ 2 console.log(e.type) 3}); 4window.addEventListener('load', e=>{ 5 console.log(e.type) 6}); 7window.addEventListener('DOMContentLoaded', e=>{ 8 console.log(e.type) 9}); 10/* 11DOMContentLoaded→load→pageshow 12の順で出力される 13*/

投稿2022/03/04 04:45

編集2022/03/04 04:48
yambejp

総合スコア117667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2022/03/04 14:56

(function($,underfined) は即時関数なので、実行順に影響しないのでは?
t-ochi

2022/03/05 13:58 編集

自己回答内容からの考察ですが、 即時関数でラップしたため、script2.jsのレスポンス受信前に、 loadイベントハンドラが実行されたことも考えられると思いました。 関数スコープで閉じたかったため、 読み込み順で対応しようと思ってます! 本当は、import文などを使用する方がいいんでしょうね・・・。 https://qiita.com/TakamiChie/items/4d92c7e80a9d4cce0178 yambejp様、think49様 ありがとうございました!
guest

0

自己解決

偶然ですが、原因を特定できましたので、投稿いたします。

追記情報

  • 本環境はWordPress。
  • サーバーはさくらスタンダード(HTTP/2有効)
  • scriptタグの追加は「wp_enqueue_script」を使用

原因考察

jsファイルのHTMLの読み込み順 による、
DOMContentLoadedイベントハンドラとloadイベントハンドラの
登録と実行タイミング・順番の不整合。

詳細

読み込み順  :script1.js → script2.js
ハンドラ登録順:load → DOMContentLoaded

同時リクエストのタイミングが異なるフェイズでリクエストが送られていた。
※HTTP/2での同時送信リクエスト数は「6つ」まで。
https://blog.redbox.ne.jp/http2-cdn.html

  • フェイズ1でscript1.jsを取得 → loadイベントハンドラ登録
  • フェイズ2でscript2.jsを取得 → DOMContentLoadedイベントハンドラ登録

フェイズ2でレスポンスを受け取る前に、loadイベントが発生する。

観測手順

Firefoxのネットワークタブ内の要求タイミングの差異

  • script1.js → ブロック時間 小
  • script2.js → ブロック時間 大

対応内容

方向性

html

1<script src="script1.js"></script> 2<!-- 色々なファイルの読み込み --> 3<script src="script2.js"></script>

↓ こうなるようにする

html

1<script src="script2.js"></script> 2<!-- 色々なファイルの読み込み --> 3<script src="script1.js"></script>

WordPressでの作業

  • wp_enqueue_scriptの登録順の変更
  • wp_enqueue_scriptの依存関係の見直し

その他検討内容

  • DOMContentLoadedイベントおよび、loadイベントの登録ファイルの集約
    ※各ページに必要な初期化のためにscriptを分けているため、不採用濃厚。
  • pageshowイベントの活用検討

ご質問・ご回答下さった方々ありがとうございました!

投稿2022/03/05 13:47

t-ochi

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問