html 不明白李为什么要戴帽子,有人能解释一下吗?

h43kikqp  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(83)

此问题已在此处有答案

Is Element.tagName always uppercase?(5个答案)
4天前关闭.

function toggleClassDoneOnAndOff(event) {
    if (event.target.tagName === "LI") {
        event.target.classList.toggle("done");
    }
}
ul.addEventListener("click", toggleClassDoneOnAndOff);

有谁能解释一下为什么我要戴帽子?
我只是试图找到答案,但不明白的解释

xuo3flqw

xuo3flqw1#

根据Element: tagName property文档:
对于表示HTML文档的DOM树,返回的标记名总是规范的大写形式。
XML DOM树中元素的标签名称以与原始XML文件中相同的大小写返回。如果XML文档包含标签"<SomeTag>",则tagName属性的值为“SomeTag”。

oug3syen

oug3syen2#

因为在HTML背后,所有的元素都是在一个object模型中描述的,可以在javascript中直接访问。为了简化[很多]所有的HTML对象都是在javascript中描述的,其特殊性是区分大小写。因此UL元素的原型总是大写的。
实际上,第一个html浏览器是用C语言编写的,它也是区分大小写的(参见Robert Cailliau-〉first web browser MacWWW
你也可以使用一个通用的方法matches(),它使用css语法,其中小写字母被接受:

ul.addEventListener('click', (event) =>
  {
  if (event.target.matches('li'))
    {
    event.target.classList.toggle('done');
    }
  });

评论中:
您有任何参考资料来说明您的基本原理吗?'因此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()返回的值之间存在联系。

iqjalb3h

iqjalb3h3#

很简单tagName属性被定义为总是全大写,并且===(以及==)精确地比较字符串;'a' === 'A'为false。
你可以用其他方法来做比较;Mister Jojo在他们的回答中建议在目标上调用matches方法,而不是使用它的tagName属性。但是你仍然可以使用tagName,只需要显式转换为小写:

if (event.target.tagName.toLowerCase() === "li")

不过,这需要做一些额外的工作。使用全大写版本似乎更容易,因为.tagName肯定包含了这些内容。

相关问题