以前にも同様の問題がありました。私の知る限り、ユーザーが右クリックして貼り付けたとき、または以前に使用した値のリストから選択したときに、ブラウザーはイベントを発行しません。
イベントハンドラーをさらにblurイベントにバインドすることで、十分に解決することができました。これがキャッチされなかった唯一のケースは、マウスで値を貼り付け、Enter キーを押して送信した場合です。ちょっとしたハッカーでこれを回避できました:
$(element)
.bind('keydown blur', handlerFunction)
.keydown(function(event) {
if (event.keyCode === 13 /* Enter Key */) {
event.preventDefault();
event.stopPropagation();
}
})
.keyup(function(event) {
if (event.keyCode === 13 /* Enter Key */) {
$(this).closest('form').submit();
}
});
基本的に、jQuery はバインドされた順序でイベントを実行するため、これは機能します。通常、フォームの送信は、Enter キーを押してキーを押したときに行われます。keyup ハンドラーにマジックを実行する時間を与えるには、keyup イベントが発生するまでフォームの送信を遅らせる必要があります。これにより、他の keyup ハンドラーが最初に実行できるようになります。
さて、あなたは、ユーザー イベントに反応する前に遅延を追加するプラグインを使用していると言いました。つまり、この手法を逐語的に使用できない場合があります。代わりに機能する可能性のある方法の 1 つは、フォームの送信を許可する前にハンドラー関数を直接呼び出すことです。これを行うには、最後の keyup ハンドラーを次のように変更します。
.keyup(function(event) { // Part 2
if (event.keyCode === 13 /* Enter Key */) {
handlerFunction.call(this, event); // force it to happen now
$(this).closest('form').submit();
}
});
Josh K が前に述べたように、何かをフォームの送信イベントに単純にバインドして、同様のことを行うことができます。ただし、そこで Ajax を実行している場合はasync: false
、渡されたオプションを必ず設定してください。そうしないと、呼び出しが完了するのを待たずにフォームが先に進み、送信されてしまうからです。