jQuery的attr()和getAttribute()之间的区别

时间:2011-11-16 09:17:13

标签: javascript jquery dom

attr方法的jQuery文档声明:

  

属性值是除少数属性外的字符串   例如值和tabindex。

情况似乎确实如此。请考虑以下元素:

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

以下行确实显示“数字”,而不是“字符串”:

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

现在,让我感到困惑的是,当使用DOM方法getAttribute时,会得到不同的结果:

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

查看attr方法的jQuery源代码,看来jQuery只返回getAttribute返回的内容,为什么会有区别?这是relevant lines of the jQuery source

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

这是一个fiddle来证明这个问题。只是为了进一步混淆问题,我已经在Chrome 15,Firefox 8,IE8和IE7中尝试了它,并且所有行为如上所述,除了IE7,它警告两者的“数字”(这是我期望发生的)

1 个答案:

答案 0 :(得分:11)

因为jQuery定义了propHook for tabIndex明确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;

这个钩子然后是added to the attrHook,这就是为什么在attr函数中观察到这种行为的原因(以及为什么它首次出现no attrHook is defined for tabIndex)。