Jquery kullanarak bir üst div'in kimliğini bulma


99

Bunun gibi bazı html'm var:

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

ve bunun gibi bazı 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);
});

Gerçekten istediğim şey, düğmede sınıf = "1" olması gerekmeseydi (sayısal sınıfların geçerli olmadığını biliyorum, ancak bu bir Devam Eden Çalışma!), Böylece düğmeyi üst div kimliği Gerçek hayatta buna benzeyen birden fazla bölüm vardır.

  1. Düğmeye ebeveynlik yapan div kimliğini nasıl bulabilirim.

  2. Cevabı düğme kodunda saklamanın daha anlamsal bir yolu ne olabilir? Programcı olmayan birinin bir şeyleri bozmadan kopyalayıp yapıştırması için bunu olabildiğince kusursuz hale getirmek istiyorum!

Yanıtlar:


212

Üst div'de olay yetkilendirmesini kullanabilirsiniz . Veya düğmenin üst öğesini bulmak için en yakın yöntemi kullanın.

İkisinin en kolayı muhtemelen en yakın olanıdır.

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

6
En yakınını gerçekten seviyorum çünkü .closest ("div.foo") gibi bir şey yapabilirsiniz ve kod yapıya bağlı değildir.
Mark

2
Thx i yinelemeli bir işlev yapmak üzereydim .... sonra jquery'nin zaten bir şeyi olduğunu biliyordum ... benim durumumda $ ("#" + id) .closest ("div.form-group") kullanarak form-group sınıfına sahip olan ebeveyn div.
cabaji99

47

1.

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

2.

Çok sayıda yol olmalı! Cevabı içeren bir öğeyi gizlemek olabilir, örn.

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

Ve sonra, bunu almak için yukarıdakine benzer jQuery koduna sahip olun:

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

Unutmayın ki yanıtı istemci koduna koyarsanız, onlar da görebilir :) Bunu yapmanın en iyi yolu, onu sunucu tarafında doğrulamaktır, ancak sınırlı kapsamı olan bir uygulama için bu bir sorun olmayabilir.


Bu düzenleyicide HTML'yi nasıl biçimlendireceğime dair hiçbir fikrim yok, ancak bu, Pim'in ('div: eq (0)') şeyinden daha ebeveyni kapmanın daha basit bir yolu gibi görünüyor; burada bir incelik kaçırmadıysam, html öğelerinin hepsinin bir doğrudan ebeveyni vardır ve bunu parent () ile elde edersiniz.
Rob Grant

ebeveyn gerçekten de en yakın ebeveyne geri dönecektir, ancak soru etrafına ancak Div'in içine bir alan kümesi veya başka bir şey eklemek istediğine karar verirse ne olur.
Pim Jager

Aslında kendi örneğinde bu, <p>
Pim Jager'i

Aslında, daha fazla div eklenirse, 'div: eq (0)' yanlış olabilir. Yapıyı değiştirin, onu ayrıştıran kodu değiştirin :) Ve evet, örnek için gerekli minimum html örneğini sadeleştirdim; ebeveyni iki kez aramalıdır.
Rob Grant

Bazı nedenlerden dolayı parent () kullandığımda attr (id) 'ye erişemedim, $(parent[0]).attr('id')birkaç ebeveyn seçiciyi beğendikten sonra sonucu bu şekilde sarmak zorunda kaldım .
Piotr Kula

11

Bunu dene:

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


7

Üst div kimliğini almak için:

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

Ayrıca, kodunuzu epeyce yeniden düzenleyebilirsiniz:

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

Artık bir düğme sınıfına gerek yok

açıklama
eq (0), jQuery nesnesinden bir öğe seçeceğiniz anlamına gelir, bu durumda öğe 0, dolayısıyla ilk öğe. http://docs.jquery.com/Selectors/eq#index
$ (selector) .siblings (siblingsSelector), siblingsSelector http://docs.jquery.com/Traversing ile eşleşen tüm kardeşleri (aynı ebeveyni olan öğeler) seçecektir. / siblings # ifade
$ (selector) .parents (parentSelector), üst seçiciyle eşleşen seçici tarafından eşleşen öğelerin tüm üst öğelerini seçer. http://docs.jquery.com/Traversing/parents#expr
Böylece: $ (selector) .parents ('div: eq (0)'); seçici ile eşleşen öğelerin ilk üst div'i ile eşleşir.

JQuery belgelerine, özellikle seçicilere ve geçişlere bir göz atmalısınız:


Basit ve kolay! Neden div: eq (0)? Bu ne demek?
Rich Bradshaw

Bence 'div: eq (0)', bunların tümü en az bir div içine sarılmışsa yanlış olur, çünkü DOM'un göreli değil, mutlak bir geçişini yapıyorsunuz. İlk öğe "en yakın" ebeveyn olsaydı iyi olurdu, ancak bu aksini gösteriyor: tinyurl.com/bbegow
Rob Grant

1
(bunun yerine parent () kullanmam)
Rob Grant


5

Bu, aşağıdakileri yaparak kolayca yapılabilir:

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

Bunu bir tablonun içindeki herhangi bir nesneye iliştirirsiniz ve size o tablonun kimliğini döndürür.


3

JQUery, DOM ağacını yukarı taşımak için .parents () yöntemine sahiptir, buradan başlayabilirsiniz.

Bunu daha anlamsal bir şekilde yapmakla ilgileniyorsanız, kodunuzda "yanıt budur" u anlamsal olarak tanımlamanın en iyi yolunun bir düğmede REL özniteliğini kullanmak olduğunu düşünmüyorum. Bu satırlarda bir şey tavsiye ederim:

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

ve

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

Doğrulama ve geri bildiriminizin nasıl çalıştığından tam olarak emin değilim, ancak fikri anladınız.


0

find () ve near () şunlardan biraz daha yavaş görünüyor:

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

$(this).parent().parent().attr("id");?
Alejandro Iván
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.