Javascript 捕获错过的按键事件

标签 javascript php jquery jquery-events onkeydown

免责声明:我不是一个真正的开发人员,所以我这里可能有一些代码意大利面条......现在我需要使用我所拥有的东西,这意味着我最终可能会得到一个管道 -磁带类型修复。 ;-)

我使用 Javascript 和 PHP 执行以下操作:

  • 在屏幕上闪现一对图像
  • “监听”并捕获按键操作(指示左图像或右图像的特定键)
  • 重复 10 对图像

我通过让 Javascript 更改带有图像对的 div 的可见性并调用事件监听器来完成此操作,所有这些都精确计时。 “捕获”部分是通过使用innerHTML将LR“写入”页面的表单区域来完成的。

问题是,我没有办法注意到是否有人在机会窗口期间错过了按下某个键。因此,在流程结束时提交表单之前,我不会计算记录的响应。

我希望它要么在 10 个图像对的末尾发出通知,然后让用户重做 session ,要么注意到错过了哪些图像对并自动重新显示该对(或多对)。

这是我得到的代码,用于执行图像对闪烁并捕获按键操作。

<script type="text/javascript">
var randomPairList = <?php echo $_POST['topicNumber']-1; ?>;
function imgChoice(imgPair)
{
  var imgDataR = '<input type="hidden" name="'+imgPair+'[<?php echo $_POST['topicNumber']; ?>]" value="r" />';
  var imgDataL = '<input type="hidden" name="'+imgPair+'[<?php echo $_POST['topicNumber']; ?>]" value="l" />';
  var noData = '<?php $noData = 1; ?>';
  $(document).on('keydown', function(event)
  {
    if (event.keyCode == 67 || event.keyCode == 37)
    {
      document.getElementById(imgPair+'Data').innerHTML = imgDataL;
      $(document).unbind('keydown');
    }
    if (event.keyCode == 77 || event.keyCode == 39)
    {
      document.getElementById(imgPair+'Data').innerHTML = imgDataR;
      $(document).unbind('keydown');
    }
  });
  //div = document.getElementById(imgPair);
}

function stopChoice(imgPair)
{
  $(document).unbind('keydown');
}

function flashImages()
{
  i=500;
  //$('#startTopic').fadeOut(500);
  setTimeout("document.getElementById('fullpd').style.cursor='none';",50);
  setTimeout("document.getElementById('fullpd').style.background='#464646';",500);
  for(x=1;x<imgPairs.length;x++)
  {
    setTimeout("document.getElementById('clickSound').play();",i+2000);
    setTimeout('document.getElementById("'+imgPairs[x]+'").style.display="block";',i+3500)
    setTimeout('imgChoice("'+imgPairs[x]+'");',i+3495)
    setTimeout('document.getElementById("'+imgPairs[x]+'").style.display="none";',i+4000)
    setTimeout('stopChoice("'+imgPairs[x]+'");',i+6000)
    i=i+4000;
  }
  setTimeout("document.getElementById('fullpd').style.background='#eaeaea';",i+1000)
  setTimeout("document.getElementById('fullpd').style.cursor='default';",i)
  setTimeout(function() {$('#endTopic').fadeIn(1000);},i+1000);
}
</script>

所以,我想知道是否有一种方法可以对 event.keyCode 进行简单计数,以便最后调用另一个函数来确保总共记录了 10 个事件,并且如果不重新启动...或者一种专门跟踪丢失的 imagePair 的方法,然后自动重新运行这些对。

最佳答案

我找到了一种方法来实现我所需要的......

我在函数内部添加了一个计数器来记录按键事件:

var randomPairList = <?php echo $_POST['topicNumber']-1; ?>;
var choicesMade = 0;
function imgChoice(imgPair)
    {
        var imgDataR = '<input type="hidden" name="'+imgPair+'[<?php echo $_POST['topicNumber']; ?>]" value="r" />';
        var imgDataL = '<input type="hidden" name="'+imgPair+'[<?php echo $_POST['topicNumber']; ?>]" value="l" />';
        var noData = '<?php $noData = 1; ?>';
        $(document).on('keyup', function(event) {
            if (event.keyCode == 67 || event.keyCode == 37) {
                document.getElementById(imgPair+'Data').innerHTML = imgDataL;
                $(document).unbind('keyup');
                choicesMade+=1;
                document.getElementById('choicesMade').innerHTML = choicesMade;
                }
            if (event.keyCode == 77 || event.keyCode == 39) {
                document.getElementById(imgPair+'Data').innerHTML = imgDataR;
                $(document).unbind('keyup');
                choicesMade+=1;
                document.getElementById('choicesMade').innerHTML = choicesMade;
            }
        });
}

function stopChoice(imgPair)
    {
        $(document).unbind('keyup');
    }

然后,我更改了显示“endTopic”div 的代码,使其在未达到所需的选择数量时选择不同的 div 来显示:

function flashImages(){
    i=500;
    //$('#startTopic').fadeOut(500);
    setTimeout("document.getElementById('fullpd').style.cursor='none';",50);
    setTimeout("document.getElementById('fullpd').style.background='#464646';",500);

    for(x=1;x<=imgPairs.length-1;x++){
        setTimeout("document.getElementById('clickSound').play();",i+2000);
        setTimeout('document.getElementById("'+imgPairs[x]+'").style.display="block";',i+3500)
        setTimeout('imgChoice("'+imgPairs[x]+'");',i+3495)
        setTimeout('document.getElementById("'+imgPairs[x]+'").style.display="none";',i+4000)
        setTimeout('stopChoice("'+imgPairs[x]+'");',i+6005)
        i=i+4000;
        }
    setTimeout("document.getElementById('fullpd').style.background='#eaeaea';",i+1000)
    setTimeout("document.getElementById('fullpd').style.cursor='default';",i)
    setTimeout(function() {if(choicesMade < 10){$('#missedChoices').fadeIn(1000);} else {$('#endTopic').fadeIn(1000);}},i+1000);
    //setTimeout(function() {$('#endTopic').fadeIn(1000);},i+1000);
}

然后,在“missedChoices”div 中,用户会收到一条消息,表明他们错过了一些回复,并且可以使用按钮“返回”。

到目前为止,似乎一切正常! :-)

关于Javascript 捕获错过的按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520032/

相关文章:

javascript - 从 GeoJSON 数据为 div 分配 ID

javascript - jquery ie6单选按钮问题

javascript - 通过唯一子项查找父元素,但单击另一个子项

javascript - Highstock - 动态更改刻度定位器

php - 批量插入防止循环插入 codeigniter

php - 如何通过 Laravel 5.2 中的 ajax 请求将 Json 数组中的数据插入数据库

jquery - 将类添加到包含 ul 子级的父级

javascript - 使用 Javascript 通过链接抓取并发送文本值

javascript - 如何让机器人知道如何删除它创建的网络钩子(Hook)以及按 channel 提及的内容

php - MySQL 左连接,SQL 语法错误