我正在使用 Javascript / JQuery 创建一个基于 Web 的实验,它要求用户通过按下某些键而不是其他键来给出响应。如果他们按错了键,他们应该会收到一个警报弹出窗口,告诉他们他们按错了键。在显示警报时,实验应该停止等待下一次按键,但一旦警报解除,就会返回等待。
我遇到的问题是,如果通过按 ENTER 键解除警报,它似乎是由键事件处理程序注册的,从而触发另一个警报(因为 ENTER 不是允许的键之一),即使我以为我的编写方式是在解除警报之前不应调用键事件处理程序。我的问题是,如何确保随后调用的事件处理程序不会收到用于解除警报的 ENTER 按键?
这是一些代码:
function waitForKeypress( permittedKeys, callbackFn ) {
returnFn = function(e) {
$(document).unbind('keyup',returnFn);
if ( permittedKeys.indexOf( e.which )!=-1 ) {
callbackFn( { "success": true, "value": e.which } );
} else {
callbackFn( { "success": false } );
}
}
$(document).keyup( returnFn );
}
var callback = function(data) {
if ( data.success ) {
goDoOtherStuff();
} else {
alert( "error message" );
waitForKeyPress( permittedKeys, callback );
}
}
waitForKeyPress( permittedKeys, callback );
我应该解释一下,我认为用于解除警报的 ENTER 按键不会被 waitForKeyPress 中的事件处理程序接收的原因是因为(我认为)只要显示警报,Javascript 就应该停止执行,以便 waitForKeyPress 调用回调函数内部不应该关闭,直到警报被解除,也就是说,在 ENTER 键被释放之后。
(我的实际 waitForKeyPress 比上面更复杂 - 它等待按键对,只允许某些对,这就是为什么我首先需要将它作为一个单独的函数的原因。我不认为这些东西不过,我删除的内容与我的问题有关。)
编辑:有些人认为这可能与事件处理程序没有正确解除绑定有关。我确定这不是问题。这是一个更简洁的示例,其中事件处理程序甚至在警报之后才被绑定,但出现了同样的问题:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
alert( "Hello world" );
$(document).keyup( function() { alert( "Goodbye cruel world." ) } );
</script>
</html>
按下 ENTER 键关闭 Hello World 将立即调用 Goodbye 残酷世界。