Jqueryを使用して親divのIDを見つける


99

私はこのようないくつかのhtmlを持っています:

<div id="1">
    <p>
        Volume = <input type="text" />
        <button rel="3.93e-6" class="1" type="button">Check answer</button>
    </p>
    <div></div>
</div>

そして、このようないくつかのJS:

$("button").click(function () {
    var buttonNo = $(this).attr('class');
    var correct = Number($(this).attr('rel'));

    validate (Number($("#"+buttonNo+" input").val()),correct);
    $("#"+buttonNo+" div").html(feedback);
});

ボタンにclass = "1"を付ける必要がなかった場合(数値クラスが無効であることはわかっていますが、これはWIPです!)なので、親divのID。実際には、このようなセクションが複数あります。

  1. ボタンの親であるdivのIDを見つけるにはどうすればよいですか。

  2. 答えをボタンコードに格納するためのよりセマンティックな方法は何でしょうか。私はこれをできるだけ簡単に、プログラマー以外の人が物事を壊すことなくコピーアンドペーストできるようにしたいと思います!

回答:


212

親divでイベントの委任を使用できます。または、nearestメソッドを使用して、ボタンの親を見つけます。

2つのうち最も簡単なものはおそらく最も近いものです。

var id = $("button").closest("div").prop("id");

6
あなたが.closest( "div.foo")のようなことができ、コードが構造に結び付けられていないので、私は本当に近いものが好きです。
マーク

2
私は再帰関数を実行しようとしていました...そして、jqueryがすでに何かを知っていました...私の場合、私は$( "#" + id).closest( "div.form-group")を使用してフォームグループクラスを持つ親div。
cabaji99

47

1。

$(this).parent().attr("id");

2。

たくさんの方法があるに違いありません!たとえば、答えを含む要素を非表示にすることができます。

<div>
    Volume = <input type="text" />
    <button type="button">Check answer</button>
    <span style="display: hidden">3.93e-6&lt;/span>
    <div></div>
</div>

次に、上記と同様のjQueryコードを取得します。

$("button").click(function () 
{
    var correct = Number($(this).parent().children("span").text());
    validate ($(this).siblings("input").val(),correct);
    $(this).siblings("div").html(feedback);
});

答えをクライアントコードに入れれば、彼らはそれを見ることができます:)これを行う最良の方法は、サーバー側で検証することですが、範囲が限定されたアプリの場合、これは問題にならない場合があります。


このエディターでHTMLをフォーマットする方法はわかりませんが、Pimの( 'div:eq(0)')のものよりも親を取得する方が簡単な方法のようです。ここで微妙なところを見逃していない限り、html要素にはすべて1つの直接の親があります。これは、parent()で取得できます。
ロブ・グラント

親は実際に最も近い親を返しますが、質問の周りのDiv内にフィールドセットまたは何かを追加したい場合はどうなりますか。
Pim Jager、

実際、彼自身の例では、これは<p>を返します
Pim Jager

実際、divがさらに追加された場合、「div:eq(0)」は間違っている可能性があります。構造を変更し、それを解析するコードを変更します:)そして、ええ、私は例を、例に必要な最小限のhtmlに単純化しました。親を2回呼び出す必要があります。
ロブ・グラント

何らかの理由で、parent()を使用したときにattr(id)にアクセスできなかったため$(parent[0]).attr('id')、いくつかの親セレクターを使用した後、結果をこのようにラップする必要がありました。
Piotr Kula 2014年

11

これを試して:

$("button").click(function () {
    $(this).parents("div:first").html(...);
});


7

親divのIDを取得するには:

$(buttonSelector).parents('div:eq(0)').attr('id');

また、コードをかなりリファクタリングできます:

$('button').click( function() {
 var correct = Number($(this).attr('rel'));
 validate(Number($(this).siblings('input').val()), correct);
 $(this).parents('div:eq(0)').html(feedback);
});

今ではボタンクラスは必要ありません

説明
eq(0)は、jQueryオブジェクトから1つの要素、この場合は要素0、つまり最初の要素を選択することを意味します。http://docs.jquery.com/Selectors/eq#index
$(selector).siblings(siblingsSelector)は、siblingsSelectorに一致するすべての兄弟(同じ親を持つ要素)を選択しますhttp://docs.jquery.com/Traversing / siblings#expr
$(selector).parents(parentsSelector)は、親セレクターと一致するセレクターと一致する要素のすべての親を選択します。http://docs.jquery.com/Traversing/parents#expr
したがって:$(selector).parents( 'div:eq(0)'); セレクターで一致した要素の最初の親divに一致します。

jQueryドキュメント、特にセレクターとトラバースを確認する必要があります。


シンプルで簡単!なぜdiv:eq(0)なのですか?どう言う意味ですか?
リッチブラッドショー、

これが少なくとも1つのdivにラップされている場合、 'div:eq(0)'は間違っていると思います。これは、相対ではなくDOMの絶対トラバーサルを実行しているためです。最初の要素が「最も近い」親である場合は問題ありませんが、そうでない場合は次のようになります。tinyurl.com
Rob Grant

1
(したがって、代わりにparent()を使用します)
Rob Grant、


5

これは次のようにして簡単に行うことができます:

$(this).closest('table').attr('id');

これをテーブル内の任意のオブジェクトにアタッチすると、そのテーブルのIDが返されます。


3

JQUeryには、そこから開始できるDOMツリーを上に移動するための.parents()メソッドがあります。

これをよりセマンティックな方法で行うことに関心がある場合、ボタンでREL属性を使用することは、コードで「これが答え」を意味的に定義する最良の方法であるとは思いません。私はこれらの線に沿って何かをお勧めします:

<p id="question1">
    <label for="input1">Volume =</label> 
    <input type="text" name="userInput1" id="userInput1" />
    <button type="button">Check answer</button>
    <input type="hidden" id="answer1" name="answer1" value="3.93e-6" />
</p>

そして

$("button").click(function () {
    var correctAnswer = $(this).parent().siblings("input[type=hidden]").val();
    var userAnswer = $(this).parent().siblings("input[type=text]").val();
    validate(userAnswer, correctAnswer);
    $("#messages").html(feedback);
});

検証とフィードバックがどのように機能しているかはよくわかりませんが、アイデアはわかります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.