jQuery “this” in ilk çocuğu


317

"Bu" tıklatılan bir span daha sonra o tıklatılan öğenin ilk alt jQuery yürütmek için bir jQuery işlevine geçmeye çalışıyorum. Doğru gibi görünmüyor ...

<p onclick="toggleSection($(this));"><span class="redClass"></span></p>

JavaScript:

function toggleSection(element) {
  element.toggleClass("redClass");
}

Öğenin ilk alt öğesine nasıl başvurabilirim?


4
JQuery kullanıyorsanız, neden jQuery kullanarak olay işleyicileri bağlamıyorsunuz?
— Vivin Paliath

2
çünkü bind olay işleyicileri bir performans isabeti ekleyen document.ready () içinde başlatılmalıdır (bu IE6 için bir uygulamadır). Ya da başka bir yol var mı?
— macca1

Hım .. emin değilim. JQuery kullanarak ciltleme standart yoldur (zaten jQuery kullanıyorsanız). Kullandığınızda ne tür bir performans artışı yaşıyorsunuz jQuery(document).ready(...)?
— Vivin Paliath

7 + geliştiricileri ile büyük bir uygulamadır. Biraz temizlemek için önce 4 + saniye oldu. Bu yüzden yapmak zorunda olmadığımda daha fazla eklemeyi tercih ederim :)
— macca1

Yanıtlar:


482

Varolan bir jQuery kümesi tarafından sağlanan bağlama bir seçici uygulamak isterseniz, find () işlevini deneyin :

element.find(">:first-child").toggleClass("redClass");

Jørn Schou-Rode muhtemelen bağlam öğesinin ilk doğrudan torununu , dolayısıyla çocuk seçiciyi (>) bulmak istediğinizi belirtti . Ayrıca find () işlevine çok benzeyen children () işlevini de kullanabileceğinizi belirtiyor , ancak hiyerarşide yalnızca bir seviye derinlikte arama yapıyor (ihtiyacınız olan tek şey bu ...):

element.children(":first").toggleClass("redClass");

1
Teşekkürler! Mükemmel çalışıyor. Aşağıda listelenen diğer yolların da işe yarayacağını hayal ediyorum.
— macca1

6
find()Tüm torunları araştırıyor ve :first-childebeveyn başına bir öğe eşleşebilir inanıyorum . Bu nedenle, bu sorgunun birkaç öğe döndürmesi olasıdır. Yoksa yanılıyor muyum?
— Jørn Schou-Rode

19
Bunun eski bir soru / cevap olduğunu biliyorum, ancak ">" seçicisinin bu seçicide ebeveyn olmadan kullanımı amortismana tabi tutuldu (örneğin, ">: ilk çocuk") jQuery 1.8'den itibaren. Bunun yerine element.children(":first-child")veyaelement.children().first();
— Kevin B

3
@KevinB anlaşılan onlar sonuçta itiraz etmemeye karar verdiler
— Alnitak

1
en iyi yaklaşım, tüm öğeler üzerinde tekrarlamak ve daha sonra bazılarının önerdiği gibi ilkini seçmek DEĞİLDİR. Bu KÖTÜ olurdu.
— vsync


51

İlk çocuğu almak için farklı yaklaşımların hız farkını görmek için jsperf testi ekledim (toplam 1000+ çocuk)

göz önüne alındığında, notif = $('#foo')

jQuery yolları:

  1. $(":first-child", notif) - 4.304 ops / sn - en hızlı
  2. notif.children(":first") - 653 ops / sn -% 85 daha yavaş
  3. notif.children()[0] - 1.416 ops / sn -% 67 daha yavaş

Yerel yollar:

  1. JavaScript yerel ' ele.firstChild- 4.934.323 ops / sn (yukarıdaki tüm yaklaşımlara kıyasla% 100 daha yavaş firstChild)
  2. JQery'den yerel DOM ele: notif[0].firstChild- 4.913.658 ops / sn

Bu nedenle, en azından ilk çocuk için ilk 3 jQuery yaklaşımı önerilmemektedir (başka birçok durumda da böyle olacağını sanmıyorum). Eğer ilk çocuğu almak için bir jQuery nesnesi ve ihtiyaç varsa, o yerli DOM öğesi almak dizisi referans kullanarak, jQuery nesneden [0] (önerilir) veya .get(0)ve kullanımı ele.firstChild. Bu, normal JavaScript kullanımıyla aynı sonuçları verir.

tüm testler Chrome Canary sürüm v15.0.854.0'da yapılır


20
Aslında, firstChildjQuery children()veya seçici sorgularıyla aynı sonuçları vermeyecektir . firstChildnadiren istenen metin düğümlerini içerecektir. jQuery'nin contents()işlevi olacak bunları içerir, ancak children()olmaz. firstElementChildİlk alt öğeyi verecek olan yeni tarayıcılar desteklenir , ancak IE <9 bunu desteklemez. Bu nedenle, kullanırsanız firstChild, ilk metin olmayan düğüm alt öğesini el ile bulmanız gerekir.
— Maksimum

1
$(":first-child", notif)$(":first", notif)beklenen davranış için olmalıdır . Birincisi tüm ilk alt öğe torunlarını iade edecektir.
— Drazen Bjelovuk

18
element.children().first();

Tüm çocukları bul ve ilk önce onları al.


1
Şimdiye kadar en basit yöntem ve daha verimli .children(':first').
— Gras Double

3
Nasıl daha verimli? Görünüşe göre tüm çocukları alıyor, sonra ilk çocuğu alıyor, sadece ilk çocuğu almak gibi.
— Anthony McGrath

9

Denedin mi

$(":first-child", element).toggleClass("redClass");

Öğenizi aramanız için bir bağlam olarak ayarlamak istediğinizi düşünüyorum. Başka bir jQuery guru'nun buraya atlayıp size atması için bunu yapmanın daha iyi bir yolu olabilir :)


3
elementbüyük çocukları varsa bu başarısız olur
— Alnitak

4

Sadece .firstElementChildmümkünse kullanan bir eklenti yazdım ve gerekirse her bir düğüm üzerinde tekrarlamaya düştüm :

(function ($) {
    var useElementChild = ('firstElementChild' in document.createElement('div'));

    $.fn.firstChild = function () {
        return this.map(function() {
            if (useElementChild) {
                return this.firstElementChild;
            } else {
                var node = this.firstChild;
                while (node) {
                    if (node.type === 1) {
                        break;
                    }
                    node = node.nextSibling;
                }
                return node;
            }
        });
    };
})(jQuery);

Saf bir DOM çözümü kadar hızlı değil, ancak Chrome 24 altındaki jsperf testlerinde , diğer herhangi bir jQuery seçici tabanlı yöntemden daha hızlı birkaç büyüklük siparişiydi.


1
Bu eklentiyi beğendim - ancak 2 sorun var: 1) Eklenti komut dosyası document.bodyhenüz başlatılmadığı için kafaya dahil edilemez, 2) Performans, çocuk düğümlerinin sayısı çok yüksekse alternatiflerden çok daha iyidir. Sadece birkaç çocuk için (10'dan az söyleyin) $('>:first-child',context)biraz daha hızlıdır. Derinliği değil, yalnızca çocuk sayısı performansı etkiler.
— codefactor

@codefactor hakkında iyi bir noktaya document.bodybakacağım.
— Alnitak

4

DOM'u kullanabilirsiniz

$(this).children().first()
// is equivalent to
$(this.firstChild)


1

lütfen bu ilk şey gibi kullanın p "myp" gibi etiketlemek için bir sınıf adı verin

sonra aşağıdaki kodu kullanın

$(document).ready(function() {
    $(".myp").click(function() {
        $(this).children(":first").toggleClass("classname"); // this will access the span.
    })
})

-3

Hemen ilk çocuğu istiyorsanız, ihtiyacınız olan

    $(element).first();

Dom'da öğenizden belirli bir ilk öğe istiyorsanız, aşağıda kullanın

    var spanElement = $(elementId).find(".redClass :first");
    $(spanElement).addClass("yourClassHere");

deneyin: http://jsfiddle.net/vgGbc/2/


11
bu sadece yanlıştır - eğer elementbir DOM düğümü $(element).first()ise $(element)ilk çocuğuna değil , eşdeğerdir .
— Alnitak

1
Kabul, öğe bir DOM düğümü ise $ (element) .first () eşdeğer $ (element) bu bana
— nakavtJS
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.