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

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

新規登録して質問してみよう
ただいま回答率
85.48%
jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

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

jQuery

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

Q&A

解決済

2回答

864閲覧

jQueryによるクリック範囲の限定化

kantowebmanager

総合スコア29

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/03/14 12:51

<section class="ham"> <h2> test </h2> <div class="ham_content"> <div class="ham2"> <ul> <li>a</li> <li>b</li> <li>c</li> </ul> </div> contents </div> </section>

上記はハンバーガーメニューのソースコードになっているのですが、hamクラスの範囲をクリックするとアコーディオンが開いたり閉じたりするようになっています。
ただ1つ問題があり、アコーディオンを開いた後にham2クラスの範囲をクリックしてもアコーディオンが閉じてしまいます。
ham2クラスの部分に別のクリック動作を実装したいので、ham2クラスの範囲をクリックするとアコーディオンが閉じるのでは困るという事情があります。
そこで

$(".ham").on('click',function(){}

の部分を

$(".ham").not(".ham2").on('click',function(){}

のようにham2範囲だけ除外すればいいと思いましたが全くうまくいきません。
不思議なのですがどうしてうまくいかないのでしょうか。
また、ham範囲からham2範囲を除外したエリア内だけをクリックした時にアコーディオンが閉じるという動きに変えることは可能でしょうか。

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

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

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

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

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

kei344

2018/03/25 07:13

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況を質問文に追記ください。
kantowebmanager

2018/03/25 13:01

すみませんでした。解決済にさせていただきたいと思います。
guest

回答2

0

ベストアンサー

kszk311さんの回答でいいと思いますが、clickはバブリングするのでstopPropagation()を使う手もあります。

JavaScript

1$('.ham2').on('click', function(event) { 2 event.stopPropagation(); 3});

https://api.jquery.com/event.stoppropagation/

投稿2018/03/14 14:44

x_x

総合スコア13749

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

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

kantowebmanager

2018/03/18 02:20

ありがとうございます。 こちらの方法は非常にシンプルに実現できました。 バブリングという現象知りませんでした。 基本的なことだとは思うのですがstopPropagation()はイベントオブジェクトだけが持っているプロパティなのでしょうか(最初はstopPropagation()プロパティは「$('.ham2').stopPropagation()」のように使うものなのかと思っていました)。
kantowebmanager

2018/03/25 13:02

このたびはありがとうございます。 一歩前に進めた気がします。
guest

0

javascript

1$(function(){ 2 $('.ham').click(function(e){ 3 if($(e.target).is('.ham2') || $(e.target).parents('.ham2').length > 0){ 4 //ham2の処理 5 console.log('ham2'); 6 }else{ 7 //hamの処理 8 console.log('ham'); 9 } 10 }); 11}) 12

投稿2018/03/14 12:59

kszk311

総合スコア3404

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

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

kantowebmanager

2018/03/18 02:18

ご回答ありがとうございます。 無事に実現できました。 少しお聞きしたいのですが、$(e.target).is('.ham2')を「$(e).is('.ham2')」にすると効かなくなりますがこれはどうしてでしょうか。 eはイベントオブジェクトでクリックしたときのイベント情報がeに格納されているのだと思いますが、targetは調べたらeのDOM要素を取得しているようですがeとe.targetの違いがわかりませんでした。。
kszk311

2018/03/18 02:55

$(e).is('.ham2')で動作しないのは、eがDOMではないからです。 eはイベント情報、e.targetはイベント発生源である要素なので、$(e.target)とする事で、クリックされた要素を取得しています。
kantowebmanager

2018/03/18 05:30

そうなんですね。 イベントオブジェクトだけは自動的に要素にはならないのでしょうか。 $("div")や$(".test")のようなjqueryオブジェクトは何も意識しなくても自動的にDOM要素として扱われているように思っていたのすがイベントオブジェクトだけは特別なのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問