Javascript 西蒙说游戏无法在电脑回合中禁用彩色键盘

Javascript 西蒙说游戏无法在电脑回合中禁用彩色键盘,javascript,jquery,Javascript,Jquery,我已经建立了西蒙游戏。如果用户正确播放,它可以正常工作,但为了充分证明这一点,我想在计算机显示下一个模式时禁止用户单击选项。我已经尝试过将jquery.on/.off.unbind/.bind与e.preventDefault结合使用,但都没有成功。有人能帮我添加这个功能的解决方案吗?如果你想看到完整的项目,这是一个codepen链接,因为我只想在下面发布相关的代码 HTML: 我的建议是使用某种旗帜来决定比赛的状态 显然,.off()并没有起到作用,所以我想说删除对它的所有引用。然而,我相信它

我已经建立了西蒙游戏。如果用户正确播放,它可以正常工作,但为了充分证明这一点,我想在计算机显示下一个模式时禁止用户单击选项。我已经尝试过将jquery.on/.off.unbind/.bind与e.preventDefault结合使用,但都没有成功。有人能帮我添加这个功能的解决方案吗?如果你想看到完整的项目,这是一个codepen链接,因为我只想在下面发布相关的代码

HTML:


我的建议是使用某种旗帜来决定比赛的状态

显然,
.off()
并没有起到作用,所以我想说删除对它的所有引用。然而,我相信它不起作用的原因是你用错了。解除绑定时不需要使用
.each()
。这就是选择器的作用,因此如果您使用
$('.field').off('click','**')
,则应该从具有
class='field'
的任何元素中删除所有委托的单击处理程序。要了解正确的用法,我建议查看以下内容:

但是,我仍然不认为您应该删除委派的事件。为了简化事情,只需要有一个可以检查的标志来查看游戏状态

var gameState = 0; //0 means the user can click, 1 means the user cannot

function playComputerSequence(seq, speed){
   gameState = 1;

   //Rest of function code
   //...

   gameState = 0;
}

function recordUserChoice(){
   if(gameState === 1) return; //if gameState is 1, jump out of the function

   //Rest of function code
   //...
}
虽然这种逻辑是可行的,但对于您的情况,它需要进行稍微不同的调整

在代码的开头,在
音频阵列的下方
放置下面的代码。这将是您的
字段
单击处理程序

$(document).on('click', '.field', recordUserChoice);
然后,我意识到,
gamestate
基本上会立即变回
0
,所以我把它放在
clearInterval(interval)
下面,因为这是决定计算机何时运行的因素

if(i == count)
{
   clearInterval(interval);
  gamestate = 0;
  console.log(gamestate);
}
然后,您可以删除
$('.field')的所有实例。每个(


查看此笔:

Adjit是正确的,
.off()
不接受您定义的anon函数。它只接受对函数名的引用,以从元素中删除特定的事件处理程序。您的解决方案对我来说很有意义,我尝试实现它。在comp序列中,我的更新笔现在看起来是这样的,它记录0并输入else语句。我想可能是因为compSequence函数中的setInterval或setTimeout,不确定。而且,如果我尝试更改$('.field').each(function(){$(this).off().on('click',recordUserChoice);});在('click',recordUserChoice)上;游戏中断了,就像它两次调用recordUserChoice一样。所以我不能像你建议的那样移除这个test@RawleJuglal现在看一看。继续测试并移动gameState=0,以恢复用户使用clearInterval(interval)点击setTimeout函数的能力,这解决了问题。非常感谢你的建议。“我甚至没有想过要用旗子来检查。”罗莱朱格拉尔很乐意帮忙。有时候,最好的解决方案是最简单的。
$(document).on('click', '.field', recordUserChoice);
if(i == count)
{
   clearInterval(interval);
  gamestate = 0;
  console.log(gamestate);
}