尝试通过单击替换 table 中的图像

Attempting to replace an image in a table on a click

我正在尝试通过单击替换 table 中的图像。我没有使用 JQuery;我才Javascript完成这个任务。我想我已经将问题缩小到下面 JavaScript 代码中的注释。当图像源属于 body 等而不是单元格的一部分时,所有其他搜索都让我知道如何更改图像源。我 运行 也通过其他可能的方式,但由于某种原因我无法让它工作。非常感谢!

HTML(剪掉,这样你就可以看到每个变量指的是什么)

<td class="block"><img class="PieceImg" src="Directory/BlankSpace.png"></td> 

JavaScript

var cells = document.getElementsByClassName("PieceImg");

for(var j = 0; j<cells.length;j++)
{
    var cell = cells[j];
    cell.addEventListener("click", function()
    {
        cell.src="Directory/RedPiece.png"; // This is the problem
        alert('Test');
    })
}

假设您 运行 在 JavaScript 加载 DOM 后,您只需将 cell.src 替换为 this.src

var cells = document.getElementsByClassName("PieceImg");

for(var j = 0; j<cells.length;j++)
{
  var cell = cells[j];
  cell.addEventListener("click", function()
  {
    // Replace cell. with this.
    this.src="Directory/RedPiece.png";
    alert('Test');
  })
}

原因很简单:每次循环时,都会创建一个名为 "cell" (var cell = cells[j];) 的变量。这个非全局变量在每次循环运行时都会被覆盖。如果您 运行 在一个函数内执行此代码,那么当需要更改 src 时,您的 cell 变量甚至不存在。它将是 undefined。请注意,将此变量设置为全局变量会导致 cell 成为 class 名称 PieceImg 的最后一个元素,因此效果不会更好。

但是,如果您使用 this,您将在单击时引用 "clicked"(记住 addEventListener("click"))元素,在本例中是您的图像。因此,您可以更改 src。在您的 eventListener 中执行 console.log of "this" 以查看您可以访问的更多内容。这与添加内联 "click" 处理程序的效果类似:

<img src="fox.png" onclick="alert(this.src);" alt="Fox" />

让我知道这对你是否有意义。

这是一个完整的函数 fiddle:https://jsfiddle.net/7se0vyf5/

问题是for循环和变量的引用。当您分配事件处理程序时,它不会保持状态。

var cells = document.getElementsByClassName("PieceImg");

for (var j = 0; j < cells.length; j++) {
  var cell = cells[j];
  (function(cell){
      cell.addEventListener("click", function() {
        console.log(cell);
        cell.src = "Directory/RedPiece.png"; // This is the problem
        alert('Test');
      });
    }(cell));
      
}
<table>
  <tr>
    <td class="block">
      <img class="PieceImg" src="Directory/BlankSpace.png">
    </td>
    <td class="block">
      <img class="PieceImg" src="Directory/BlankSpace.png">
    </td>
    <td class="block">
      <img class="PieceImg" src="Directory/BlankSpace.png">
    </td>
  </tr>
</table>