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?jQuery O Selector?
Respuesta
Use una coma.
'.classA, .classB'
Puede optar por omitir el espacio.
Usar una coma puede no ser suficiente si tiene varios objetos jQuery que necesitan unirse.
El método .add() añade los elementos seleccionados para el conjunto de resultados:
// classA OR classB
jQuery('.classA').add('.classB');
Es más detallado de lo '.classA, .classB'
, pero le permite crear selectores más complejas como la siguiente:
// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));
he escrito 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');
Mientras que la respuesta aceptada proporciona una funcionalidad similar a esto, si existen ambos selectores (antes & después de la coma), se devolverán ambos selectores.
Espero que sea útil para cualquiera que pueda acceder a esta página a través de google.
Así no funciona el operador OR booleano. Si ambos selectores devuelven elementos, el operador OR debería devolverlos a todos y no solo a los elementos del primer selector. Su complemento debe llamarse "ifEmpty" o "else" o algo así. – Alp
@Alp: considere el comportamiento de '" a "|| "b" 'contra' nulo || "b" 'en vainilla JS. Si aplicamos el mismo comportamiento aquí, '$ (a) .or (b)' debería devolver '$ (a)' si existe, de lo contrario debería devolver '$ (b)'. No creo que haya nada de malo en esta nomenclatura, ya que el "o" coincide con el comportamiento de JS "||" (o) operador – FtDRbwLXw6
También lo veo como un 'o'. Lo que otros están hablando es más como una acción 'concat' o' merge'. –
Si está buscando utilizar la construcción estándar de element = element1 || elemento2 donde JavaScript volverá la primera que es Truthy, se podría hacer exactamente eso:
element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');
que devolver el primer elemento que se encuentra realmente. Pero de una manera mejor, probablemente sería utilizar el selector de construcción coma jQuery (que devuelve un conjunto de elementos que se encuentran) de esta manera:
element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];
que devolverá el primer elemento que se encuentra.
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, en caso de no existir éste, se acaba de 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 cómo óptima es.
- 1. jQuery CSS 'o' selector
- 2. ¿Elemento o clase selector LIKE para jQuery?
- 3. jQuery selector con "y" y "o"
- 4. jQuery selector vacío (selector nulo)
- 5. jquery: selector []?
- 6. jQuery selector
- 7. Jquery Selector - Artículos múltiples
- 8. jQuery selector para "Html.CheckBoxFor"
- 9. jQuery selector de imagen
- 10. jQuery selector valor
- 11. ¿Explicar este selector jQuery?
- 12. JQuery CSS Selector e.fn.e.init
- 13. jQuery pregunta Sub Selector
- 14. jQuery $ (this) Selector Niño
- 15. jQuery Color ** Swatch ** Selector
- 16. Contexto del selector jQuery
- 17. Jquery ¿Excluir un selector?
- 18. jQuery Week Selector
- 19. jQuery nth-child selector
- 20. jQuery: selector nth-child()
- 21. Selector múltiple usando jQuery
- 22. jQuery selector Y operador
- 23. jQuery selector dinámico
- 24. jQuery Zebra selector
- 25. Concatenar en jQuery Selector
- 26. jquery selector anidado
- 27. jQuery selector de imágenes
- 28. jQuery selector personalizado, "indefinido"
- 29. Live testing jQuery selector
- 30. jQuery parent() ("selector")
Cabe señalar que este no es realmente un selector 'o', más como selectores múltiples en uno. – alex
@alex: pero no seleccionará el mismo elemento dos veces (lo que haría un operador de concatenación). Realmente es un selector OR porque crea una UNIÓN de dos o más conjuntos (mientras que AND es una intersección). – cletus
Gracias, eso funciona. Debido a una supervisión de depuración, pensé que usar una coma significa 'AND'. – Suan