キー押下コンテキストのJavaScript検出(フォーム履歴選択とフォーム送信)

StackOverflow https://stackoverflow.com/questions/416220

質問

現在取り組んでいるプロジェクトの開発をスピードアップするために、jQueryを使用して半汎用フォームプラグインを作成しています。

計画は、 jTemplates テンプレートにフィールドが含まれていることです。プラグインはテンプレートを調べて、多言語のリソースを必要とし、サーバーからそれらを要求し、すべてをJavaScriptオブジェクトにパッケージ化してから、「送信」のカスタム関数に渡します。

標準の「Enterが押されたときにフォームを送信」を除き、すべてが正常に機能しています。フォームを偽造するときに実行する必要があるコード:

opts.coreElement.find('input[type=text]').keypress(function(evt) {
    if ((evt.keyCode || evt.which) == 13) {
        opts.coreElement.find('.saveButton').click();
    }
});

問題は、Firefoxでは(少なくとも、他のブラウザーをまだチェックしていない)、以前に同じ名前のテキストボックスに情報を入力したことがある場合、フォーム履歴を取得することです。次に、Enterキーを押してこれらの推奨値のいずれかを選択すると、フォームが送信されます。あなたがページの最初の入力をしているのなら、素晴らしいことではありません。本当に迷惑な、実際に。

明らかな解決策は、フィールドの周りにフォーム要素を挿入し、jQueryを介してこのダミーフォームの送信を停止することです。幸いなことに、私はASP.NET MVCを使用しているので、これを実行する余裕がありますが、そうでない場合はどうでしょうか。プラグインがすでにフォーム内にあるかどうかを知らず、それ自体を維持する必要がある場合はどうなりますか?標準のWebForms ASP.NETを使用していて、手動で「ターゲット」にした 場合はどうなりますか?各入力のリターンキーが正しい送信ボタンに移動しますか?

イベントオブジェクト自体を介して、キー押下のコンテキストを検出する方法はありますか?フォーム履歴項目の選択を除外できますか?

役に立ちましたか?

解決

テキストフィールドの autocomplete 属性を off に設定します:

opts.coreElement.find('input[type=text]').each(function() {
     $(this).attr('autocomplete', 'off');
});

これはすべての主要なブラウザー(Safari、Firefox、IE)で機能します。

他のヒント

[enter]または[tab]キーイベントのデフォルトアクションを防止するには、keydownイベントをリッスンし、それを処理/キャンセルする必要があることがわかりました。
keyupまたはkeypressがトリガーされるまでに、keydownのデフォルトはすでに発生しています。

wulongからの回答は機能しますが、質問に完全には答えませんでした。 提案された解決策は、テキスト入力フィールドの履歴を無効にすることです。 しかし、キー入力イベントが入力テキストまたは履歴から発生したことを知る方法はありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top