gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:03:48 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com