これは私を夢中にさせています。説明するのは難しいですが、やってみます。
サイトのフロント ページに入力テキスト フィールドが 1 つあります。keyCode をチェックする keydown イベント オブザーバーをコーディングしました。その ENTER (または equiv) の場合は、入力値 (電子メール) をチェックします。電子メールが有効で DB 内で一意である場合、フォームが送信されます。基本的なもの、またはそう思うでしょう。
フィールドにメール アドレスを入力して Enter キーを押すと、すべてのブラウザで問題なく動作します。ただし、最初の数文字を入力し、矢印キーを使用して履歴ドロップダウン ボックスからメールを選択し (ここでの意味を理解していただければ幸いです)、Enter キーを押すと、結果が異なります。フォーム フィールドの値は、入力した数文字としてキャプチャされているため、検証は失敗しています。エンターキーを押して履歴ドロップダウンからメールを「選択」すると、入力しているようにブラウザーが中断しているようです。
Chrome と Safari では、正常に動作します。Enterキーを押して履歴ドロップダウンからメールを「選択」すると、そのメールアドレスがテキストボックスに入力されるだけです。2 回目の ENTER キーを押したときにのみ、イベント オブザーバーがトリガーされ、電子メールが検証されます。
なぜこれが起こっているのか、誰かが光を当ててくれることを願っています...私の直感はブラウザの問題であり、私が修正できないものになるでしょう.
ありがとうリー
編集:私の質問に明確にするために、「キーダウン」イベントを使用してエンターキーが押された瞬間をキャプチャすることを追加させてください。「キーアップ」イベントを試してみましたが、これで上記の問題は解決しましたが、フォームの送信を単独で停止できないようです。「keyup」イベントはデフォルトの動作の後にトリガーされるため、これは適切な選択ではありません。
さらに編集:
ありがとうございます。ところで、あなたの英語は素晴らしいです (下手な英語についてのあなたのコメントに応えて)。
イベントハンドラーを次から変更しました。
$("emailInputBox").observe("keydown", function(event) {
return submitViaEnter(event, submitSignupFormOne);
});
これに:
$("emailInputBox").observe("keydown", function(event) {
setTimeout(submitViaEnter.curry(event, submitSignupFormOne),0);
});
submitViaEnter
:
function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
event.stop();
return callback(event);
}
return true;
}
動作しているように見えますが、現在の問題は、ブラウザーが関数を実行する前にデフォルトのアクションを実行することを許可されていることですsubmitViaEnter
。つまり、Enter キーを押したときにフォームが送信されていることを意味します。