Ответы:
tagName
Свойство предназначено специально для узлов элементов (типа 1 узлов) , чтобы получить тип элемента .
Есть также несколько других типов узлов (комментарий, атрибут, текст и т. Д.). Чтобы получить имя любого из различных типов узлов, вы можете использовать nodeName
свойство .
При использовании в nodeName
отношении узла элемента вы получите его имя тега, так что любой из них действительно может быть использован, хотя вы получите лучшую согласованность между браузерами при использовании nodeName
.
Это довольно хорошее объяснение разницы между ними.
Добавлен текст из статьи:
tagName
иnodeName
оба полезных свойства Javascript для проверки имени html-элемента. В большинстве случаев все будет хорошо, но nodeName предпочтительнее, если вы поддерживаете только браузеры класса A, а tagName предпочтительнее, если вы намерены также поддерживать IE5.5.Есть две проблемы с
tagName
:
- Во всех версиях IE tagName возвращается
!
при вызове на узле комментария- Для текстовых узлов tagName возвращает,
undefined
тогда как nodeName возвращает#text
nodeName
имеет свои проблемы, но они менее серьезны:
- IE 5.5 возвращается
!
при вызове на узле комментария. Это менее вредно, чем tagName, который страдает от такого поведения во всех версиях IE- IE 5.5 не поддерживает nodeName для
document
элемента или атрибутов. Ни один из них не должен вызывать беспокойства в большинстве практических целей, но следует помнить в любом случае- Konqueror игнорирует узлы комментариев при использовании этого свойства. Но опять же, Konqueror вместе с IE 5.5 не является браузером класса A
Так что для большинства практических целей придерживайтесь
nodeName
из-за его поддержки более широкого диапазона сценариев и потенциально лучшей прямой совместимости. Не говоря уже о том, что он не работает с узлом комментария, который имеет тенденцию заползать в код без объявления. Не беспокойтесь о IE 5.5 или Konqueror, поскольку их рыночная доля составляет около 0%.
Читайте об этих свойствах в спецификации DOM Core.
nodeName
это свойство, определенное в интерфейсе узла
http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-F68D095
tagName
это свойство, определенное в интерфейсе элемента
http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815
Кстати, интерфейс Node реализуется каждым узлом дерева DOM (включая сам document
объект). Интерфейс Element реализуется только теми узлами в дереве DOM, которые представляют элементы в документе HTML (узлы с nodeType
=== 1).
И вот что происходит в Firefox 33 и Chrome 38:
HTML:
<div class="a">a</div>
Js:
node = e
node.nodeType === 1
node.nodeName === 'DIV'
node.tagName === 'DIV'
node = e.getAttributeNode('class')
node.nodeType === 2
node.nodeName === 'class'
node.tagName === undefined
node = e.childNodes[0]
node.nodeType === 3
node.nodeName === '#text'
node.tagName === undefined
Так:
nodeType
для получения типа узла: nodeName
разрывы дляnodeType === 1
tagName
дляnodeType === 1
nodeName
сломаться для nodeType === 1
»?