javascript - 如何触发循环中创建的所有元素的onclick?

标签 javascript html

这是我的代码:

   var board = document.getElementById("left");
    for (var m = 0; m < 5; m++) {
        var cell = document.createElement('div');
        cell.className = "Cell";
        cell.style.cssText='background-color:#999999;margin:5px;width:50px;height:100px;';
        cell.onclick= function() {
                    cell.innerHTML = "Hello World";
            };
        cell.name = m;
        board.appendChild(cell);
    }
    <div id="left"></div>
  

但是,当我单击每个 div 时,“Hello World”始终显示在最后一个 div 上。 如何解决?

最佳答案

cell的值在循环中被赋值时,它将保存最后一个元素的值

简单的解决方案:

在处理函数中使用this!在Event-handler函数中,this指的是调用事件的element!

var board = document.getElementById("left");
for (var m = 0; m < 5; m++) {
  var cell = document.createElement('div');
  cell.className = "Cell";
  cell.style.cssText = 'background-color:#999999;margin:5px;width:50px;height:100px;';
  cell.onclick = function() {
    this.innerHTML = "Hello World";
  };
  cell.name = m;
  board.appendChild(cell);
}
<div id="left"></div>

或者:使用闭包返回函数会记住它创建的环境!

var board = document.getElementById("left");
for (var m = 0; m < 5; m++) {
  var cell = document.createElement('div');
  cell.className = "Cell";
  cell.style.cssText = 'background-color:#999999;margin:5px;width:50px;height:100px;';
  cell.onclick = (function(cell) {
    return function() {
      cell.innerHTML = "Hello World";
    }
  })(cell);
  cell.name = m;
  board.appendChild(cell);
}
<div id="left"></div>

关于javascript - 如何触发循环中创建的所有元素的onclick?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40760109/

相关文章:

jquery - 导航问题 jQuery CSS HTML

javascript - 如何在indexeddb中仅添加一次初始数据

javascript - Uncaught Error : [$injector:modulerr] Failed to instantiate module polmgr due to

javascript - 使 Google Chart Gauge 具有响应能力

javascript - 阻止了源为 "http://localhost:8084"的框架访问跨域框架

javascript - Interactjs 旋转改变位置

javascript - Vue 过滤器函数总是返回 5 个以上的元素

javascript - 如何在 javascript 中捕获浏览器的后退/前进按钮单击事件或哈希更改事件?

html - 使用css悬停图像的某些部分时将文本放在图像上

javascript - 样式表的css处理顺序