2011-11-16 26 views
9

El documention jQuery para el método attr establece que:Diferencia entre attr de jQuery() y getAttribute()

Los valores de atributo son las cadenas con la excepción de unos pocos atributos tales como el valor y el índice de tabulación.

Y ese parece ser el caso. Considere el siguiente elemento:

<input type="text" id="example" tabindex="3"> 

La siguiente línea en efecto espectáculo "número", no "cadena":

alert(typeof $("#example").attr("tabindex")); //Number 

Ahora, lo que me está confundiendo es que cuando se utiliza el método de DOM getAttribute, se obtiene un resultado diferente:

alert(typeof $("#example")[0].getAttribute("tabindex")); //String 

en cuanto a la fuente de jQuery para el método attr, parece que simplemente devuelve jQuery lo getAttribute vuelve, entonces, ¿por qué hay una diferencia? Aquí está la relevant lines of the jQuery source:

ret = elem.getAttribute(name); 
// Non-existent attributes return null, we normalize to undefined 
return ret === null ? 
     undefined : 
     ret; 

Y aquí hay un fiddle para demostrar el problema. Solo para confundir más las cosas, lo probé en Chrome 15, Firefox 8, IE8 e IE7, y todos se comportan como se describe arriba, excepto para IE7, que alerta "número" para ambos (que es lo que esperaría que sucediera) .

Respuesta

10

Porque jQuery define un propHook for tabIndex que explicity parseInt's the return type;

return attributeNode && attributeNode.specified ? 
    parseInt(attributeNode.value, 10) : 
    rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 
    0 : 
    undefined; 

Este gancho es entonces added to the attrHook por lo que el comportamiento se observa en la función attr (y por qué aparece por primera vez no attrHook is defined for tabIndex).

+0

¡Ahh, eso me enseñará a no mirar un poco más y seguir correctamente la fuente jQuery! Gracias. –

+3

Debe vincular a una determinada etiqueta, en lugar de a la rama principal. De lo contrario, los números de línea podrían cambiar en el futuro. –

+0

@FelixKling: Hecho, gracias :) – Matt

Cuestiones relacionadas