在动态创建的标记上添加事件
Adding events on dynamically created tags
我正在脚本中创建一些div,并在循环中使用特定的类名。我想将onclick事件添加到每个div中,并通过单击它们来获得它们的innerHTML。但是每次点击我都只得到最后一个div的innerHTML。这是我的代码:
for(var i=0;i<10;i++)
{
var itemRow = document.createElement("div");
itemRow.innerHTML = i;
itemRow.onclick = function(){
return function(){
console.log(itemRow.innerHTML); //which now returns only the last div innerHTML
}();
}
}
非常感谢
这是for循环和事件回调的常见问题。您正试图访问函数中的一个变量,该变量将由for循环更新。这就是为什么您总是看到最后一个div innerHTML。将代码更改为
for(var i=0;i<10;i++)
{
var itemRow = document.createElement("div");
itemRow.innerHTML = i;
itemRow.onclick = getClickHandler(itemRow);
}
function getClickHandler(itemRow){
return function(){
console.log(itemRow.innerHTML);
}
}
for(var i=0;i<10;i++)
{
var itemRow = document.createElement("div");
itemRow.innerHTML = i;
itemRow.onclick = function(){
console.log(this.innerHTML);
}
document.getElementById('main').appendChild( itemRow );
}
查看下面的小提琴链接:
http://jsfiddle.net/9q1pLueq/
您需要将循环的内容封装在IIFE函数中,以创建词法范围,以便事件处理程序能够记住数据。
for(var i=0;i<10;i++)
{
(function(i) {
var itemRow = document.createElement("div");
itemRow.innerHTML = i;
itemRow.onclick = function(){
alert(itemRow.innerHTML);
}
document.body.appendChild(itemRow);
})(i);
}
否则非常简单,您只需使用this.innerHTML
即可获得该值。在单击处理程序中,在循环过程中您将无法访问分配给它的itemRow
。它总是指向最后一个元素。为了避免它,只需在那里使用this.innerHTML
。也不需要在事件处理程序中返回自执行函数。
编辑:添加演示
for(var i=0;i<10;i++)
{
var itemRow = document.createElement("div");
itemRow.innerHTML = i;
itemRow.onclick = function(){
alert(this.innerHTML);
}
document.body.appendChild(itemRow);
}
相关文章:
- 如何在for循环中添加事件侦听器
- 如果选中了多个复选框,如何添加事件
- 正在ng重复元素上添加事件
- 在动态创建的标记上添加事件
- 如何在HTML列表中添加事件's子弹
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- jQuery完整日历添加事件,仅包含月份和日期
- 是否可以在数字输入框中的小按钮中添加事件侦听器
- 在Google Chrome扩展中添加事件侦听器
- AngularJS:在.post()之后添加事件侦听器
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 添加事件侦听器不起作用
- 如何为angular js条形图添加事件
- 在 http 请求中添加事件侦听器 ( request.on ) 是什么意思?而笏就是它的用途
- Iron:路由器在更改路由器上添加事件
- 如何为表行结果的每个按钮添加事件侦听器
- 在 javascript 中添加事件处理程序的位置
- YouTube API-动态添加事件侦听器
- 在聚合物的子菜单标题中添加事件
- 检查是否可以添加事件侦听器而不添加