返回

为什么图像在添加 EventListener(DOM)时会消失?以及如何解决?

javascript

图像在添加 EventListener(DOM)时消失的原因及解决方法

问题

在 JavaScript 中,当我们为图像元素添加拖放功能时,图像可能会消失。这是因为在添加事件监听器时,this 指向的是 window 对象,而不是图像元素本身。

解决方法

为了解决这个问题,我们可以通过以下方式修复 this 指向:

1. 箭头函数

tile.addEventListener("dragstart", (event) => {
  // `this` now refers to the image element
});

2. 绑定事件处理程序

tile.addEventListener("dragstart", this.dragStart.bind(this));

dragStart() {
  // `this` now refers to the image element
}

优化代码

为了优化代码,我们可以将事件处理程序定义在 PuzzleGame 类外部,并通过箭头函数来绑定 this

const dragStart = (event) => {
  this.currTile = event.target; // Image being dragged
};

const dragOver = (event) => {
  event.preventDefault();
};

// ... other event handlers

PuzzleGame.prototype.populateBoard = function() {
  // ...

  tile.addEventListener("dragstart", dragStart);
  tile.addEventListener("dragover", dragOver);
  // ... other event listeners

  // ...
};

完整示例

class PuzzleGame extends Game {
  // ...

  populateBoard() {
    for (let r = 0; r < this.rows; r++) {
      for (let c = 0; c < this.columns; c++) {
        let tile = document.createElement("img");
        tile.id = r.toString() + "-" + c.toString();
        tile.src = "./images/" + this.randomOrder.shift() + ".png";

        // Add event listeners using arrow functions
        tile.addEventListener("dragstart", (event) => {
          this.currTile = event.target; // Image being dragged
        });
        tile.addEventListener("dragover", (event) => {
          event.preventDefault();
        });
        // ... other event handlers

        document.getElementById("board").append(tile);
      }
    }
  }

  // ...
}

结论

通过修复 this 指向,我们可以解决图像在添加事件监听器时消失的问题。可以通过使用箭头函数或绑定事件处理程序来实现这一目标。通过优化代码并使用箭头函数,我们可以确保事件处理程序正确指向图像元素,从而实现拖放功能。

常见问题解答

Q1. 为什么在添加事件监听器时图像会消失?

A1. 这是因为在添加事件监听器时,this 指向的是 window 对象,而不是图像元素本身。

Q2. 如何修复 this 指向?

A2. 我们可以通过使用箭头函数或绑定事件处理程序来修复 this 指向。

Q3. 如何优化代码?

A3. 我们可以将事件处理程序定义在 PuzzleGame 类外部,并通过箭头函数来绑定 this

Q4. 箭头函数和绑定事件处理程序有什么区别?

A4. 箭头函数更简洁,因为它不需要使用 function ,而绑定事件处理程序则需要显式绑定 this

Q5. 为什么需要修复 this 指向?

A5. 如果不修复 this 指向,事件处理程序将无法正确引用图像元素,从而导致图像消失或其他意外行为。