1

以下の機能は正常に動作します。フォームを検証することです。要するに、私はいくつかの入力フィールドを持っています。[送信]をクリックし、どちらの入力にもテキストが入力されていない場合、検証エラーが表示されます。1つのフィールドに入力すると、1つのフィールドのみが更新されます。しかし、2番目のフォーム入力を入力しなくても、もう一度「送信」を押すと、else {}が起動され、入力されたことを保証するif{}ではありません。

なじみはありませんが、それはfalseを返します。問題?

if ($('input[type="text"]:visible').val().length == 0) {
    $('.submitModal').click(function () {
        $('.modal').modal('show'); 
    });
}
else {
    $('.submitModal').click(function () {
        $('.modal').modal('hide'); 
    });
}

私が間違っていることについて何か考えはありますか?

4

1 に答える 1

1

これは後ろ向きな考え方です。クリック、ピリオドをバインドします。条件付きではありません。クリック時に、何を実行するかを決定します(これは、クリックを無視することを意味する場合でも)。

クリックをバインドする場合、フォームに別の方法で入力しても、バインドが解除されることはありません。実際にバインドを解除できたとしても、大きな理由はありません。

が実際に送信入力要素である場合.submitModal(そのクラスのアンカーまたはボタンではなく)、クリックリスナーをバインドする代わりに、送信リスナーをバインドします。

modalマイク自身のコードの開始点に基づいて、ここに例を示します(不必要な努力なしに使用できる関数がないため、実際のコンテキストから少し外れています!)

$('.submitModal').click(function (e) {
    e.preventDefault();
    $('input[type="text"]:visible').each(function() {
        if ($(this).val().length == 0) {                        
            $('.modal').show();                        
        }
        else {
            $('.modal').hide();
        }
    });
});​

最初に異なるのは、イベントをクリックハンドラーに渡し、次にそれを渡すpreventDefaultことです。これにより、アンカーによってページが更新されるのを防ぎます。

しかし、私が行った他の唯一のことは.modal()、一般的なjQueryの実際の呼び出しを.show()交換し.hide()、ロジックの概念実証を行うことです。

マイク、あなたが書いたサンプルコードはかなり大げさでした(デフォルトのアンカーの振る舞いを実際に防ぎたいと仮定した場合のpreventDefaultを除いて)。証拠は次のとおりです。

jsfiddle.net/gnaXn/2

表示されているすべてのテキストフィールドに入力すると、「モーダル」が非表示になります。それらが再び空になると、「モーダル」が再び表示されます。

于 2012-07-07T04:08:55.790 に答える