Разница между attr () и getAttribute () в jQuery - PullRequest
10 голосов
/ 16 ноября 2011

Документация jQuery для метода attr гласит, что:

Значения атрибута являются строками, за исключением нескольких атрибутов, таких как value и tabindex.

И это действительно так.Рассмотрим следующий элемент:

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

Следующая строка действительно показывает «число», а не «строку»:

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

Теперь меня смущает то, что при использованииМетод DOM getAttribute, вы получите другой результат:

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

Глядя на источник jQuery для метода attr, выясняется, что jQuery просто возвращает то, что возвращает getAttribute, так почемуразница?Вот соответствующие строки источника jQuery :

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

А вот скрипка , чтобы продемонстрировать проблему.Просто чтобы еще больше запутать вопросы, я попробовал это в Chrome 15, Firefox 8, IE8 и IE7, и все они ведут себя так, как описано выше, за исключением IE7, который предупреждает «число» для обоих (что я и ожидал бы получить).

1 Ответ

11 голосов
/ 16 ноября 2011

Поскольку jQuery определяет propHook для tabIndex, расшифровка которого parseInt является типом возврата ;

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

Этот хук затем добавляется к attrHook, поэтому поведение наблюдается в функции attr (и почему оно впервые появляется , не определено attrHook для tabIndex).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...