代码
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()
. 稍后我想使用.onclick
DOM Element 属性为 HTML 元素动态分配一个事件。
我想要的是,当单击任何元素<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
andconst
。在您的代码中,
texto
属于函数范围的变量始终存储分配给它的最后一个引用,即数组最后一个元素的文本。您应该做的是使用闭包或使用let
orconst
。对于它执行的每次迭代,
for
都会写入变量的值texto
。尝试访问元素本身this
并阅读内容:使用闭包:
为什么原始代码不起作用?
您为事件定义的函数在运行时
onClick
读取外部变量的值texto
,而不是在定义函数时复制其值。外部变量的任何后续修改都会影响函数的执行。尝试使用以下内容显示文本
this
: