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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

307閲覧

setTimeoutが効かない

midori0329

総合スコア1

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2024/03/29 01:48

実現したいこと

画面幅1024px以下では動画を自動再生し、終了後に画面から消えて次のコンテンツが表示される

発生している問題・分からないこと

画面幅を設定しないものは正常に動作するのに、画面幅をwindow.matchMedia('(max-width: 1024px)').matches)で指定したものは、setTimeoutメソッドの中身だけが効かない

該当のソースコード

jQuery

1【正常に動作しているもの】 2$(function(){ 3 const opVideo = $('#opv').get(0); 4 $('#opv-wrap').fadeIn(1000); 5 6 opVideo.addEventListener('loadedmetadata', function() { 7 const playTime = opVideo.duration * 1000 - 1000; 8 9 setTimeout(function(){ 10 $('#opv-wrap').fadeOut(1000, function(){ 11 $('.slider_left').fadeIn(1000); 12 }); 13 }, playTime); 14 15 }); 16 17});

jQuery

1【setTimeout(function(){});の中身が動作していないもの】 2$(window).on('load resize', function(){ 3 if (window.matchMedia('(max-width: 1024px)').matches){ 4 const opVideo = $('#opv-sp').get(0); 5 $('#opv-wrap-sp').fadeIn(1000); 6 7 opVideo.addEventListener('loadedmetadata', function() { 8 const playTime = opVideo.duration * 1000 - 1000; 9 10 setTimeout(function(){ 11 $('#opv-wrap-sp').fadeOut(1000, function(){ 12 $('.main_visual').fadeIn(1000); 13 }); 14 }, playTime); 15 16 }); 17 18 } else { 19 $('#opv-wrap-sp').css('display','none'); 20 } 21});

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

setTimeoutメソッドより上の関数は動いています。
画面幅を指定していない方はsetTimeoutメソッドも含め全て動いているので、何が悪いのかがわかりません。

補足

特になし

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

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

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

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

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

maisumakun

2024/03/29 02:01

> setTimeoutメソッドより上の関数は動いています。 それは、どのような方法で確認しましたか?
midori0329

2024/03/29 04:04

ご回答ありがとうございます! 画面幅を1024px以下に縮めた時に、 $('#opv-wrap-sp').fadeIn(1000); は動作して、#opv-wrap-spがフェードインしてくるのです。
maisumakun

2024/03/29 04:55

addEventListenerでセットしたイベントが動作していることは確認しましたか?
midori0329

2024/04/01 01:29

ベストアンサーの方の仰るとおり、読み込み順の問題でした。 無事に解決いたしました!コメントいただきありがとうございました!
guest

回答1

0

ベストアンサー

実は、$(function(){...})loadイベントではないです。

Most browsers provide similar functionality in the form of a DOMContentLoaded event.
.ready() | jQuery API Documentation

別なイベントである load は、ページ全体が読み込まれたときにのみ使用します。 load を DOMContentLoaded がより適切である場面で使ってしまうことがよくある誤りです。
Document: DOMContentLoaded イベント - Web API | MDN

load イベントは、ページ全体が、スタイルシートや画像などのすべての依存するリソースを含めて読み込まれたときに発生します。
Window: load イベント - Web API | MDN

なので、DOMContentLoadedイベントで試してみてはどうでしょうか。


読み返してみてちょっとわかりにくいかな、と思ったので補足します。

Chrome の場合、

  1. Document:DOMContentLoaded
  2. HTMLMediaElement:loadedmetadata
  3. Window:load

の順番でイベントが発火しているようです。

$(function(){...})は、Document:DOMContentLoadedなので、

  1. Document:DOMContentLoaded
  2. opVideo.addEventListener('loadedmetadata', ...)
  3. HTMLMediaElement:loadedmetadata
  4. Window:load

こういう順番で処理されると思われますが、

$(window).on('load resize', ...)は、

  1. Document:DOMContentLoaded
  2. HTMLMediaElement:loadedmetadata
  3. Window:load
  4. opVideo.addEventListener('loadedmetadata', ...)

という順番で処理されそうです。

つまり、発火後にハンドラの設定をしていますから、イベントを受取れないだろうと思います。


余談になりますが、Firefoxで試したところ、

  1. HTMLMediaElement:loadedmetadata
  2. Document:DOMContentLoaded
  3. Window:load

という順番でしたので、こちらはどちらにしても動かないです。おそらく、プロパティをチェックするなどしてイベントがすでに発火しているかどうかをチェックする必要がありそうです。
Safariは試してないです。

投稿2024/03/29 03:24

編集2024/03/29 09:09
Lhankor_Mhy

総合スコア36134

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

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

midori0329

2024/03/29 05:21

ご回答ありがとうございます! 早速試してみます。
midori0329

2024/04/01 01:28

教えていただいた方法で無事実装できました!! ご丁寧に補足までいただきありがとうございました。 読み込みの順番があること、大きな学びです。今後に活かします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問