Получение значений атрибутов HTML "способ DOM 0"

jQuery имеет метод attr(), который извлекает значение данного атрибута HTML. Например:

var foo = document.getElementById("foo");
$(foo).attr("id");

Но с точки зрения производительности это не оптимально, так как объект jQuery должен быть создан просто для вызова метода attr(). Это лучше работает: foo.id.

Итак, в идеале мы бы хотели избежать использования attr(). Но можем ли мы это сделать (для любого атрибута)? Я считаю, что foo.id и foo.value являются "безопасными" (кросс-браузер), но я помню, что у меня были проблемы с foo.href.

Вот список различных атрибутов, которые я хотел бы получить "напрямую":

Для любого элемента: foo.id, foo.name
Для якорей: foo.href, foo.target, foo.rel
Для изображений, объектов, iframes: foo.src, foo.width, foo.height
Для элементов формы: foo.checked, foo.selected, foo.disabled, foo.readonly, foo.type, foo.value, foo.action

Итак, вопрос в том, являются ли приведенные выше выражения кросс-браузером? Могу ли я использовать их безопасно?

Ссылка на статью, в которой рассматривается эта проблема, также будет приятной.

Изменить (на основе ответов): Выражения, выделенные полужирным шрифтом, небезопасны!

Ответ 1

Взгляд на то, как jQuery обрабатывает его:

  • href, src и атрибуты стиля требуют специального лечения.
  • У Safari есть ошибка при доступе к атрибуту "selected" на элементе select. При доступе к атрибуту "выбранный" Safari требуется специальное лечение.

Просмотрите источник jQuery и найдите эту строку, чтобы увидеть, что я имею в виду под "специальным обращением":
attr: function( elem, name, value, pass ) {

Вкратце: я считаю безопасным делать то, что вы хотите для большинства перечисленных атрибутов, кроме тех, которые показаны выше.


Чтобы все было в порядке, вы можете сделать это:

$foo = $("#foo");
console.log( $foo.attr("id"), $foo.attr("style"), $foo.attr("href") );
Выполняется только 1 объект jQuery, и вам не нужно беспокоиться о том, чтобы что-то делать вручную.

Ответ 2

jQuery attr() метод вводит в заблуждение, плохо документирован и скрывает очень важное различие: разница между атрибутами и свойствами, что, как представляется, плохо понимается многими веб-разработчиками, особенно теми, чьи введение в JavaScript появилось из jQuery.

Если вы больше не читаете, просто уберите это: вам почти никогда не придется использовать атрибуты. Почти всегда лучше использовать соответствующее свойство. В самом деле, это то, что обычно использует метод jQuery attr() , используемый до версии 1.6.

Причины использования свойства и избегайте getAttribute() и setAttribute() при работе с HTML DOM:

  • Выполнение IE нарушено. В более старых версиях и привилегиях более поздних версий атрибуты отображаются непосредственно в свойствах, что противоречит стандарту DOM. Одним из следствий этого является то, что атрибуты обработчика события (onclick и т.д.) В IE полностью разбиты. Всегда использовать свойство для обработчика событий. Другим следствием этого является то, что IE в этих режимах и версиях требует использования getAttribute("className") вместо getAttribute("class") для извлечения атрибута class.
  • Свойства (в основном) последовательно реализованы кросс-браузер
  • Отношения между некоторыми свойствами и атрибутами не так, как вы думаете. Некоторые атрибуты, особенно атрибут value элемента <input>, не привязаны к свойству с тем же именем: после изменения значения ввода (либо пользователем, либо script), получение или установка атрибут value не действует. Вместо этого атрибут value синхронизируется с свойством defaultValue.
  • Свойства обычно более удобны. Подумайте, например, о логических атрибутах, таких как checked: это представлено в DOM как свойство boolean checked, в то время как путаница царит о том, как установить флажок checkbox с помощью атрибута. Это removeAttribute("checked")? setAttribute("checked", "")? setAttribute("checked", false)? Все не так, потому что атрибут checked фактически сопоставляется с свойством defaultChecked.

Есть ситуации, когда использование атрибута может быть желательным. Например, свойство href элемента <a> всегда сообщает полный URL-адрес, а getAttribute("href") возвращает строку, указанную в атрибуте HTML href, дословно. Кроме, конечно, в IE. jQuery attr() пытается нормализовать эту несогласованность.

Дополнительная информация по этому вопросу: http://reference.sitepoint.com/javascript/Element/setAttribute, а также это из MSDN: http://msdn.microsoft.com/en-us/library/dd347148%28v=vs.85%29.aspx

Наконец, я настоятельно рекомендую использовать свойства DOM по возможности, а не с помощью метода jQuery attr(), но есть особые случаи (например, href), которые он обрабатывает, о которых вам нужно знать. Из свойств, о которых вы упоминаете, все они полностью безопасны для использования кросс-браузера со следующими исключениями:

  • foo.href и foo.src (который испытывает аналогичную проблему), как указано выше.
  • foo.type может быть установлен только в элементе <input> до его добавления в DOM.
  • foo.selected (где foo - элемент <option>), по-видимому, имеет ошибку в более старых версиях Safari, как указано в другом ответе.

Ответ 3

1) Я действительно не считаю, что производительность - это проблема. Я предполагаю, что "foo" - это просто указатель, а не объект, занимающий место в памяти. Однако не уверен в этом.

2) Вам вообще не нужно создавать переменную foo. $( "# foo" ). attr ( "id" ) будет делать.

3) DOM имеет несколько способов доступа к атрибутам. Попробуйте .getAttribute( "name" ),.setAttribute( "name" ) и .removeAttribute( "name" )