【发布时间】:2011-06-20 04:37:56
【问题描述】:
$('this')[0].nodeName 和 $('this')[0].tagName 有什么区别?
【问题讨论】:
-
这个问题更像是一个 dom 问题,因为它不是 jquery 特有的。
标签: javascript dom tagname nodename
$('this')[0].nodeName 和 $('this')[0].tagName 有什么区别?
【问题讨论】:
标签: javascript dom tagname nodename
tagName property 专门用于元素节点(类型1 节点)以获取元素 的类型。
还有几个other types of nodes(评论、属性、文本等)。要获取任何各种节点类型的名称,您可以使用nodeName property。
当对一个元素节点使用nodeName时,你会得到它的标签名称,所以任何一个都可以使用,虽然你会在使用nodeName时得到better consistency between browsers。
【讨论】:
This 很好地解释了两者的区别。
添加了文章中的文字:
tagName和nodeName都是有用的 Javascript 属性 检查 html 元素的名称。对于大多数目的,要么 做得很好,但如果您只支持 A 级,则首选 nodeName 如果您打算支持 IE5.5,则首选 browsers 和 tagName 好吧。
tagName有两个问题:
- 在所有版本的 IE 中,tagName 在评论节点上调用时返回
!- 对于文本节点,tagName 返回
undefined而nodeName 返回#text
nodeName有自己的一组issues,但不那么严重:
- IE 5.5 在评论节点上调用时返回
!。这比在 all 中遭受这种行为的 tagName 的危害要小 IE 版本- IE 5.5 不支持
document元素或属性的 nodeName。这些都不应该是最实际的问题 目的,但在任何情况下都应牢记- 使用此属性时,Konqueror 会忽略注释节点。但是话又说回来,Konqueror 和 IE 5.5 不是A-grade browser
因此,由于它的支持,因此对于大多数实际用途而言,请坚持使用
nodeName适用于更广泛的场景并可能更好地向前发展 兼容性。更不用说它不会打嗝评论 节点,它有潜入未经通知的代码的趋势。别担心 大约 IE 5.5 或 Konqueror,因为它们的市场份额接近 0%。
【讨论】:
阅读 DOM Core 规范中的这些属性。
nodeName是Node接口中定义的属性
http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-F68D095
tagName 是 Element 接口中定义的属性
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”?
The read-only Node.nodeType property is an integer that identifies what the node is. 的链接文档?
elem?)但与tagName 相同,每个元素都不同。因此,您可能希望始终使用nodeType 来检测节点类型并使用tagName 作为标签名称。