2009-07-02 9 views
45

que saben cómo obtener los elementos con un atributo particular:¿Cómo puedo obtener los elementos sin un atributo particular de jQuery

$("#para [attr_all]") 

Pero, ¿cómo puedo obtener los elementos sin un atributo particular? Trato

$("#para :not([attr_all])") 

Pero no funciona. ¿Cuál es la forma correcta de hacer esto?

te voy a dar un ejemplo:

<div id="para"> 
    <input name="fname" optional="1"> 
    <input name="lname"> 
    <input name="email"> 
</div> 

jQuery:

$("#para [optional]") // give me the fname element 
$("#para :not([optional])") //give me the fname, lname, email (fname should not appear here) 

Respuesta

18

La primera cosa que viene a la mente (tal vez sub óptima):

$('p').filter(function(){ 
    return !$(this).attr('attr_all'); 
}); 

Sin embargo p:not([attr_all]) debería funcionar, por lo que creo que algo más está sucediendo en el código.

+1

Finalmente resolví el problema y fue causado por otra parte del código y entonces marcaré esto como la respuesta. – Billy

+5

Consulte la respuesta a continuación con los votos superiores más elevados. – WildService

5

Trate $("#para [attr!=val]").

Su :not realmente debería funcionar, lo que me hace sospechar que algo más está sucediendo.

Para obtener una lista completa de los selectores de atributos, consulte el jQuery Selectors docs.

+0

No funciona. – Billy

+0

Sí, creo que su problema está en el contexto, no en este selector. – chaos

+0

+1. Tenga en cuenta que este selector es específico de JQuery. No se define como un selector de atributos CSS, por lo que no se puede usar para diseñar elementos de estilo (a través de CSS): http://www.w3.org/TR/CSS2/selector.html#attribute-selectors – PatrikAkerstrand

102

Si su ejemplo de código es el código exacto que está utilizando, creo que el problema es un espacio errante.

$("#para :not([attr_all])") 

debería ser

$("#para:not([attr_all])") 

Si deja un espacio allí, selecciona descendientes de #para.

+7

esta es la respuesta correcta –

+3

Esta es la respuesta correcta, pulgar arriba –

+9

Pero, de la pregunta original, ¡el OP ** quiere ** seleccionar los descendientes! –

7

Una forma más rápida de hacer esto es obtener primero todos los elementos con el ID para (que es HTML no válido si hay más de uno, considere usar una clase) y usar el filtro (o buscar según cómo HTML se construye) método sólo para obtener los elementos sin el atributo de este modo:

$('#para').filter(':not([attr_all])'); 

hacer esto usted está teniendo jQuery hacer mucho menos trabajo, ya que sólo se recorre un subconjunto más pequeño de elementos para conseguir los que no tienen el atributo . Hacerlo con una declaración de selector único, por ejemplo $("#para :not([attr_all])"), hará que jQuery obtenga todos los elementos sin el atributo, luego los filtrará para los que tengan el ID del párrafo.

1

La respuesta de Frank DeRosa es correcta, pero dado que OP quiere encontrar a los descendientes, está un poco mal. Probando por mi cuenta, parece que debería estar funcionando como está, pero es posible que lo que está ejecutando no le guste que el operador ':' se use directamente como descendiente. Trate de usar

$("#para input:not([optional])") 

Hubiera dejado un comentario pero todavía no.

+1

O tal vez un selector más amplio: '$ (" # para *: not ([optional]) ")' – Gideon

Cuestiones relacionadas