#javascript #html #onclick
Вопрос:
Я хочу, чтобы тег элемента был напечатан в консоли, просто нажав на него, но, похоже, это не работает, и я не понимаю, почему?
может ли кто-нибудь указать на ошибку в моей логике?
let bodyChildren = document.body.children; let bodyArr = Object.values(bodyChildren); for (i = 0; i lt; bodyChildren.length; i ) { bodyArr[i].onclick = function () { console.log(bodyArr[i].tagName); }; }
Комментарии:
1. С тех пор вы должны сделать функцию рекурсивной. Текущий код не обязательно будет работать для детей детей (т. е. он не будет работать для всего DOM на вашей странице)
2. как я могу это сделать ?
3. хорошо, спасибо за ссылку, ценю это
Ответ №1:
Проблема в том, что когда вы определяете функцию, все в ней содержится в отдельной области. В пределах функции 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 lt; bodyChildren.length; i ) { bodyArr[i].onclick = function () { console.log(this.tagName); } }
lt;spangt;child1lt;/spangt; lt;pgt;child2lt;/pgt;
Комментарии:
1. Вы получили правильный ответ. Это можно улучшить, так как оно работает только для элементов верхнего уровня (не будет работать для всего DOM).
2. Я думал, что bodyArr находится в глобальной области, поэтому функция может работать с ним
3. @zaydmerzougui см. мой отредактированный ответ для объяснения того, почему он все еще не работает, хотя переменная действительно доступна в глобальной области.
Ответ №2:
Вам нужно получить ВСЕ элементы из тела документа, и это КЛЮЧ: var all = document.getElementsByTagName(«*»);
var all = document.getElementsByTagName("*"); let bodyArr = Object.values(all); for (i = 0; i lt; bodyArr.length; i ) { bodyArr[i].onclick = function () { console.log(this.tagName); }; }
lt;spangt;Hello worldlt;/spangt;
Комментарии:
1. да, этот кажется аккуратным и работает лучше