
jQueryでネスト構造になっているリストがクリックされた時に、そのidを取得するプログラムを作っています。
第一階層は取得できるのですが、第二階層の<li>をクリックすると二重に処理が動いたり、親要素の値が取得されてしまったりしてうまく動きません。
jQueryでの取得方法を教えていただければと思います。
[HTML部分]
<ul id="sample">
<li class="parent" id="1-1">項目1−1
<ul class="children">
<li class="chaild" id="2-1"></i>項目2-1</li>
<li class="chaild" id="2-2">項目2-2</li>
<li class="chaild" id="2-3">項目2-3</li>
</ul>
</li>
<li class="parent" id="1-2">項目1−2</li>
</ul>
[jQuery部分]
<script type="text/javascript">
$(document).on('click', '.parent , . child', function (e) {
var id = $(this).attr("id");
alert(id);
});
</script>
onクリックのセレクタの指定をいろいろと試してみましたが、下記のような結果となりうまく動作しません。
('.parent , . child')
親は正しくidが取得できたが、子はすべて1-1となってしまい、正しく取得できない。
('li')
親は正しくidが取得できたが,子は2-1と取得できてから、もう一度1-1と取得され、2回処理が動いてしまっている。
('.parent')
親は正しくidが取得できたが、子は全て1-1と取得される。
('#sample>.parent li')
子要素は正しく取得できるが、親要素が取得できない。
No.1ベストアンサー
- 回答日時:
クリックしたliだけつかみたいなら、e.stopPropagation()してバブリングを抑止してください
<script>
$(document).on('click', 'li', function (e) {
var id = $(this).prop("id");
console.log(id);
e.stopPropagation();
});
</script>
<ul id="sample">
<li class="parent" id="1-1">項目1-1
<ul class="children">
<li class="chaild" id="2-1">項目2-1</li>
<li class="chaild" id="2-2">項目2-2</li>
<li class="chaild" id="2-3">項目2-3</li>
</ul>
</li>
<li class="parent" id="1-2">項目1-2</li>
</ul>
[jQuery部分]
No.2
- 回答日時:
こんにちは。
すでに回答は出ていますが…
マウスイベントは伝播しますので、上位要素(祖先要素)であればそのイベントをとらえることが可能です。
ご質問の場合は、それを全てその要素がイベントの発生源として処理してしまっているのが原因かと思います。
例えば最も上位のdocumentレベルで監視する場合は、イベントの発生源のidを取得するというようにすれば重複はおきません。
$(document).on("click", function(e){
if(e.target.nodeName == "LI")
alert($(e.target).prop("id"));
});
上記は、document内全てのLI要素が対象となりますが、範囲を限定したい場合(例えばsampleクラス内のみなどの場合)は、documentの代わりにその要素で監視すれば同様のことが可能になります。
ご提示のように、jQueryの構文でLI要素のイベントのみを取得するような場合には、イベントの発生源と取得要素が同じ場合にだけ処理するようにすることでも特定が可能だと思います。
$(document).on("click", "li", function(e){
if(this == e.target)
alert($(this).prop("id"));
});
もちろん、イベントの伝搬を制御しても良いのですが、例えば、同じ仕組みで別のスクリプトを組み込んだ際に、うまく動作しなくなる可能性があることを理解した上で行ってください。
ついでながら、要素のidは数字で始まるのはNGだったような・・・(←曖昧な記憶ですが)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- HTML・CSS テキストを画面の真ん中に配置したいです。 2 2022/11/25 16:11
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascript(DOM)でIDとテキスト...
-
jQueryアコーディオンで複数メ...
-
jQueryの要素選択について
-
javascriptでEnterキーをtabキ...
-
タブメニューを上下に設置
-
<li>要素の追加方法
-
下記のようにクリックすると、...
-
jQueryプラグインのメガドロッ...
-
jquery 親要素以外の取得
-
大至急!!HPビルダー16の専...
-
サブメニュー表示方法
-
【javascript で動的に a タグ...
-
JS <a></a>タグ内のリンク先ア...
-
ページごとにテキストの色を変...
-
MAX関数を使ってからLEFT JOIN...
-
始めに読み込む画像を固定して...
-
エラーが出ます。
-
removeAttribute()メソッドで削...
-
複数のバナーをリロードする度...
-
ページの一部を隠したり開いた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jqueryのsortableで一部ソート...
-
同一ページ内で、任意の文字列...
-
タブ切り替えの初期表示について
-
ネストされたチェックボックス...
-
JQueryタブのアクティブ アン...
-
Jquery の slide.toggle で要素...
-
ホームページビルダー17のフ...
-
【javascript で動的に a タグ...
-
javascriptで正規表現の検索が...
-
JavascriptのDOMについて
-
javascript テキストエリアを1...
-
for(var i=0;...) の i の値を...
-
クリックで表示、非表示するメ...
-
jQueryで電卓を作っているのですが
-
js ライブラリ iscrollの利用に...
-
jquery ドロップダウンメニュー...
-
プルダウンのメニュー表示について
-
jQueryのhide,showで中の要素が...
-
gridstack.jsについて教えてく...
-
【HP制作】メールフォームの設...
おすすめ情報