Javascript / JQuery を使用して、ユーザーが特定のキーを押して応答する必要がある Web ベースの実験を作成していますが、他のキーは押しません。間違ったキーを押すと、間違ったキーを押したことを知らせる警告ポップアップが表示されるはずです。アラートが表示されている間、実験は次のキー押下の待機を停止する必要がありますが、アラートが解除されると待機に戻ります。
私が抱えている問題は、ENTER キーを押してアラートを消すと、キー イベント ハンドラーによって登録されているように見えるため、別のアラートがトリガーされることです (ENTER キーは許可されたキーの 1 つではないため)。アラートが解除されるまでキー イベント ハンドラが呼び出されないように記述したと思います。私の質問は、アラートを却下するために使用される 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 が実行を停止する必要があるためであると説明する必要があります。コールバック関数内では、アラートが解除されるまで、つまり ENTER キーが離されるまでオフにしないでください。
(私の実際のwaitForKeyPressは上記よりも複雑です-特定のペアのみが許可されたPAIRSのキー押下を待機します。これが、そもそもそれを別の機能にする必要があった理由です。ただし、削除したのは私の問題に関連しています。)
編集:一部の人々は、これはイベントハンドラーが適切にバインド解除されていないことに関係している可能性があると示唆しました。これは問題ではないと確信しています。より簡潔な例を次に示します。イベント ハンドラーはアラートが発生するまでまったくバインドされませんが、同じ問題が発生します。
<!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 が呼び出されます。