此问题已在此处有答案:
Is Element.tagName always uppercase?(5个答案)
4天前关闭.
function toggleClassDoneOnAndOff(event) {
if (event.target.tagName === "LI") {
event.target.classList.toggle("done");
}
}
ul.addEventListener("click", toggleClassDoneOnAndOff);
有谁能解释一下为什么我要戴帽子?
我只是试图找到答案,但不明白的解释
3条答案
按热度按时间xuo3flqw1#
根据Element: tagName property文档:
对于表示HTML文档的DOM树,返回的标记名总是规范的大写形式。
XML DOM树中元素的标签名称以与原始XML文件中相同的大小写返回。如果XML文档包含标签
"<SomeTag>"
,则tagName属性的值为“SomeTag”。oug3syen2#
因为在HTML背后,所有的元素都是在一个object模型中描述的,可以在javascript中直接访问。为了简化[很多]所有的HTML对象都是在javascript中描述的,其特殊性是区分大小写。因此UL元素的原型总是大写的。
实际上,第一个html浏览器是用C语言编写的,它也是区分大小写的(参见Robert Cailliau-〉first web browser MacWWW)
你也可以使用一个通用的方法matches(),它使用css语法,其中小写字母被接受:
评论中:
您有任何参考资料来说明您的基本原理吗?'因此UL元素的原型总是大写。'这是什么意思?规范只是规定'tagName getter步骤是返回此HTML大写的限定名。' - pilchard
规范基于真实的代码;每个HTML元素都有一个原型对象,它的名字是用大写字母写的。即使HTML解释器接受我们用小写字母写标签名,它仍然有义务获取名字是用大写字母写的原型,proto使用get tagName()方法返回对象名。对象只能有一个唯一的名字,这个名字是由大写字母组成的。
请参阅
console.log( document.querySelector('li'))
(Firefox)tagName将返回大写值
参见HTML元素原型...(HTMLLI元素原型继承自HTML元素原型)
由Dom Element...
tagName值来自get方法。
然后你必须查看JavaScript引擎的源代码(SpiderMonkey for firefox)来检查这个值的大写字母的真正来源,但我们已经有了一个线索:HTMLLIElementprototype原型的名称确实包含大写字母的值
LI
;我敢打赌,这些大写字母和get tagName()
返回的值之间存在联系。iqjalb3h3#
很简单
tagName
属性被定义为总是全大写,并且===
(以及==
)精确地比较字符串;'a' === 'A'
为false。你可以用其他方法来做比较;Mister Jojo在他们的回答中建议在目标上调用
matches
方法,而不是使用它的tagName
属性。但是你仍然可以使用tagName
,只需要显式转换为小写:不过,这需要做一些额外的工作。使用全大写版本似乎更容易,因为
.tagName
肯定包含了这些内容。