2012-05-21 12 views
73

Estoy pensando en, si es posible en jQuery seleccionar elementos por atributos con nombre usando AND y OR.jQuery seleccionar por atributo usando los operadores 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 en los que myc="blue" pero sólo aquellos con myid conjunto en 1 o 3.

Así que he intentado:

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 especiales de filtro?

+6

NB: No debería estar haciendo sus propios atributos como '' myc' y myid'. Si está usando HTML5, póngales un prefijo 'data-': 'data-myc' y' data-myid'. – RoToRa

+0

guau, 8 respuestas en 10 minutos ... parece que hice una pregunta novato. ¡lo siento! : -/ –

+1

@TheBndr No, es una pregunta interesante y la mayoría de las respuestas tiene diferentes enfoques y tu pregunta obtuvo 3 votos positivos + 2 favoritos ... definitivamente una buena pregunta. –

Respuesta

132

Y operación

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

O operación, utilice comas

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

Como se comentó @Vega:

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

Creo que quiere el 'myc == azul && (id == 1 || id == 3)' –

+1

si uso 'a = $ ('[myc =" blue "] [myid =" 1 "] , [myid = "3"] '); 'significa' ([myc = "azul"] AND [myid = "1"]) O [myid = "3"] 'o' ([myc = "azul "]) AND ([myid =" 1 "] OR [myid =" 3 "])' Estoy buscando el 2do. // Editar: ¡gracias por esa actualización! :-) –

11

¿Cómo escribir un filtro como el de abajo,

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

Editar: @Jack Gracias .. totalmente perdido ..

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

DEMO

+0

Es 'myid', no' id' :) –

+0

@Jack. Perdí por completo ese ... ¡Gracias! –

-1

jQuery utiliza selectores CSS para seleccionar elementos, por lo que sólo tiene que utilizar más de una regla de separándolos con comas, así:

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

Editar:

Lo sentimos, que querían azul y 1 ó 3. ¿Qué tal:

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

Poner los dos selectores de atributos juntos le da y, usando una coma le da O.

+1

Creo que él quiere el 'myc == blue && (id == 1 || id == 3)' –

+0

Gracias Vega, actualizado. – philnash

+0

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

-1

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

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

Alternativamente, es posible llevar a cabo usando taquigrafía en un solo selector, donde jamming selectores juntos actúa como un AND y separar con una coma actúa como un OR:

var elements = $('[myc="blue"][myid="1"], [myid="3"]'); 
5

el operador AND en un selector es solo una cadena vacía, y el operador o es la coma. Sin embargo

No hay ninguna agrupación o prioridad, así que hay que repetir una de las condiciones:

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

¿necesitas esas cotizaciones? Quiero decir por consistencia ... probablemente solo yo. >. < –

+1

@Vega: No necesita las comillas para cadenas simples como 'azul', pero no estaba seguro acerca de los valores numéricos, así que las guardé. – Guffa

1

En el caso especial sería

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

uso simple .filter()[docs] (Y) usando la multiple selector[docs] (OR):

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

En general, los selectores de encadenamiento, li ke a.foo.bar[attr=value] es una especie de selector AND.

jQuery tiene extensive documentation acerca de los selectores compatibles, vale la pena leerlos.

+0

¿sabes si esto es más rápido que la respuesta de gabe? –

+0

No lo sé, tal vez, tal vez no. –

5

En primer lugar encontrar la condición que se produce en todas las situaciones, luego filtrar las condiciones especiales:

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