🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

Q&A

1回答

2996閲覧

PCレイアウト時にイベントをリセットしたい

Yui_note

総合スコア15

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/12/18 02:34

編集2020/12/19 01:24

やりたいこと

レスポンシブ対応時にjQueryにて、スマホ時に実行したイベントをPCレイアウト時に削除したいと思っております。

試してみたソースコード

JS

1var sp_flag = false; 2var pc_flag = false; 3// リサイズ時に取得 4$( window ).on( 'load resize', function() { 5 sp_flag = ( window.matchMedia( '(max-width:768px)' ).matches ); // IE10+ 6} ); 7$( window ).on( 'load resize', function() { 8 pc_flag = ( window.matchMedia( '(min-width:769px)' ).matches ); // IE10+ 9} ); 10$(".a > li").on("click", function() { 11 // クリック時に判断 12 if ( sp_flag ) { 13 $(this).next().slideToggle(); 14 $(this).toggleClass("is-active"); 15 $(this).closest(".X").toggleClass("is-active"); 16 } 17}); 18$(function(){ 19 if ( pc_flag ) { 20 $(".b *").removeAttr('style'); 21 } 22});

上記のコードはこちらの質問を参考にさせていただきました。
https://teratail.com/questions/43593

問題となっているところ

横幅769px以上のPCレイアウト時に、SPレイアウト時に実行したJSイベントがリセットされません。

実現したいこと

PC時にSPレイアウト時に実行したJSイベントをリセットしたいです。

教えてほしいこと

スクリプトによってHTMLに書き加えたstyle属性を削除できれば意図した動きになるため、削除しようとremoveAttrメソッドを使用したのですがうまくいかず、このメソッドの使い方を間違えているのか知りたいです。また、スマホレイアウト時に実行したイベント毎、PC時にはリセットするという方法が「実行したイベント リセット js」などで検索しても見つけられず、リセット方法がもしありましたら教えていただきたいです。

どなたかアドバイスいただけますと助かります。
よろしくお願い申し上げます。

追記(12.19)

一応スマートなコードではありませんが、実装したい動きはできました。

JS

1var sp_flag = false; 2var pc_flag = false; 3// リサイズ時に取得 4$( window ).on( 'load resize', function() { 5 sp_flag = ( window.matchMedia( '(max-width:768px)' ).matches ); // IE10+ 6} ); 7$( window ).on( 'load resize', function() { 8 pc_flag = ( window.matchMedia( '(min-width:769px)' ).matches ); // IE10+ 9} ); 10$(".a > li").on("click", function() { 11 // クリック時に判断 12 if ( sp_flag ) { 13 $(this).next().slideToggle(); 14 $(this).toggleClass("is-active"); 15 $(this).closest(".X").toggleClass("is-active"); 16 } 17}); 18$(window).resize( function() { ←追加 19 if ( pc_flag ) { 20 $(".b *").removeAttr('style'); 21 } 22});

JS

1$(window).resize( function() { 2 if ( pc_flag) {} 3});

ただこちらのコードですと、resize functionを2重で読み込みしており、現状の書き方に問題点がありそうな気がしております。もし何かお気づきの点がありましたら、ご指摘いただきたいです。

何度も申し訳ございませんが、どなたかアドバイスいただけますと幸いです。
よろしくお願い申し上げます。

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

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

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

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

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

Lhankor_Mhy

2020/12/18 09:05

『削除しようとremoveAttrメソッドを使用したのですがうまくいかず』とのことですが、具体的にはどのようなことが起きていますか?
Yui_note

2020/12/19 00:41 編集

ありがとうございます。 具体的な状態ですが、ブラウザ幅を768px以下にした際のJSは問題なく実行されますが、ブラウザ幅を769px以上にリサイズにした際にそのSP時に実行し吐き出されたイベントがリセットされない状態です。SP時はクリックイベントでslideToggleでインラインスタイルにdisplay: blockとnoneが発生しているのですが、そのイベントがブラウザ幅769px以上の場合にはリセットされた状態にしたいと思っています。
Lhankor_Mhy

2020/12/19 00:45

「イベントがリセットされない状態」というのは、クリックしても何も起きないようにしたい、ということでいいですか?
Yui_note

2020/12/19 01:21

いえ、SP時にクリック動作で実行されたイベント(インラインにスタイルが追加されます)を、ブラウザ幅を768px以上にリサイズした際にそのイベント一式をリセットしたいという形になります。 先ほど追記記載させていただきましたが、一旦動き自体は実装はできました。 ありがとうございました。
guest

回答1

0

同じイベントハンドラを繰り返す必要はありませんので、以下のようにまとめたらスッキリします。

jQuery

1$( window ).on( 'load resize', function() { 2 sp_flag = ( window.matchMedia( '(max-width:768px)' ).matches ); // IE10+ 3 pc_flag = ( window.matchMedia( '(min-width:769px)' ).matches ); // IE10+ 4 if ( pc_flag ) { 5 $(".b *").removeAttr('style'); 6 } 7} ); 8

あと、ついでに申し上げると、if ( sp_flag ) {...}のところで$(this)が繰り返し使われていますが、

jQuery

1 let $this = $(this); 2 $this.next().slideToggle(); 3 $this.toggleClass("is-active"); 4 $this.closest(".X").toggleClass("is-active");

のように一旦変数に格納してそれを使うことで若干ですが処理が速くなります。もっと大規模なものでないと体感できないとは思いますが、習慣づけておくことをお勧めします。

投稿2020/12/19 09:51

cerfweb

総合スコア1907

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問