2016-05-25 10 views
0

私は、少なくとも1が必要で検証しようとしています2つのブートストラップ用のフォーム要素を持っている:jQueryの検証は、フォーム送信できないrequire_from_group

  <script src="/public/js/jquery-1.12.4.min.js"></script> 
     <script src="/public/js/jquery.validate.min.js"></script> 
     <script src="/public/js/additional-methods.min.js"></script> 

jQueryのバージョンを検証:

<div class="form-group"> 
    <label>Notification Email:</label> 
    <input type="email" class="form-control notifGroup" id="notifEmail" name="notifEmail" /> 
</div> 
<div class="form-group"> 
    <label for="phone">Notification Phone Number for SMS:</label> 
    <input type="text" class="input-medium bfh-phone notifGroup" data-country="US" id="notifPhone" name="notifPhone" /> 
</div> 

私は私のスクリプトを持っています

1.15.0と私の検証機能:

$(document).ready(function() { 


$('#form').validate({ 

    rules: { 
     notifPhone: { 
      require_from_group: [1, ".notifGroup"] 
     }, 
     notifEmail: { 
      require_from_group: [1, ".notifGroup"] 
     } 
    }, 
    messages: { 


    }, 
    submitHandler: function(form) { 


     var email = $('#notifEmail').val() 
     var phone = $('#notifPhone').val() 

     data = { 

      phone, 
      email 
     } 

     $.ajax({ 
      type: 'POST', 
      url: 'http://myurl/myendpoint', 
      data: data, 
      success: function(res) { 
       if (res == true) {     
        $('#error').html('<p><strong>all good.</strong></p>') 
        $('#form')[0].reset() 
        $('#submitBtn').hide() 
        setTimeout(function() { 
         $('#error').html('<p></p>') 
        }, 5000) 
       }else if (res == 'over limit'){ 
        $('#error').html('<p><strong>too many.</strong></p>'); 
        setTimeout(function() { 
         $('#error').html('<p></p>') 
        }, 5000)     
       }else {    
        $('#error').html('<p><strong>already there.</strong></p>'); 
        $('#form')[0].reset(); 
        $('#submitBtn').hide() 
        setTimeout(function() { 
         $('#error').html('<p></p>') 
        }, 5000) 


       } 

      }, 
      error: function(err) { 
       console.log(err); 
      }, 
      timeOut: 5000 

     }); 

     return false; 
    } 

}); 

});

電子メールまたは電話番号のうちの1つだけを要求するまでは、すべてうまく機能しました。ストレートフォワード検証で両方が必要な場合は、問題はありませんでした。

ただし、1つしか必要としない場合、エラーはスローされず、フォームはブランク値で送信されます。 .notifGroupの代わりにセレクタの一方または両方に不良データを入れた場合、エラーは適切なセレクタ(または両方とも不良データ)でフィールドにスローされますが、両方のフィールドが埋められていてもフォームは送信されません。

大変助かりました。

+0

私のコードにコメントしてSparkyのJSFiddleのコードを私のプロジェクトにコピーしましたが、それはまだ動作しません。私が紛失しているか、JSスクリプトの注文が間違っている可能性がありますか?これはjQuery-jQValidate-additionalmethods-bootstrap-myajaxfile-myformvalidation-bootstrapformhelpersになりますか? –

+0

@ Sparky、エラーメッセージは、ルールにセレクタが正しくない、またはセレクタがない場合にのみ表示されます。しかし、明らかにフォームは提出しません。 –

+0

プラグインのデバッグオプションの使用に関する私の最後のコメントに従いましたか? – Sparky

答えて

0
  1. $().ready(function() {...as per jQuery ready handler documentation "をお勧めしません" です。使用$(document).ready(function() {...または$(function() {...

  2. 個別の.submit()ハンドラを持つ理由はありません。プラグインの組み込みのsubmitHandlerをajaxに使用してください。 .submit()ハンドラがプラグインを妨害する可能性があります。as per plugin documentationsubmitHandlerコールバックは"Ajax経由でフォームを送信する正しい場所"です。

  3. あなたの問題全体を引き起こしているようだが、messagesrulesの兄弟であると考えられています。あなたは間違ってmessagesオブジェクトの中に}という迷子を入れてしまい、構文エラーが発生しています(これはJavaScriptコンソールに表示されているはずです)。

ワーキングDEMO:http://jsfiddle.net/pezez5um/


EDIT: 項目#3はOPで唯一のタイプミスだった場合、その項目#2は、おそらく犯人でした。

+0

実際には不要なデータを削除する際にエラーが発生しましたので、今編集します。 –

+0

@ R.Ericksonに関係なく、項目#2が問題の根本原因でした。あなたの '.submit()'ハンドラは、プラグインの同じイベントの組み込みキャプチャと競合しています。 – Sparky

+0

ご回答いただきありがとうございます。 errant}は、実際に私が編集する不要なデータを削除する際のエラーでした。だから、検証呼び出しと送信呼び出しを切り替え、代わりにsubmitHandlerをsubmit()に置き換える必要があります。 –

関連する問題