为什么它会在“if 语句”之后记录所有元素,而不是接受一个元素?

Why it logs all the elements after "if statement" instead of eception of one element?

提问人:beka manjgaladze 提问时间:11/3/2023 更新时间:11/3/2023 访问量:39

问:

我尝试通过 javascript 构建井字游戏而不查看某人的代码,我想记录所有尚未获得 url 的元素,但它记录了所有元素,包括已经获得 url 的元素以及为什么会发生这种情况?

const cells = document.querySelectorAll("img");
let boxs = [];
cells.forEach(function (cell) {
  cell.addEventListener("click", manChoice, false);
});
function manChoice() {
  this.src = "Small_uppercase_letter_X.svg.png";

  setTimeout(1000, computerChoice());
}
function computerChoice() {
  for (let cell of cells) {
    if (cell.src != "Small_uppercase_letter_X.svg.png") {
      console.log(cell);
    }
  }
}

JavaScript 数组 for-loop if-statement foreach

评论

2赞 CBroe 11/3/2023
可能是因为没有返回你认为它会返回的内容,所以去检查它实际包含什么。cell.src
0赞 beka manjgaladze 11/3/2023
cell.src 返回图像“X”的 url,它没有问题,它甚至显示在屏幕和检查元素中

答:

0赞 Ferhat Altundal 11/3/2023 #1

代码中的问题是 setTimeout 函数未正确使用,因此,在单击的单元格中设置“X”图像后立即调用 computerChoice 函数。要解决此问题,您需要向 setTimeout 传递一个函数,如下所示:

试试这个:

    const cells = document.querySelectorAll("img");
let boxs = [];
cells.forEach(function (cell) {
  cell.addEventListener("click", manChoice, false);
});
function manChoice() {
  if (this.src !== "Small_uppercase_letter_X.svg.png") {
    this.src = "Small_uppercase_letter_X.svg.png";
    setTimeout(function() {
      computerChoice();
    }, 1000);
  }
}
function computerChoice() {
  const availableCells = Array.from(cells).filter(cell => cell.src !== "Small_uppercase_letter_X.svg.png");
  if (availableCells.length > 0) {
    const randomIndex = Math.floor(Math.random() * availableCells.length);
    const chosenCell = availableCells[randomIndex];
    chosenCell.src = "Small_uppercase_letter_O.svg.png";
  }
}

评论

0赞 CBroe 11/3/2023
你不需要把它包装成一个匿名函数,你已经有一个函数引用 - 。这里重要的部分是,他们一开始就以错误的方式使用参数,并且他们调用的是函数,而不是传递引用。computerChoice
0赞 beka manjgaladze 11/3/2023
我尝试过这个,但它不是每次点击都有效 availableCells.length 始终为 9,它应该减少每次点击