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

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

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

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

jQuery UI

jQuery UI はjQuery公式のインターフェースライブラリであり、対話型のウェブアプリケーションを作る際に役立ちます。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1266閲覧

.on("click) でaddClass付与した属性値を、もう一度クリックしたにremoveClassで削除する方法

Novz

総合スコア22

HTML5

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

jQuery UI

jQuery UI はjQuery公式のインターフェースライブラリであり、対話型のウェブアプリケーションを作る際に役立ちます。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/17 02:57

いつもお世話になっております。

モーダルメニューの開閉の際、
開いたときと閉じた時に属性値を追加したり削除したりするなどの
処理を加えたいと思っています。

やりたいこと。

1▼
webサイトにモーダルメニューを実装して、
.menu-mobile をクリックしたらメニューが開くようにする。
これは問題なくできております。

2▼
.menu-mobileをクリックしたら、.mega-menu.openを

mega-menu.closeに切り替える

これをtoggleClassで動作させてました。

3▼
.open .menu-mobileをクリック(メニューを開く)したら

1番の処理 をして、

bodyに .fixed を追加して、ページの高さ分を計算して調整し
現在表示しているメインコンテンツの位置が動かないようにする。

4▼
.close .menu-mobile をクリック(メニュー閉じる)したら

2番の処理 を行って

bodyから .fixed を削除して、ページの高さ分を計算して調整し
勝手にページトップに戻らないようにする。

現在の状況

3 まではうまくいくのですが、

4がうまく動作ません。

4のクリックをすると、removeClassは動かず(fixedが削除されない)、
ページの一番上に戻ってしまいます。

htmlは下記のような状態です。
あらかじめ、div.mega-menuに 予め open という属性値を入れておいて、
toggleClass によって open と close を切り替えています。

html

1 <div class="mega-menu open"> 2 3<!-- ↓下をクリックすると↑のmega-menuのopenの部分がクリックするたびにcloseとopenで切り替わります --> 4 <a href="#" class="menu-mobile"></a> 5 6 7 <ul style="display: block;"> 8 <li><a href="#">Home</a></li> 9 <li class="menu-dropdown-icon"><a href="">About</a> 10 <ul> 11 <li><a href="">School</a> 12 <ul> 13 <li><a href="">Lidership</a></li> 14 </ul> 15 </li> 16 <li><a href="#">Study</a> 17 <ul> 18 <li><a href="#">Undergraduate</a></li> 19 </ul> 20 </li> 21 <li><a href="#">Research</a> 22 <ul> 23 <li><a href="#">Undergraduate research</a></li> 24 </ul> 25 </li> 26 <li><a href="#">Something</a> 27 <ul> 28 <li><a href="#">Sub something</a></li> 29 </ul> 30 </li> 31 </ul> 32 </li> 33 <li class="menu-dropdown-icon"><a href="">News</a> 34 <ul class="normal-sub"> 35 <li><a href="">Today</a></li> 36 </ul> 37 </li> 38 <li class="menu-dropdown-icon"><a href="">Contact</a> 39 <ul> 40 <li><a href="#">School</a> 41 <ul> 42 <li><a href="#">Lidership</a></li> 43 </ul> 44 </li> 45 <li><a href="#">Study</a> 46 <ul> 47 <li><a href="#">Undergraduate</a></li> 48 </ul> 49 </li> 50 <li><a href="#">Study</a> 51 <ul> 52 <li><a href="#">Undergraduate</a></li> 53 </ul> 54 </li> 55 <li><a href="#">Empty sub</a></li> 56 </ul> 57 </li> 58 </ul> 59 60 61</div>

該当部分のjQueryは以下のような状態です。

jQuery

1jQuery(function($){ 2 3// menu-mobileをクリックしたときにmega-menuにopenかcloseを追加する。 4 5$(".menu-mobile").click(function (e) { 6$(".mega-menu").toggleClass('open'); 7$(".mega-menu").toggleClass('close'); 8$(".mega-menu > ul").slideToggle('show-on-mobile'); 9e.preventDefault(); 10}); 11 12// 1番 openが追加されているときの処理(これは動作します) 13var scrollPosition; 14$(".open .menu-mobile").on("click", function() { 15scrollPosition = $(window).scrollTop(); 16$('body').addClass('fixed').css({'top': -scrollPosition}); 17}); 18 19// 2番 closeが追加されているときの処理はこうしたいです(動作しません) 20$(".close .menu-mobile").on("click", function() { 21$('body').removeClass('fixed').css({'top': 0}); 22window.scrollTo( 0 , scrollPosition ); 23}); 24 25 26});

どのようにすれば記述するとよいのでしょうか。

調べてもどうしてもわかりませんでした。どうぞよろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記指定方法では、ページロード時に.openが付いている.menu-mobileにしかクリックイベントが付きません。

js

1$(".open .menu-mobile").on("click"/*略*/)

こういう感じに書き直してみましょう。

js

1$(".menu-mobile").on("click", function (e) { 2 e.preventDefault(); 3 $(".mega-menu").toggleClass('open'); 4 $(".mega-menu").toggleClass('close'); 5 $(".mega-menu > ul").slideToggle('show-on-mobile'); 6 if ( $(".mega-menu").hasClass('open') ) { 7 /* OPEN時の処理 */ 8 } else { 9 /* CLOSE時の処理*/ 10 } 11})

投稿2020/05/17 03:41

kei344

総合スコア69606

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

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

Novz

2020/05/17 05:58 編集

ご教授ありがとうございます。 アドバイスを見ながら以下のように修正してみたのですが、 うまく動作しませんでした。 ``` $(".menu-mobile").on("click", function (e) { e.preventDefault(); $(".mega-menu").toggleClass('open'); $(".mega-menu").toggleClass('close'); $(".mega-menu > ul").slideToggle('show-on-mobile'); if ( $(".mega-menu").hasClass('open') ) { /* OPEN時の処理 */ var scrollPosition; $(".open .menu-mobile").on("click", function() { scrollPosition = $(window).scrollTop(); $('body').addClass('fixed').css({'top': -scrollPosition}); }); } else { /* CLOSE時の処理*/ $(".close .menu-mobile").on("click", function() { $('body').removeClass('fixed').css({'top': 0}); window.scrollTo( 0 , scrollPosition ); }); } }) ``` このような挙動をします。 ▼ 1回目クリック <body class=""> <div class="mega-menu open"> ↓ <div class="mega-menu close"> に変化 ▼ 2回目クリック ↓ <body class="" style="top: 0px;"> <div class="mega-menu close"> ↓ <div class="mega-menu open"> に変化 ▼ 3回目クリックから fixedが追加されますが、 必ずページトップに戻ってしまいます。 <body class="fixed"> <div class="mega-menu open"> ↓ <div class="mega-menu close"> に変化 ▼ 4回目クリック ↓ <body class="" style="top: 0px;"> <div class="mega-menu close"> ↓ <div class="mega-menu open"> に変化 ▼ 以降3回目と4回目の繰り返し。 どこか私の書き方間違えているのだと思います・・ お手数をおかけしますが、ご教授いただけないでしょうか。
kei344

2020/05/17 06:47

「.on("click"」の中で「.on("click"」を書いている場合それは基本的に間違いです。 関数の中身だけ書きましょう。
Novz

2020/05/17 07:46

kei344様、初歩的な部分で誤っており申し訳ありません。 ご指導ありがとうございます。 下記のように記述したら意図通りに動作したのですが、 すみません、、恥を忍んでもう一点だけご指導いただけないでしょうか。 CLOSE時、現在のスクロール位置を取得して表示位置を維持させたいのですが、 私の書き方だとCLOSE時にトップ位置まで戻ってしまいます。 OPEN時はスクロール位置の高さを取得できているのでなんとかならないかと 色々やってみたのですがうまく動かすことができませんでした。 $(".menu-mobile").on("click", function (e) { e.preventDefault(); scrollPosition = $(window).scrollTop(); var scrollPosition; $(".mega-menu").toggleClass('close'); $(".mega-menu > ul").slideToggle('show-on-mobile'); if ( $(".mega-menu").hasClass('close') ) { /* OPEN時の処理 */ $('body').addClass('fixed').css({'top': -scrollPosition}); } else { /* CLOSE時の処理*/ $('body').removeClass('fixed').css({'top': 0}).scrollTop(0,scrollPosition); } }); いくつも質問してしまい申し訳ありません。 何卒よろしくおねがいします。
kei344

2020/05/17 09:21

scrollPosition の値がどの場合のときに、どういう値になっているかをconsole.logで確認して、どういう値が入っている必要があるか考えてみてください。 いくつか試して意図した結果にならないなら、新たに質問をされてはいかがでしょうか。その際には試行したコードも一緒に提示することをお勧めします。 【JavascriptのChromeでのデバッグ方法個人的まとめ2016 - Qiita】 https://qiita.com/snoguchi/items/8f6bb62a3166eca23ac3
Novz

2020/05/17 11:08

kei344様 いろいろとご指導ありがとうございました。 まずは上記のコードで質問した問題は解決しましたのでベストアンサーにさせていただきました。 CLOSEしたときの結果については、教えてもらった方法チェックしてどうしても意図したとおりに動かなければまた相談させてください。 今後ともよろしくおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問