jQuery VEYA Seçici?


325

Ben jQuery seçicilerde "VEYA" mantık için bir yol olup olmadığını merak ediyorum. Örneğin, bir öğenin ya classA ya da classB sınıfına sahip bir öğenin torunu olduğunu biliyorum ve böyle bir şey yapmak istiyorum elem.parents('.classA or .classB'). JQuery bu işlevselliği sağlıyor mu?

Yanıtlar:


494

Virgül kullanın.

'.classA, .classB'

Alanı atlamayı seçebilirsiniz.


43
Bunun gerçekten bir 'veya' seçici olmadığını, daha çok birindeki birden fazla seçici gibi olduğunu belirtmek gerekir.
alex

49
@alex: ancak aynı öğeyi iki kez seçmez (bir birleştirme operatörünün seçeceği). Gerçekten bir OR seçicidir çünkü iki veya daha fazla setten oluşan bir birlik oluşturur (oysa AND bir kavşaktır).
cletus

Teşekkürler, işe yarıyor. Hata ayıklama denetimi nedeniyle virgül kullanmanın 'VE' anlamına geldiğini düşündüm.
Suan

38
ANDolurdu .classA.classB.
Daniel A. White

2
Aslında asıl sorunun ne ima ettiğine bağlı ... yani: klasik olarak bir 'veya' operatörü kısa devre yapacak. Böylece jquery dengesinde bir 'veya' operatörü de kısa devre yapabilir.
Mathew

71

Birleştirilmesi gereken birden fazla jQuery nesneniz varsa, virgül kullanmak yeterli olmayabilir.

.Add () metodu sonuç kümesi için seçilen elemanları ekler:

// classA OR classB
jQuery('.classA').add('.classB');

Daha ayrıntılı '.classA, .classB', ancak aşağıdaki gibi daha karmaşık seçiciler oluşturmanıza izin verir:

// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));

22

Tam olarak bu işlevsellik için inanılmaz derecede basit (5 satır kod) eklentisi yazdım:

http://byrichardpowell.github.com/jquery-or/

"Bu öğeyi al veya bu öğe yoksa bu öğeyi kullan" ifadesini etkili bir şekilde söylemenizi sağlar. Örneğin:

$( '#doesntExist' ).or( '#exists' );

Kabul edilen cevap buna benzer işlevsellik sağlarken, her iki seçici (virgülden önce ve sonra) varsa, her iki seçici de döndürülür.

Umarım bu sayfaya google üzerinden gelebilecek herkes için yararlı olur.


4
Boole OR operatörü bu şekilde çalışmaz. Her iki seçicinin de öğeleri döndürmesi durumunda, VEYA operatörü yalnızca ilk seçicinin öğelerini değil, hepsini döndürmelidir. Eklentiniz "ifEmpty" veya "else" veya bunun gibi bir adla adlandırılmalıdır.
Alp

13
@Alp: davranışını düşünün "a" || "b"vs. null || "b"vanilya JS. Burada aynı davranışı uygularsak, varsa $(a).or(b)geri dönmeli $(a), aksi takdirde geri dönmelidir $(b). "Veya" JS'nin davranışıyla eşleştiği için "bu isimlendirme ile ilgili yanlış bir şey olduğunu sanmıyorum || (veya) operatör.
FtDRbwLXw6

4
Ben de bunu bir olarak görüyorum or. Başkalarının konuştuğu şey daha çok bir eylem concatveya mergeeylem gibidir.
Léon Pelletier

1
Şahsen ben buna "ya da" demezdim, çünkü karışıklığa yol açabilir (teknik olarak doğru olsa bile, özel bir if / veya türü olduğu için). Bu, farklı şeyler olarak adlandırılan ve farklı dillerde farklı operatörlere sahip olan etkin bir boş birleşimdir: en.wikipedia.org/wiki/Null_coalescing_operator
JanErikGunnar

'Xor' (münhasır veya) terimi doğru terimdir, ancak xor genellikle veya genellikle ararken, xor genellikle belirli bir 'veya' türündedir.
liljoshu

17

Standart element = element1 || JavaScript'in doğru olan ilkini döndüreceği element2, tam olarak bunu yapabilirsiniz:

element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');

gerçekte bulunan ilk öğeyi döndürür. Ancak daha iyi bir yol, jQuery seçici virgül yapısını (bulunan öğelerin bir dizisini döndürür) bu şekilde kullanmak olabilir:

element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];

bulunan ilk öğeyi döndürür.

Ben zaman zaman bir listede etkin bir öğe veya etkin bir öğe yoksa bazı varsayılan öğe bulmak için kullanın. Örneğin:

element = $('ul#someList').find('li.active, li:first')[0] 

aktif sınıfı olan herhangi bir li'yi geri döndürür veya hiç olmazsa, sadece son li'yi döndürür.

İkisi de işe yarayacak. Yine de, potansiyel performans cezaları vardır || dizi yaklaşımı doğru bulmuş olsa bile işlemeyi durduracakken dizi yaklaşımı tüm öğeleri bulmaya çalışacaktır. Sonra tekrar || Yapı, geri dönecek olanı bulmadan önce birkaç seçiciden geçmesi gerekiyorsa potansiyel olarak performans sorunları yaşayabilir, çünkü her biri için ana jQuery nesnesini çağırması gerekir (bunun bir performans isabeti olup olmadığını gerçekten bilmiyorum, olması mantıklı görünüyor). Seçici oldukça uzun bir dize olduğunda, genel olarak, dizi yaklaşımını kullanın.


Bence find ('. SomethingToBeFound, .somethingElseToBeFound') || ile aynı değil yapı. Çünkü .somethingElseToBeFound dosyasının .somethingToBeFound öğesinden önce DOM'da olup olmadığını bulun.
remo

0

Sonunda nasıl yapıldığını kesmek buldum:

div:not(:not(.classA,.classB)) > span

(div'ı classAOR sınıfıyla classBve doğrudan alt aralıkla seçer )


-2

Daniel A. White Solution sınıflar için harika çalışıyor.

Ben 1 bir dizin olduğu donee_1_card gibi girdi alanları bulmak zorunda bir durum var .

Benim çözümüm

$("input[name^='donee']" && "input[name*='card']")

Ne kadar optimal olduğundan emin değilim.

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.