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

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

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

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

JavaScript

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

jQuery

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

Q&A

2回答

1486閲覧

JQueryのaddClassメソッドを追加すると、想定外の動作をしてしまう

poge

総合スコア15

HTML5

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

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/04/05 01:24

編集2018/04/05 06:26

前提環境

jQuery:v2.1.4 (minify版)
確認環境:GoogleChrome(65.0.3325.181) Developer ToolsのデバイスモードでiPhone5をエミュレートしています

実現したいこと

以下のコードにより、タッチイベント毎にulの表示をトグルしようとしています。

javascript

1 $('.target-class').on('touchstart', function() { 2 if ( $(this).hasClass('touched') === true){ 3 $(this).removeClass('touched'); 4 $(this).find('ul').slideDown(500, 'easeOutExpo'); 5 }else{ 6 $(this).addClass('touched'); 7 $(this).find('ul').slideUp(500, 'easeOutExpo'); 8 } 9 return false; 10 });

発生している問題・エラーメッセージ

以下のような謎の現象が発生します。
0. タッチする前、タッチ対象の要素のクラスは「target-class」のみ(touchedクラスは設定されていない)
0. タッチを行い、タッチイベントが発生し、冒頭のhasClass('touched')でブレイクすると、何故か$(this)のクラスは「target-class touched」になっている(touchedが付与されている)
0. 上記事象により、初回タッチ時に、$(this).hasClass('touched') === trueが正になり、ulが表示されない

試したこと

  • touchedクラスが他のイベントにより付与されていないことは確認しました。
  • 付与するクラスをtouchedではなくaaabbbcccdddに変更してみても、同様の事象が発生しました。

※aaabbbcccdddが付与されてしまう。

  • $(this).addClass('touched');の行をコメントアウトすると、事象は発生しなくなりました。

※当然、addClassを外してしまうと、目的の動作を実現できなくなってしまいます。

  • addClass/removeClassの部分をtoggleClassに変更してみても、同様の事象が発生してしまいます。

###補足情報
他のイベント(scrollやmouseenter)処理でもaddClass/removeClassを使用している箇所がありますが、そちらは問題なく動作しています。
申し訳ありませんが、都合により、ソース全文は公開できません。

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

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

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

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

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

x_x

2018/04/05 05:51

event.preventDefault()でブレイクするとはどういう意味でしょうか? 何か勘違いしているかもしれません。
poge

2018/04/05 06:27

すみません、本文編集で整合性が取れなくなっていたため内容を修正しました
x_x

2018/04/05 07:02

jQuery UIのバージョンはいくつですか?
x_x

2018/04/05 07:31

確かにブレイクポイントを置いた時の挙動がおかしいようです(一回止まらずに走ってしまってる?)。解決策が思いつきませんが
guest

回答2

0

あまり関係ないかもしれませんが

functionが渡しているイベント:evtと
殺しているイベント:eventが違いますが大丈夫でしょうか?

投稿2018/04/05 01:43

yambejp

総合スコア114779

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

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

poge

2018/04/05 02:09

evet部分は記述ミスのため、訂正します。 発生している事象とは関係ないようです。
yambejp

2018/04/05 02:51

ロジック的には問題ないようですが・・・ たとえばtouchstartをclickでデバッグしてみるとどうでしょうか?
guest

0

addClass/removeClassの部分をtoggleClassに変更してみても、同様の事象が発生してしまいます。

とありますがtoggleClassにする場合

javascript

1$('.target-class').on('touchstart', function() { 2 $(this).toggleClass('touched'); 3 if ( $(this).hasClass('touched') === true){ 4 //$(this).removeClass('touched'); 5 $(this).find('ul').slideDown(500, 'easeOutExpo'); 6 }else{ 7 //$(this).addClass('touched'); 8 $(this).find('ul').slideUp(500, 'easeOutExpo'); 9 } 10 return false; 11 });

これでも切り替えられないということですか?もっと言えば

javascript

1$('.target-class').on('touchstart', function() { 2 $(this).find('ul').slideToggle(500, 'easeOutExpo'); 3 return false; 4 });

これじゃダメです?クラス付与したいのであればダメですが…

投稿2018/04/11 06:28

sousuke

総合スコア3828

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

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

sousuke

2018/04/11 06:30

あとは.target-classの中に.target-classがあってバブリングしているとか? でもブレークちゃんとできそうなもんですが、よくわかりませんねー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問