Код
function asignarEventos() {
var uno = document.getElementById("uno");
var dos = document.getElementById("dos");
var tres = document.getElementById("tres");
var arreglo = [uno, dos, tres];
for (var i = 0; i < arreglo.length; i++) {
var elemento = arreglo[i];
var texto = elemento.innerHTML.trim();
elemento.onclick = function(){
alert(texto);
};
}
}
asignarEventos();
<html>
<head>
</head>
<body>
<a id="uno">
Uno
</a>
<a id="dos">
Dos
</a>
<a id="tres">
Tres
</a>
</body>
</html>
Цель
Переменная arreglo
содержит список HTML-элементов, которые ранее были получены с помощью document.getElementById()
. Позже я хочу динамически назначить событие HTML-элементу, используя .onclick
свойство DOM Element.
Я хочу, чтобы при нажатии на любой из элементов <a>
отображалась alert()
функция или выполнялась функция, показывающая содержащийся в них текст.
Проблема
В этом разделе кода:
var elemento = arreglo[i];
var texto = elemento.innerHTML.trim();
elemento.onclick = function(){
alert(texto);
};
Я получаю элемент, содержащийся в переменной arreglo
, а позже я получаю его значение innerHTML
, то есть текст, который он содержит, затем я присваиваю атрибут onclick
, назначая анонимную функцию, которая будет выполнять alert()
отображение текста, содержащего HTML-элемент.
Но щелчок по любому из элементов всегда печатает innerHTML
последний элемент, в данном случае это слово «три». Когда должно быть значение каждого элемента в отдельности.
Спросить
Как событие может быть назначено onClick()
элементу, полученному с помощью document.getElementById()
?
Примечание
Следует уточнить, что я должен решить проблему, используя чистый JavaScript , мне не помогает использование библиотеки, такой как jQuery или другие, так как в указанной среде я не могу ее использовать.
Проблема возникает из-за проблем с областью/областью. Запомнить:
пример хостинга
Как видите, в первом примере
x
он по-прежнему доступен даже вне цикла for, это происходит потому, что переменные ES5 при объявлении проходят другой процесс; этого не происходит в ES6 сlet
иconst
.В вашем коде переменная
texto
, будучи областью видимости функции, всегда хранит последнюю присвоенную ей ссылку , то есть текст последнего элемента массива. Что вы должны сделать, это использовать закрытие или использоватьlet
илиconst
.Для каждой выполненной итерации
for
записывается значение переменнойtexto
. Попробуйте получить доступ к самому элементуthis
и, таким образом, прочитать содержимое:Использование замыкания :
Почему оригинальный код не работает?
Функция, которую вы определили для события,
onClick
считывает значение внешней переменнойtexto
во время выполнения вместо того, чтобы копировать ее значение при определении функции. Любое последующее изменение внешней переменной влияет на выполнение функции.Попробуйте отобразить текст примерно
this
так: