1

私は3つのイベントをバインドしています:

$("#form").bind('keyup change submit',function(event){
    //do something
    alert("test alert");
});

フォームには、テキスト フィールド、ドロップダウン、チェックボックスなどを含めることができます。

私が気づいたことから、テキスト ボックスの「外側」をクリックするまで、「変更」イベントはテキスト フィールドでトリガーされません。だから、私は「キーアップ」イベントを使用します。
そして、「送信」イベントは一目瞭然です。(基本的に、これらのイベントをバインドすることで、複数のセレクターを実行する必要がなくなります。) また、後でさらにイベントを追加することもできます。

ここに私の問題があります....

テキストボックスに変更を加えると、ポップアップアラートが2回トリガーされます。それが原因でポップアップのボタンをクリックしているためなのか、それともテキストボックスの値を変更するとキーアップと変更イベントの両方が同時にトリガーされるのかはわかりません。

いずれにせよ、それは私を夢中にさせています。

複数のセレクターを使用せずに、この方法を改善することについて何か考えはありますか?

4

3 に答える 3

1

編集:「複数のセレクターがない」というあなたのメモを見ました。以下は、必要に応じて連鎖させることができます。

メモリを最も効率的に使用するために、それをいくつかのステートメントに分割します。

//Your function
var handler = function(e) {  alert('blah'); };

$('#form input[type=text], #form textarea').keyup(handler);
$('#form select, #form checkbox, #form radio').change(handler);
$('#form').submit(handler);

要素は 1 つのイベントをトリガーするだけなので、これは便利です。

ちなみに、IE 6 のサポートを期待している場合は、チェックボックス/ラジオ/選択がぼやけるまで変更イベントがトリガーされないため、それらを別の方法で処理することをお勧めします (チェックボックス/ラジオではクリックは引き続きうまく機能します)。

于 2009-11-08T18:46:02.797 に答える
0

2 番目のアラートは、最初のアラートによってトリガーされます。最初のアラートがポップアップすると、テキストフィールドはフォーカスを失い、変更イベントがトリガーされます。実際のハンドラーがテキストフィールドのフォーカスを失わない場合、問題になることはありません。ただし、これらのフィールドを処理するために既に keyup を使用しているため、テキストフィールドの change イベントを無視することをお勧めします。
Ryan Lynch の旗のアイデアを使用すると、次のことができます。

var target = null;
$("#form").bind('keyup change submit',function(event){
    if (event.type == 'keyup') {
        target = event.target;
    // a change event after one or more keyup events in the same element
    } else if (event.type == 'change' && target === event.target) {
        //do nothing
        return false;
    }
    // actual handler code
    alert(event.type) // test code
});

Firefox でテスト済み。これが役立つことを願っています。

于 2009-11-08T04:50:46.783 に答える
0

コールバック関数の外側のどこかにブール値フラグを設定しないのはなぜですか (もちろん、共有スコープ内にあります)。最初の呼び出しはフラグを設定して実行し、他の呼び出しはフラグを見て戻ります。ユーザーが警告ボックスを閉じたときにフラグをリセットできます。

編集:別の要素がこれらのアラートを発行できるようにしたい場合の別のオプションは、ハンドラーがイベントリスナーとしてそれ自体を削除することです。その後、アラートボックスが閉じたときに再登録できます。

于 2009-11-08T00:27:23.167 に答える