jQuery czy Selektor?

Zastanawiam się czy w selektorach jQuery można mieć logikę" lub". Na przykład, Wiem, że element jest albo potomkiem elementu z klasą classA lub classB, i chcę zrobić coś w stylu elem.parents('.classA or .classB'). Czy jQuery zapewnia taką funkcjonalność?

Author: BoltClock, 2010-02-15

5 answers

Użyj przecinka.

'.classA, .classB'

Możesz pominąć spację.

 453
Author: Daniel A. White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 07:47:10

Użycie przecinka może nie być wystarczające, jeśli masz wiele obiektów jQuery, które muszą być połączone.

.metoda add() dodaje wybrane elementy do zbioru wynikowego:

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

Jest bardziej wyrazisty niż '.classA, .classB', ale pozwala na budowanie bardziej złożonych selektorów, takich jak:

// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));
 64
Author: Alp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 15:14:31

Napisałem niesamowicie prosty (5 linijek kodu) plugin dla dokładnie tej funkcjonalności:

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

Pozwala skutecznie powiedzieć "get this element, or if that element doesn 't exist, use this element". Na przykład:

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

Podczas gdy zaakceptowana odpowiedź zapewnia podobną funkcjonalność do tej, jeśli oba selektory (przed i za przecinkiem) istnieją, oba selektory zostaną zwrócone.

Mam nadzieję, że to udowodni pomocny dla każdego, kto może wylądować na tej stronie za pośrednictwem google.

 17
Author: By Richard Powell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 16:24:17

Jeśli chcesz użyć standardowej konstrukcji elementu = element1 / / element2, gdzie JavaScript zwróci pierwszy, który jest prawdziwy, możesz to zrobić dokładnie tak:

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

Który zwróci pierwszy element, który został znaleziony. Jednak lepszym sposobem byłoby użycie jQuery selector comma construct (który zwraca tablicę znalezionych elementów) w ten sposób:

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

Który zwróci pierwszy znaleziony element.

Używam tego od czasu do czasu, aby znajdź aktywny element na liście lub jakiś element domyślny, jeśli nie ma aktywnego elementu. Na przykład:
element = $('ul#someList').find('li.active, li:first')[0] 

Które zwróci dowolne li Z klasą active lub, jeśli nie ma, zwróci tylko ostatnie li.

Albo zadziała. Istnieją jednak potencjalne kary za wydajność, ponieważ | / przestanie przetwarzać, gdy tylko znajdzie coś prawdziwego, podczas gdy podejście array będzie próbowało znaleźć wszystkie elementy, nawet jeśli już je znalazło. / Align = "left" | construct może potencjalnie mieć problemy z wydajnością, jeśli musi przejść przez kilka selektorów przed znalezieniem tego, który zwróci, ponieważ musi wywołać Główny obiekt jQuery dla każdego z nich(naprawdę Nie wiem, czy jest to hit wydajności, czy nie, po prostu wydaje się logiczne, że może być). Ogólnie jednak używam podejścia array, gdy Selektor jest dość długim ciągiem znaków.
 13
Author: Ken Dickinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-12 16:32:58

Daniel A. White rozwiązanie świetnie sprawdza się na zajęciach.

Mam sytuację, w której musiałem znaleźć pola wejściowe typu donee_1_card Gdzie 1 jest indeksem.

Moje rozwiązanie zostało

$("input[name^='donee']" && "input[name*='card']")
Chociaż nie jestem pewien, czy jest to optymalne.
 0
Author: FDussault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 14:36:30