我想通过单击在控制台中打印一个元素标签

I want to get an element tag printed in the console just by clicking on it

我想通过单击在控制台中打印一个元素标签,但它似乎不起作用,我不明白为什么?

谁能指出我逻辑中的错误?

let bodyChildren = document.body.children;
let bodyArr = Object.values(bodyChildren);

for (i = 0; i < bodyChildren.length; i++) {
    bodyArr[i].onclick = function () {
        console.log(bodyArr[i].tagName);
    };
}

问题在于,当您定义一个函数时,其中的所有内容都包含在一个单独的范围内。在函数 bodyArr 内是未知的。您可以使用 this 来引用被点击的元素,如下所示:

document.body.children 将仅引用 body 元素的直接子元素。如果要引用 DOM 中的每个元素,可以使用 document.getElementsByTagName("*") 代替。

当代码是全局编写时,如下面的代码片段所示,变量 bodyArr 实际上在全局范围内可用,变量 i 也是如此。但请记住,函数内的代码仅在单击元素时执行。在那个时间点,for 循环已经完全执行,留下 i 和值 3(因为在 script 标签下面的代码片段中也很重要)。 bodyArr 总是少包含 1 个元素,无论 DOM 中有多少元素。在这种情况下,它有 3 个元素,最后一个元素保存在数组中的位置 2(从零开始),因此 bodyArr[i] 等于 undefined.

let bodyChildren = document.body.children;
let bodyArr = Object.values(bodyChildren);
for (i = 0; i < bodyChildren.length; i++) {
      bodyArr[i].onclick = function () {
        console.log(this.tagName);
      }
}
<span>child1</span>
<p>child2</p>

您需要从文档正文中获取所有元素,这是关键:var all = document.getElementsByTagName("*");

var all = document.getElementsByTagName("*");
let bodyArr = Object.values(all);

for (i = 0; i < bodyArr.length; i++) {
    bodyArr[i].onclick = function () {
        console.log(this.tagName);
    };
}
<span>Hello world</span>