Разработан ли передовой опыт использования нотации атрибута setAttribute
dot ( .
)?
Например:
myObj.setAttribute("className", "nameOfClass");
myObj.setAttribute("id", "someID");
или
myObj.className = "nameOfClass";
myObj.id = "someID";
javascript
attributes
setattribute
Франциск
источник
источник
.setAttribute()
на[key] = value
, все волшебным образом начало работать.Ответы:
Вы всегда должны использовать прямую
.attribute
форму (но смотрите ссылку на причудливый режим ниже), если вам нужен программный доступ в JavaScript. Он должен правильно обрабатывать различные типы атрибутов (подумайте «onload»).Используйте
getAttribute
/,setAttribute
когда вы хотите иметь дело с DOM как есть (например, только текст). Различные браузеры путают их. См. Причудливые режимы: атрибут (в) совместимости .источник
От Javascript: Полное руководство , оно проясняет вещи. Он отмечает, что объекты HTMLElement документа HTML определяют свойства JS, которые соответствуют всем стандартным атрибутам HTML.
Так что вам нужно использовать только
setAttribute
нестандартные атрибуты.Пример:
источник
node.frameborder
НЕ определен, поэтому вы должны получить getAttribute, чтобы получить значение обратно.frameBorder
напрямую, но обратите внимание на заглавные буквы. Кто-то подумал, что было бы неплохо, если бы CamelCase соответствовал JavaScript-атрибутам HTML. Мне не удалось найти никакой спецификации для этого, но сеть, похоже, согласна с тем, что речь идет о 12 конкретных случаях (по крайней мере, для HTML 4). Смотрите, например, следующий пост: drupal.org/node/1420706#comment-6423420usemap
Атрибут не может быть установлен с помощью точечной нотации при создании карты динамически для изображения. Это требует,img.setAttribute('usemap', "#MapName");
подразумевает ли ваш ответ, чтоusemap
поэтому является "нестандартным"?Ни один из предыдущих ответов не является полным и большинство содержит дезинформацию.
Есть три способа доступа атрибуты DOM элемента в JavaScript. Все три надежно работают в современных браузерах, если вы понимаете, как их использовать.
1.
element.attributes
Элементы имеют свойство атрибутов , который возвращает живой NamedNodeMap из Attr объектов. Индексы этой коллекции могут отличаться в разных браузерах. Итак, заказ не гарантирован.
NamedNodeMap
есть методы для добавления и удаления атрибутов (getNamedItem
иsetNamedItem
, соответственно).Обратите внимание, что хотя XML явно чувствителен к регистру, спецификация DOM требует нормализации строковых имен , поэтому передаваемые имена
getNamedItem
фактически нечувствительны к регистру.Пример использования:
2.
element.getAttribute
&element.setAttribute
Эти методы существуют напрямую,
Element
без необходимости доступаattributes
и их методов, но выполняют те же функции.Опять же, обратите внимание, что имя строки нечувствительно к регистру.
Пример использования:
3. Свойства объекта DOM, такие как
element.id
Многие атрибуты могут быть доступны с помощью удобных свойств объекта DOM. Какие атрибуты существуют, зависит от типа узла DOM, а не от того, какие атрибуты определены в HTML. Свойства определены где-то в цепочке прототипов рассматриваемого объекта DOM. Определенные свойства будут зависеть от типа элемента, к которому вы обращаетесь. Например,
className
иid
определеныElement
и существуют на всех узлах DOM, которые являются элементами (т. Е. Не узлами текста или комментариев). Ноvalue
это более узко. Он определенHTMLInputElement
и может не существовать в других элементах.Обратите внимание, что свойства JavaScript чувствительны к регистру. Хотя большинство свойств будут использовать строчные буквы, некоторые из них являются camelCase. Так что всегда проверяйте спецификацию, чтобы быть уверенным.
Эта «диаграмма» захватывает часть цепочки прототипов для этих объектов DOM. Это даже не близко к завершению, но он отражает общую структуру.
Пример использования:
Предостережение: это объяснение того, как спецификация HTML определяет и современные браузеры обрабатывают атрибуты. Я не пытался бороться с ограничениями древних, сломанных браузеров. Если вам необходимо поддерживать старые браузеры, в дополнение к этой информации вам необходимо знать, что в этих браузерах не работает.
источник
Один случай, который я нашел там, где
setAttribute
это необходимо, - это изменение атрибутов ARIA, поскольку соответствующих свойств нет. НапримерТам нет
x.arialabel
или что-то подобное, поэтому вы должны использовать setAttribute.Редактировать: x ["aria-label"] не работает . Вам действительно нужно setAttribute.
источник
Эти ответы на самом деле не решают большую путаницу между свойствами и атрибутами . Кроме того, в зависимости от прототипа Javascript, иногда вы можете использовать свойство элемента для доступа к атрибутам, а иногда нет.
Во-первых, вы должны помнить, что
HTMLElement
это объект Javascript. Как и все объекты, они имеют свойства. Конечно, вы можете создать свойство, называемое почти всем, что вы хотите внутриHTMLElement
, но оно не должно иметь ничего общего с DOM (что на странице). Точечная запись (.
) предназначена для свойств . Теперь есть некоторые специальные свойства , которые сопоставляются с атрибутами, и на момент написания этой статьи гарантируется только 4 (подробнее об этом позже).Все
HTMLElement
включают свойство называетсяattributes
.HTMLElement.attributes
является живымNamedNodeMap
объектом, который относится к элементам в DOM. «Живой» означает, что когда узел изменяется в DOM, он изменяется на стороне JavaScript, и наоборот. Атрибутами DOM в данном случае являются рассматриваемые узлы. АNode
имеет.nodeValue
свойство, которое вы можете изменить.NamedNodeMap
Объекты имеют функцию, которая называется,setNamedItem
где вы можете изменить весь узел. Вы также можете напрямую получить доступ к узлу с помощью ключа. Например, вы можете сказать,.attributes["dir"]
что то же самое, что.attributes.getNamedItem('dir');
(примечание,NamedNodeMap
без учета регистра, так что вы также можете пройти'DIR'
);Прямо
HTMLElement
там есть похожая функция, в которой вы можете просто вызвать,setAttribute
которая автоматически создаст узел, если он не существует, и установитnodeValue
. Есть также некоторые атрибуты, к которым вы можете обращаться напрямую как к свойствамHTMLElement
через специальные свойства , такие какdir
. Вот примерное отображение того, как это выглядит:Таким образом, вы можете изменить
dir
атрибуты 6 способов:Вы можете обновить все свойства с методами # 1-5, но только
dir
,id
,lang
иclassName
с методом # 6.Расширения HTMLElement
HTMLElement
имеет эти 4 специальных свойства. Некоторые элементы являются расширенными классами иHTMLElement
имеют еще более сопоставленные свойства. Например,HTMLAnchorElement
естьHTMLAnchorElement.href
,HTMLAnchorElement.rel
иHTMLAnchorElement.target
. Но будьте осторожны , если вы установите эти свойства для элементов, которые не имеют этих специальных свойств (например, для aHTMLTableElement
), тогда атрибуты не изменятся, и они будут обычными обычными свойствами. Чтобы лучше понять, вот пример его наследования:Пользовательские свойства
Теперь большое предупреждение: как и все объекты Javascript , вы можете добавлять собственные свойства. Но это ничего не изменит на DOM. Ты можешь сделать:
Но это так же, как
Это означает, что добавление пользовательского свойства не будет связано с
.attributes[attr].nodeValue
.Производительность
Я создал тестовый пример jsperf, чтобы показать разницу: https://jsperf.com/set-attribute-comparison . В основном, по порядку:
dir
,id
,className
).element.attributes.ATTRIBUTENAME.nodeValue =
element.attributes.getNamedItem(ATTRIBUTENAME).nodeValue = newValue
element.attributes.ATTRIBUTENAME = newNode
element.attributes.setNamedItem(ATTRIBUTENAME) = newNode
Заключение (TL; DR)
Используйте специальные отображения свойств из
HTMLElement
:element.dir
,element.id
,element.className
, илиelement.lang
.Если вы на 100% уверены, что элемент является расширенным
HTMLElement
со специальным свойством, используйте это специальное отображение. (Вы можете проверить сif (element instanceof HTMLAnchorElement)
).Если вы на 100% уверены, что атрибут уже существует, используйте
element.attributes.ATTRIBUTENAME.nodeValue = newValue
.Если нет, используйте
setAttribute()
.источник
classList
на 100% гарантированно существует, но это не строковое свойство, это живойDOMTokenList
объект. Установка.className
напрямую быстрее, чем манипулированиеclassList
, но вы перезаписали бы все это..value
, вы меняете внутреннее значениеHTMLInputElement
, которое затем отражается на атрибутах. Они также не должны бытьstring
..valueAsNumber
изменитсяvalue
внутри , и егоstring
форма появится вvalue
атрибуте. developer.mozilla.org/en-US/docs/Web/HTML/Attributes"Когда использовать setAttribute vs .attribute = в JavaScript?"
Общее правило - использовать
.attribute
и проверять, работает ли оно в браузере...Если это работает в браузере, вы можете идти.
..Если он не используется
.setAttribute(attribute, value)
вместо того , чтобы.attribute
для этого атрибута.Промыть-повторить для всех атрибутов.
Ну, если вы ленивы, вы можете просто использовать
.setAttribute
. Это должно нормально работать в большинстве браузеров. (Хотя браузеры, которые поддерживают,.attribute
могут оптимизировать его лучше, чем.setAttribute(attribute, value)
.)источник
Это похоже на один случай, когда лучше использовать setAttribute:
Dev.Opera - эффективный JavaScript
источник
posElem.style = newStyle
работает во всех браузерах (у меня работало в Firefox)? Это просто из соображений производительности, чтоsetAttribute
предпочтительнее, избегая перекрашивания? Является лиposElem.style.cssText = newStyle
более духовным, чемposElem.style = newStyle
?методы для установки атрибутов (например, класса) для элемента: 1. el.className = строка 2. el.setAttribute ('class', строка) 3. el.attributes.setNamedItem (объект) 4. el.setAttributeNode (узел)
Я сделал простой тест ( здесь )
и кажется, что setAttributeNode примерно в 3 раза быстрее, чем использование setAttribute.
поэтому, если производительность является проблемой - используйте "setAttributeNode"
источник
Интересный вывод из скрипта Google API по этому поводу:
Они делают это так:
Обратите внимание, как они используются
setAttribute
для "src" и "nonce", но затем.async = ...
для атрибута "async".Я не уверен на 100%, но, вероятно, это потому, что «асинхронность» поддерживается только в браузерах, которые поддерживают прямое
.attr =
назначение. Таким образом, нет смысла пытаться это сделать,sestAttribute("async")
потому что если браузер не понимает.async=...
- он не поймет атрибут «асинхронный».Надеюсь, что это полезное понимание моего продолжающегося исследовательского проекта "Un-minify GAPI" . Поправьте меня если я ошибаюсь.
источник