SORU
8 ŞUBAT 2011, Salı


Bir sonraki eşleşen bir eş bulmak için etkili, kısa ve öz bir şekilde?

Yapıştırma için resmi jQuery API, bir daha kısa, ama daha az etkili bir yol bulmak sonraki kardeş unsuru eşleşen belirli bir seçici dışında kullanma nextAll :first pseudo-sınıf?

Resmi API dediğimde iç hack, düz Cızırtı olacak, eklenti karışımı içine, vb bir ekleme demek değil. Ben bunu yapmak zorunda sonunda, öyle olsun, ama bu bir soru değil.)

E. g, bu yapısı göz önüne alındığında:

<div>One</div>
<div class='foo'>Two</div>
<div>Three</div>
<div class='foo'>Four</div>
<div>Five</div>
<div>Six</div>
<div>Seven</div>
<div class='foo'>Eight</div>

Ben this 9 *(*ne olursa olsun 11 *bir işleyici, belki) ve seçici "div.eşleşen sonraki eş div bulmak istiyorsanız"bunu yapabilirim: . foo

var nextFoo = $(this).nextAll("div.foo:first");

...ve işe yarıyor (eğer ben başlangıç ile "Beş", örneğin, atlar "sekiz" ve "Yedi" ve buluntular "Sekiz" benim için), ama aksak ve istersem maç ilk herhangi birkaç seçiciler, çok clunkier. (Kabul ediyorum, birçokham DOM daha kısa döngü...)

Aslında ben de öyle istiyorum:

var nextFoo = $(this).nextMatching("div.foo");

...nextMatching nereye seçiciler dizi kabul edebilir. Her zaman next(selector) bunu yapmaz şaşırdım, ama değil, ve doktorlar da net, bu kadar değil...

Her zaman bunu yapıyorum ve yayınlanan API bağlı kalırsak, işler oldukça verimsiz olsa bile bunu yazıp ekleme yapabilirim. Örneğin,ï na; next döngü ve:

jQuery.fn.nextMatching = function(selector) {
    var match;

    match = this.next();
    while (match.length > 0 && !match.is(selector)) {
        match = match.next();
    }
    return match;
};

...nextAll("selector:first") daha markedly slower. Ve bu hiç de şaşırtıcı değil, nextAll Her şey Cızırtı kapalı ve Cızırtı iyice getirilmiştir. Na&; ve döngü yukarıda ve uzakta geçici nesneler her türlü oluşturur atar ve yeniden ayrıştırmak için seçici her zaman, yavaş büyük bir sürprizi var iuml.

Ve tabii ki, sadece ucunda :first atamam:

jQuery.fn.nextMatching = function(selector) {
    return this.nextAll(selector   ":first"); // <== WRONG
};

...çünkü o "div.gibi basit seçiciler ile çalışır foo", başarısız olur "birkaç" hakkında konuştuk seçenek, "div.dediğin gibi foo, div.". bar

EditÜzgünüm, gerekendi: son olarak, ben sadece kullanmak .nextAll() ve .first() sonuç, ama sonra bir WordPress kullanmak zorunda kalır ziyaret tüm kardeşler sadece ilk. Ama ilk sonuçlar atın Bu sadece bir maç olduğunda durdurmak ziyade tam listesi ile vermek istiyorum. (Ne gibi görünüyor olsa dagerçektenhızlı; speed comparison bağlantılı önceki son test çalışması.)

Şimdiden teşekkürler.

CEVAP
8 ŞUBAT 2011, Salı


.nextAll() 30 *pas ve bu sonuca göre* 32 *kullanabilirsiniz

var nextFoo = $(this).nextAll("div.foo, div.something, div.else").first();

Düzenleme:Sadece karşılaştırma için, burada eklenir test paketi: http://jsperf.com/jquery-next-loop-vs-nextall-first/2 Bu yaklaşım çok daha hızlı çünkü basit bir kombinasyon teslim .nextAll() seçici için yerel kod mümkün (her geçerli tarayıcı) ve sadece ilk sonuç kümesi....yolhızlı bir döngü daha tamamen JavaScript ile yapabilirsin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • spyib

    spyib

    9 Ocak 2007