jQuery O Selector?

Me pregunto si hay una forma de tener lógica “O” en los selectores jQuery. Por ejemplo, sé que un elemento es un descendiente de un elemento con clase classA o classB, y quiero hacer algo como elem.parents('.classA or .classB') . ¿JQuery proporciona esa funcionalidad?

Usa una coma

 '.classA, .classB' 

Puedes elegir omitir el espacio.

Usar una coma puede no ser suficiente si tiene múltiples objetos jQuery que necesitan unirse.

El método .add () agrega los elementos seleccionados al conjunto de resultados:

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

Es más detallado que '.classA, .classB' , pero le permite crear selectores más complejos como los siguientes:

 // (classA which has 

descendant) OR (

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

Escribí un plugin increíblemente simple (5 líneas de código) para exactamente esta funcionalidad:

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

Le permite decir efectivamente “obtener este elemento, o si ese elemento no existe, use este elemento”. Por ejemplo:

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

Si bien la respuesta aceptada proporciona una funcionalidad similar a esta, si ambos selectores (antes y después de la coma) existen, se devolverán ambos selectores.

Espero que sea útil para cualquiera que pueda aterrizar en esta página a través de google.

Si estás buscando usar la construcción estándar de element = element1 || element2 donde JavaScript devolverá el primero que es verdad, podrías hacer exactamente eso:

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

que devolvería el primer elemento que realmente se encuentra. Pero una forma mejor sería usar la construcción de la coma del selector jQuery (que devuelve una matriz de elementos encontrados) de esta manera:

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

que devolverá el primer elemento encontrado.

Lo uso de vez en cuando para encontrar un elemento activo en una lista o algún elemento predeterminado si no hay un elemento activo. Por ejemplo:

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

que devolverá cualquier li con una clase de activo o, si no hay ninguno, devolverá el último li.

Cualquiera de los dos funcionará. Sin embargo, hay posibles penalizaciones de rendimiento, ya que || dejará de procesarse tan pronto como encuentre algo cierto, mientras que el método de matriz intentará encontrar todos los elementos, incluso si ya ha encontrado uno. Entonces otra vez, usando el || construct podría tener problemas de rendimiento si tiene que pasar por varios selectores antes de encontrar el que devolverá, porque tiene que llamar al objeto jQuery principal para cada uno (realmente no sé si esto es un golpe de rendimiento o no, parece lógico que podría ser). En general, sin embargo, utilizo el enfoque de matriz cuando el selector es una cadena bastante larga.

Daniel A. White Solution funciona muy bien para las clases.

Tengo una situación en la que tuve que encontrar campos de entrada como donee_1_card, donde 1 es un índice.

Mi solución ha sido

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

Aunque no estoy seguro de cuán óptimo es.