jQuery O Selettore?

Mi chiedo se c’è un modo per avere la logica “OR” nei selettori jQuery. Ad esempio, so che un elemento è un discendente di un elemento con class class A o class B, e voglio fare qualcosa come elem.parents('.classA or .classB') . JQuery fornisce tale funzionalità?

Usa una virgola.

 '.classA, .classB' 

Puoi scegliere di omettere lo spazio.

L’uso di una virgola potrebbe non essere sufficiente se si hanno più oggetti jQuery che devono essere uniti.

Il metodo .add () aggiunge gli elementi selezionati al set di risultati:

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

È più '.classA, .classB' di '.classA, .classB' , ma ti permette di build selettori più complessi come il seguente:

 // (classA which has 

descendant) OR (

ancestors of classB) jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));

Ho scritto un plugin incredibilmente semplice (5 linee di codice) esattamente per questa funzionalità:

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

Ti permette di dire in modo efficace “ottieni questo elemento, o se quell’elemento non esiste, usa questo elemento”. Per esempio:

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

Anche se la risposta accettata fornisce una funzionalità simile a questa, se entrambi i selettori (prima e dopo la virgola) esistono, entrambi i selettori verranno restituiti.

Spero che si riveli utile a chiunque possa arrivare su questa pagina tramite google.

Se stai cercando di usare il costrutto standard di element = element1 || element2 dove JavaScript restituirà il primo che è vero, potresti fare esattamente questo:

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

che restituirebbe il primo elemento effettivamente trovato. Ma un modo migliore sarebbe probabilmente quello di utilizzare il costrutto virgola jQuery selector (che restituisce una matrice di elementi trovati) in questo modo:

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

che restituirà il primo elemento trovato.

Di tanto in tanto lo uso per trovare un elemento attivo in una lista o qualche elemento predefinito se non ci sono elementi attivi. Per esempio:

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

che restituirà qualsiasi li con una class triggers o, se non ce ne sono, restituirà solo l’ultimo li.

O funzionerà. Esistono tuttavia potenziali penalizzazioni in termini di prestazioni, in quanto || smetterà di processare non appena troverà qualcosa di vero mentre l’approccio dell’array cercherà di trovare tutti gli elementi anche se ne ha già trovato uno. Poi di nuovo, usando il || il costrutto potrebbe potenzialmente avere problemi di prestazioni se deve passare attraverso diversi selettori prima di trovare quello che restituirà, perché deve chiamare l’object jQuery principale per ognuno (non so davvero se questo è un successo o meno, sembra logico che potrebbe essere). In generale, però, utilizzo l’approccio array quando il selettore è una stringa piuttosto lunga.

Daniel A. White Solution funziona alla grande per le classi.

Ho una situazione in cui ho dovuto trovare campi di input come donee_1_card dove 1 è un indice.

La mia soluzione è stata

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

Anche se non sono sicuro di quanto sia ottimale.