提问人:beka manjgaladze 提问时间:11/3/2023 更新时间:11/3/2023 访问量:39
为什么它会在“if 语句”之后记录所有元素,而不是接受一个元素?
Why it logs all the elements after "if statement" instead of eception of one element?
问:
我尝试通过 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);
}
}
}
答:
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,它应该减少每次点击
评论
cell.src