我正在尝试制作井字游戏,为此我必须解决这个问题:

时间:2021-01-09 19:28:55

标签: javascript dom-events tic-tac-toe

我希望 while 循环在我点击按钮后停止,但我的整个屏幕都被冻结了,而且窗口似乎对任何类型的事件都没有反应。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <button>Click ME!</button>
  <script>
    const btn = document.querySelector("button");
    let clicked = false;
    btn.addEventListener("click", ()=>{
        console.log("clicked");
        clicked = true;
    })
    while(!clicked){
        console.log("I am waiting")
    }
  </script>
</body>

</html>

2 个答案:

答案 0 :(得分:0)

那是因为您的代码添加了一个事件侦听器(供以后使用),然后有一个循环等待 clicked,但它实际上会阻止 addEventListener 的执行。当代码正在运行时(如您的循环),您(作为用户)甚至无法点击页面,即使可以,addEventListener 回调也会在循环结束后执行。所以这是一种僵局。

我建议您阅读 Event loop,它是 JavaScript 运行时的主要机制,以便更好地理解这一点。

答案 1 :(得分:0)

您的 while 循环立即运行且没有中断,并且会阻止代码执行

你可能是这个意思

const btn = document.querySelector("button");
let clicked = false;
btn.addEventListener("click", () => {
  console.log("clicked");
  clicked = true;
})
let iId = setInterval(function() {
  if (clicked) clearInterval(iId); // clear the interval
  else console.log("I am waiting"); // continue the interval
}, 1000)
<button>Click ME!</button>