0

現在、jQuery 検証プラグインを使用して、サイト内で使用されているフォームを検証しています。ただし、複数のフォームの可能性があり、特定のクラスを持つ div 内のすべてのフォームをターゲットにすることになっているすべての検証スクリプトに適合する 1 つのサイズを使用しています。

現在、私の検証は次のとおりです。

    $(document).ready(function(){
      jQuery.validator.addClassRules({
        isemail: {
          required: true,
          email: true
        }
      });

      jQuery.validator.addMethod("ContainsAtLeastOneDigit", function (value) { return /[a-z].*[0-9]|[0-9].*[a-z]/i.test(value); }, 'Your password must contain at least 1 number');

      $(".icams_inserted form").validate({
        errorClass : "invalid",
        validClass : "valid",
        showErrors: function(errorMap, errorList) {
           var err = this.numberOfInvalids();
           if (err > 1) {
             var word = "errors";
             var field = "fields";
             $("#error_message").html("The form contains " + this.numberOfInvalids() +" "+ word + ". Please correct the highlighted " + field + " below."); this.defaultShowErrors();
             }else{
                var word = "error";
                var field ="field";
                if (err < 1) {
                   $("#error_message").html("");
                   this.defaultShowErrors();
                }else{
                   $("#error_message").html("The form contains " + this.numberOfInvalids() +" "+ word + ". Please correct the highlighted " + field + " below."); this.defaultShowErrors();
                }
             }
       },
       submitHandler: function(form){           
            /*For the registration form, move the email address the user has entered into the hidden email field*/
            if (form.hasClass('prefs')) {
                var mail = $('#p_username').val();
                $('input[type="hidden"][name="p_email_address"]').val(mail);
            }
            form.submit();
       },
       rules : {
           p_password:{
               minlength: 8,
               ContainsAtLeastOneDigit: true
           },
           p_password_conf:{
               equalTo: p_password,
               minlength: 8,
               ContainsAtLeastOneDigit: true
           }
       },
       messages:{
          p_password_conf:{
              equalTo: 'The passwords entered do not match'
          }
       }
    });
  })

ただし、何らかの理由で、フォームがないページであっても、すべてのページで検証が開始されるようです。これにより、Firebug で次のエラーが生成されます。

   ReferenceError: p_password is not defined
   equalTo: p_password,

これがなぜなのか誰か知っていますか?私の理解では、プラグインは、この場合は .icams_inserted のクラスを持つ要素内に囲まれたフォームの対象となる要素でのみ起動する必要があるということでしたが、そうではないようです。問題の要素が見つかった場合にのみ検証が行われるべきであることも私の理解でした。この場合、ページには p_password という名前の要素がないため、検証スクリプトは起動されません。なぜこれがこれをしているのか、私は本当に途方に暮れています。

サイト全体に存在しないダミー クラスを使用してみましたが、それでも検証が実行されているようです。どんな助けでも大歓迎です。

4

1 に答える 1

1

改訂:

あなたのエラー...

ReferenceError: p_password is not defined
equalTo: p_password,

...上で説明したように、間違ったルール宣言が原因です...

equalTo: p_password // <-- missing quotes

こんなはずじゃ…

equalTo: "#p_password" // <-- targeted by id in this example

docs に従ってequalTo値は他のフィールドの「セレクター」であり、引用符で囲まれています。

編集: jsFiddle を通じてequalTo、値を引用符で囲まなくてもルールが機能することを確認できました。

ページが読み込まれると、呼び出し内のコードが解析され、フィールドが存在しない場合は.validate()常にエラーがトリガーされます。p_password「検証」は発火していません。



オリジナルは次のとおりです。


引用質問のタイトル:

「フォームが存在するかどうかに関係なく、すべてのページでjQuery Validate関数が起動します」

「検証」は発火していません。.validate()呼び出しは、プラグインの初期化メソッドです


引用OP

「検証は、フォームがないページであっても、すべてのページで開始されるようです。」

添付されたフォームによってトリガーされるイベントがない限り、「検証」は開始されません。単純にフォームにアタッチ.validate()すると、そのフォームでプラグインを初期化するだけです。

$('#myform').validate()≠「検証」

でも、

$('#myform').validate()=フォームでの検証プラグインの初期化id="myform"


OPのコメントを引用

「間違っています。ドキュメントには、この方法で検証を呼び出すと、指定されたフォームのみを検証する必要があることが明確に記載されています。」

はい、「検証」は指定されたフォームでのみ行われます。ただし、呼び出し.validate()「検証開始」と同じではありません。メソッドの呼び出しは、検証プラグインを初期化するだけです。.validate()

「検証」は、「キーアップ」、「ぼかし」、「送信ボタンのクリック」など、プラグインによってキャプチャされたイベントの 1 つによってのみトリガーされます。ページをロードするだけでは「検証」は行われません.....valid()

于 2013-10-31T13:56:14.617 に答える