Javascript:如何防止用于解除警报的按键触发按键事件处理程序

标签 javascript jquery event-handling alert keyevent

我正在使用 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 比上面的更复杂 - 它等待成对的按键,只允许某些对,这就是为什么我需要首先将它作为一个单独的函数的原因。我不不过,我认为我删除的内容与我的问题有关。)

编辑:一些人认为这可能与事件处理程序未正确解除绑定(bind)有关。我确定这不是问题所在。这是一个更简洁的示例,事件处理程序甚至在警报之后才被绑定(bind),但同样的问题出现了:

<!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 cruel world。

最佳答案

在显示警报之前取消绑定(bind) keyUp

编辑#1

我在 Safari 6 OS X 10.7 上尝试了您编辑的示例代码。

你是对的。

发生这种情况是因为当 Return keydown 发生时,标准按钮(例如警报对话框的“确定”)具有等效键“Return”(我的意思是按钮)被按下。换句话说,当用户按下 return 并且不等待 Return 被释放时,对话框被关闭。

所以用户按下“Return”,对话框被关闭,keyup 被绑定(bind),用户释放“Return”,事件被触发。

您可以通过不同的方式解决此问题。

更简单的方法(如果它符合您的需要)是绑定(bind) keydown 而不是 keyup

alert( "Hello world" );
$(document).keydown( function() { alert( "Goodbye cruel world." ) } );

否则您可以检查按下的是什么键并忽略“Return”。

请记住,按下 CMD(例如,如果用户想使用 CMD-W 关闭窗口)、箭头键(如果内容大于视口(viewport),通常允许用户滚动窗口)也会触发 keydown等

因此,如果您坚持使用 keyup 或切换到 keydown,则某种过滤是合适的。

希望对你有帮助

关于Javascript:如何防止用于解除警报的按键触发按键事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656478/

相关文章:

javascript - 如何转义 javascript 's "\"

javascript - 我的 Vue Hello World 示例显示双括号且未呈现文本

javascript - 使用html5 canvas在圆形中以不同 Angular 显示不同值

javascript - 当 YouTube 加载更多视频时运行代码

android - onTouch()、onClick() 是否在同一线程中顺序运行?

javascript - 包含可拖动表格的 HTML 全尺寸 div

jquery - 引导箱警报焦点未返回到输入

javascript - 如何使用 jQuery 从元素的文本中删除特定字符串?

c# - 如何以编程方式将事件处理程序添加到 .NET 按钮?

c# - 将变量传递给类中的计时器事件