Menemukan id dari div induk menggunakan Jquery


99

Saya punya beberapa html seperti ini:

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

dan beberapa JS seperti ini:

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

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

Yang benar-benar saya inginkan adalah jika saya tidak harus memiliki class = "1" pada tombol (saya tahu kelas numerik tidak valid, tapi ini adalah WIP!), Jadi saya bisa menentukan tombolTidak berdasarkan id dari div induk. Dalam kehidupan nyata, ada banyak bagian yang terlihat seperti ini.

  1. Bagaimana cara menemukan id dari tombol parenting div.

  2. Apa cara yang lebih semantik untuk menyimpan jawaban dalam kode tombol. Saya ingin membuat ini semudah mungkin bagi non programmer untuk menyalin dan menempel tanpa merusak sesuatu!

Jawaban:


212

Anda bisa menggunakan delegasi acara di div induk. Atau gunakan metode terdekat untuk menemukan induk tombol.

Yang termudah dari keduanya mungkin yang paling dekat.

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

6
Saya sangat suka yang terdekat karena Anda dapat melakukan sesuatu seperti .closest ("div.foo") dan kode tidak terikat pada struktur.
Tandai

2
Thx saya akan melakukan fungsi rekursif .... kemudian saya tahu jquery sudah memiliki sesuatu ... dalam kasus saya, saya menggunakan $ ("#" + id) .closest ("div.form-group") untuk menemukan div induk yang memiliki kelas bentuk-kelompok.
cabaji99

47

1.

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

2.

Pasti ada banyak cara! Salah satunya adalah menyembunyikan elemen yang berisi jawabannya, misalnya

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

Dan kemudian miliki kode jQuery yang mirip dengan yang di atas untuk mengambilnya:

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

perlu diingat bahwa jika Anda memasukkan jawaban dalam kode klien maka mereka dapat melihatnya :) Cara terbaik untuk melakukannya adalah dengan memvalidasinya di sisi server, tetapi untuk aplikasi dengan cakupan terbatas, hal ini mungkin tidak menjadi masalah.


Saya tidak tahu bagaimana memformat HTML di editor ini, tetapi ini tampaknya cara yang lebih sederhana untuk mengambil induk daripada hal-hal Pim ('div: eq (0)'); kecuali saya kehilangan kehalusan di sini maka semua elemen html memiliki satu induk langsung, yang baru saja Anda dapatkan dengan induk ().
Rob Grant

orang tua memang akan mengembalikan orang tua terdekat, namun, apa yang terjadi jika dia memutuskan bahwa dia ingin menambahkan fieldset atau sesuatu di sekitar pertanyaan tetapi di dalam Div.
Pim Jager

Sebenarnya dalam contoh sendiri ini akan mengembalikan <p>
Pim Jager

Memang, jika lebih banyak div menambahkan maka 'div: eq (0)' bisa jadi salah. Ubah struktur, ubah kode yang mem-parsingnya :) Dan ya saya menyederhanakan contoh ke html minimum yang diperlukan untuk contoh; itu harus memanggil orang tua dua kali.
Rob Grant

Untuk beberapa alasan ketika saya menggunakan parent () saya tidak dapat mengakses attr (id), saya harus membungkus hasil seperti ini $(parent[0]).attr('id')setelah saya menyukai beberapa selektor induk.
Piotr Kula

11

Coba ini:

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


7

Untuk mendapatkan id dari div induk:

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

Selain itu, Anda dapat sedikit merefaktor kode Anda:

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

Sekarang tidak perlu kelas tombol

Penjelasan
eq (0), artinya Anda akan memilih salah satu elemen dari objek jQuery, dalam hal ini elemen 0, demikian elemen pertama. http://docs.jquery.com/Selectors/eq#index
$ (selector) .siblings (siblingsSelector) akan memilih semua saudara (elemen dengan induk yang sama) yang cocok dengan siblingsSelector http://docs.jquery.com/Traversing / siblings # expr
$ (selector) .parents (parentSelector) akan memilih semua elemen induk yang cocok dengan selektor yang cocok dengan pemilih induk. http://docs.jquery.com/Traversing/parents#expr
Jadi: $ (selector) .parents ('div: eq (0)'); akan cocok dengan div induk pertama dari elemen yang cocok dengan selector.

Anda harus melihat dokumen jQuery, khususnya penyeleksi dan traverse:


Sederhana dan mudah! Mengapa div: eq (0)? Apa artinya?
Rich Bradshaw

Saya pikir 'div: eq (0)' akan salah jika ini semua dibungkus dalam setidaknya satu div, karena Anda melakukan traversal absolut dari DOM daripada yang relatif. Yang akan baik-baik saja jika elemen pertama adalah induk "terdekat", tetapi ini menyarankan sebaliknya: tinyurl.com/bbegow
Rob Grant

1
(karenanya saya menggunakan orang tua () sebagai gantinya)
Rob Grant


5

Ini dapat dengan mudah dilakukan dengan melakukan:

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

Anda melampirkan ini ke objek apa pun di dalam tabel dan itu akan mengembalikan Anda id dari tabel itu.


3

JQUery memiliki metode .parents () untuk naik pohon DOM Anda bisa memulainya dari sana.

Jika Anda tertarik untuk melakukan ini dengan cara yang lebih semantik, menurut saya menggunakan atribut REL pada tombol adalah cara terbaik untuk mendefinisikan secara semantik "ini adalah jawabannya" dalam kode Anda. Saya akan merekomendasikan sesuatu seperti ini:

<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>

dan

$("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);
});

Tidak begitu yakin bagaimana validasi dan umpan balik Anda bekerja, tetapi Anda mendapatkan idenya.


0

find () dan terdekat () tampaknya sedikit lebih lambat dari:

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

$(this).parent().parent().attr("id");?
Alejandro Iván
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.