2009-08-23 20 views
576

Duplicar posibles:
Check existence of an attribute with JQueryjQuery hasattr comprobación para ver si hay un atributo en un elemento

¿Cómo comprobar si hay un atributo en un elemento de jQuery? Similar a hasClass, pero con attr?

Por ejemplo,

if ($(this).hasAttr("name")) { 
    // ... 
} 
+0

aquí es un plugin de jQuery que parece hacer exactamente lo que busca -> http://plugins.jquery.com/project/hasAttr – bmarti44

+3

bmarti44 Parece que el enlace se pudría alguna. – MrBoJangles

+0

http://stackoverflow.com/questions/1318076/jquery-hasattr-checking-to-see-if-there-is-an-attribute-on-an-element Aquí hay una mejor respuesta. – Imad

Respuesta

898
var attr = $(this).attr('name'); 

// For some browsers, `attr` is undefined; for others, 
// `attr` is false. Check for both. 
if (typeof attr !== typeof undefined && attr !== false) { 
    // ... 
} 
+0

Ahah, gracias. Esta es la respuesta correcta para mí porque regresar indefinido no es lo que quiero. Gracias de nuevo. – Mark

+12

Probablemente sería mejor que hacer algo como: if (! Typeof ($ (this) .attr ('nombre')) = 'indefinido') {// ... } ya no definido puede en realidad ser redefinido usando un simple: undefined = 1 –

+0

@Shane Tomlinson, Yup; Estoy enterado * ahora *. Esta publicación se realizó hace más de un año cuando no conocía la mayoría de las peculiaridades de JavaScript. No obstante, he actualizado mi respuesta; Gracias. – strager

75

Estás tan cerca que es una locura.

if($(this).attr("name")) 

No hay hasattr pero lanzó un atributo por su nombre simplemente devolverá indefinido si no existe.

Esta es la razón por la que funciona a continuación. Si elimina el atributo de nombre de # encabezado, se activará la segunda alerta.

Actualización: De acuerdo con los comentarios, el siguiente será SOLO trabajo si el atributo está presente Y se establece en algo que no es si el atributo está ahí, pero vacía

<script type="text/javascript"> 
$(document).ready(function() 
{ 
    if ($("#heading").attr("name")) 
     alert('Look, this is showing because it\'s not undefined'); 
    else 
     alert('This would be called if it were undefined or is there but empty'); 
}); 
</script> 
<h1 id="heading" name="bob">Welcome!</h1> 
+1

El comportamiento es el mismo en ambos casos sin embargo. Puede cambiar una evaluación de falso con indefinido en la instancia que estoy mostrando allí. .attr ("nombre") no devuelve falso, pero está evaluando a falso. Entonces puedes usarlo exactamente de la manera de arriba. –

+15

si el nombre attr está presente pero cadena vacía, el atributo existiría pero la prueba fallaría. – lambacck

+4

La pregunta era si el atributo estaba allí, no qué hacer si estaba vacío. –

130

Si va a verificar la existencia de atributos con frecuencia, le sugiero que cree una función hasAttr, para usarla como formuló la hipótesis en su pregunta:

$.fn.hasAttr = function(name) { 
    return this.attr(name) !== undefined; 
}; 

$(document).ready(function() { 
    if($('.edit').hasAttr('id')) { 
     alert('true'); 
    } else { 
     alert('false'); 
    } 
}); 

<div class="edit" id="div_1">Test field</div> 
+3

@TreeUK - no es un error tipográfico,! == es lo que quise decir. – karim79

+2

Genial, no había visto eso antes :) [! == no es exactamente igual a (valor y tipo)] –

+1

"indefinido" no es una palabra clave en javascript (ver http://constc.blogspot.com/ 2008/07/undeclared-undefined-null-in-javascript.html). Poniendo "var undefined;" como la primera línea de su función hasAttr() es la solución más fácil para esto. – mhenry1384

14

La mejor manera de hacerlo sería con filter():

$("nav>ul>li>a").filter("[data-page-id]"); 

aún sería bueno tener .hasAttr(), pero ya que no existe no es de esta manera.

+1

Y puede filtrarlo por valor como '$ (" nav> ul> li> a "). Filter (" [data-page-id = 123] ");' –

+0

cómo encontrar la etiqueta sin el atributo src. por ejemplo: cargar algunas imágenes dinámicamente. como cómo encontrar esta segunda y agregar alguna clase a eso. pls help – Anoops

+0

@Anoops Puede encontrar elementos sin un atributo específico al aprovechar el selector ': not()' de psuedo. '$ ('. img-circle'). filter (': not ([src])')' –

5

También puede utilizarlo con atributos tales como discapacitados = "desactivado" en los campos de formulario, etc., así:

$("#change_password").click(function() { 
    var target = $(this).attr("rel"); 
    if($("#" + target).attr("disabled")) { 
     $("#" + target).attr("disabled", false); 
    } else { 
     $("#" + target).attr("disabled", true); 
    } 
}); 

El atributo "rel" almacena el identificador del campo de entrada de destino.

540

¿Qué tal solo $(this).is("[name]")?

La sintaxis [attr] es el selector CSS de un elemento con un atributo attr y .is() comprueba si el elemento se le llama en coincide con el selector CSS dado.

+7

y si solo desea seleccionar todos los elementos con un atributo de nombre, simplemente haga '$ ('[ name] ') ' –

+0

Para aquellos interesados ​​en verificar clases bajo SVG DOM utilizando JQuery esto puede ser una alternativa. –

+3

nota: con este selector no funcionará: '[camelizedAttr]' –

5

Escribí un plugin hasAttr() para jquery que hará todo esto de manera muy sencilla, exactamente como lo ha solicitado el OP. Más información here

EDIT: Mi plug-in se ha eliminado en la gran base de datos de eliminación plugins.jquery.com desastre de 2010. Usted puede mirar here algo de información sobre la adición de uno mismo, y por qué no se ha añadido .

+0

Es curioso que esos enlaces no funcionen en IE 8, pero hazlo en Chrome ... – vapcguy

6
Object.prototype.hasAttr = function(attr) { 
    if(this.attr) { 
     var _attr = this.attr(attr); 
    } else { 
     var _attr = this.getAttribute(attr); 
    } 
    return (typeof _attr !== "undefined" && _attr !== false && _attr !== null);  
}; 

Vine esto mientras escribía mi propia función para hacer lo mismo ... Pensé que compartiría en caso de que alguien más tropiece aquí. Agregué nulo porque getAttribute() devolverá nulo si el atributo no existe.

Este método le permitirá comprobar objetos jQuery y objetos de javascript regulares.

67

tarde a la fiesta, pero ... ¿por qué no this.hasAttribute("name")?

Consulte This

+0

Buena respuesta si no necesitas el objeto jquery – Harry

+17

o si no te importa que no funcione en muchos navegadores antiguos y IE – baiano

+7

@baiano IE6 & 7 son los únicos que no lo soporto, es bueno mencionarlo ahora ya que IE8 es prácticamente todo lo que está en pie. – Halcyon991

Cuestiones relacionadas