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.