jQuery selecciona por atributo usando operadores AND y OR


105

Estoy pensando en si es posible en jQuery seleccionar elementos por atributos con nombre usando AND y OR.

Ejemplo:

<div myid="1" myc="blue">1</div>
<div myid="2" myc="blue">2</div>
<div myid="3" myc="blue">3</div>
<div myid="4">4</div>

Me gustaría seleccionar todos los elementos donde, myc="blue"pero solo aquellos que están myidconfigurados en 1 o 3.

Así que intenté:

a=$('[myc="blue"] [myid="1"]  [myid="3"]');

pero no funciona, lo mismo aquí:

a=$('[myc="blue"] && [myid="1"] || [myid="3"]');

¿Es posible sin escribir funciones de filtro especiales?


7
NB: No debería inventar sus propios atributos como mycy myid. Si está utilizando HTML5 como prefijo data-: data-mycy data-myid.
RoToRa

@RoToRa, ¿hay documentación en HTML5 que diga que debería hacerlo? La mayoría de los sitios web que veo usan lo que el cerebro del desarrollador piensa en ese momento ...
Alexis Wilke

1
El hecho de que la gente lo haga no significa que sea correcto. Consulte la Sección 3.2.1 de HTML5 : "Los autores no deben usar elementos, atributos o valores de atributo que no estén permitidos por esta especificación u otras especificaciones aplicables, ya que hacerlo dificulta significativamente la extensión del lenguaje en el futuro".
RoToRa

1
Es un mal ejemplo de una buena pregunta. ¿Qué pasa con los diferentes tipos de elementos como las entradas?
jesus g_force Harris

Respuestas:


193

Y operación

a=$('[myc="blue"][myid="1"][myid="3"]');

O operación, use comas

a=$('[myc="blue"],[myid="1"],[myid="3"]');

Como comentó @Vega:

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]');

1
Creo que quiere es elmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

2
si uso a=$('[myc="blue"] [myid="1"],[myid="3"]');¿significa ([myc="blue"] AND [myid="1"]) OR [myid="3"]o ([myc="blue"]) AND ([myid="1"] OR [myid="3"]) estoy buscando el segundo? // Editar: ¡gracias por esa actualización! :-)
The Bndr


10

¿Qué tal escribir un filtro como el siguiente?

$('[myc="blue"]').filter(function () {
   return (this.id == '1' || this.id == '3');
});

Editar: @Jack Gracias ... me lo perdí totalmente ...

$('[myc="blue"]').filter(function() {
   var myId = $(this).attr('myid');   
   return (myId == '1' || myId == '3');
});

MANIFESTACIÓN


5

El operador y en un selector es solo una cadena vacía y el operador o es la coma.

Sin embargo, no hay agrupación ni prioridad, por lo que debe repetir una de las condiciones:

a=$('[myc=blue][myid="1"],[myc=blue][myid="3"]');

¿Necesitas esas citas? Me refiero solo a la coherencia ... probablemente solo a mí. >. <
Selvakumar Arumugam

1
@Vega: No necesitas comillas para cadenas simples como blue, pero no estaba seguro de los valores numéricos, así que las guardé.
Guffa

5

Primero encuentre la condición que ocurre en todas las situaciones, luego filtre las condiciones especiales:

$('[myc="blue"]')
    .filter('[myid="1"],[myid="3"]');

1

En tu caso especial sería

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]');

0

JQuery usa selectores CSS para seleccionar elementos, por lo que solo necesita usar más de una regla separándolos con comas, así:

a=$('[myc="blue"], [myid="1"], [myid="3"]');

Editar:

Lo siento, querías azul y 1 o 3. Qué tal:

a=$('[myc="blue"][myid="1"],  [myid="3"]');

Poner los dos selectores de atributos juntos le da Y, usar una coma le da OR.


1
Creo que quiere es elmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

Necesita repetir el [myc="blue"]selector en el segundo ejemplo.
RoToRa

-1

Para seleccionar correctamente los elementos utilizando las operaciones lógicas que ha indicado, solo necesita jQuery.filter()la ANDoperación, no las "funciones de filtro especiales". También necesitas jQuery.add()para la ORoperación.

var elements = $('[myc="blue"]').filter('[myid="1"').add('[myid="3"');

Alternativamente, es posible lograrlo usando taquigrafía en un solo selector, donde los selectores de interferencia juntos actúan como un ANDy separándolos con una coma actúa como un OR:

var elements = $('[myc="blue"][myid="1"], [myid="3"]');
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.