2017-04-05 10 views
0

このページには複数のフォームが含まれていますが、それぞれに既に問題なしで実装された検証があります。いくつかの状況のた​​めに、jQueryの検証にaddMethodを使用して、select2.jsを必要に応じて動作させる必要がありました。 selectの値が0の場合、検証のためにfalseを返す。 addMethodは1つのフォームで動作します。他のフォームのaddMethodを追加すると、検証が正しく機能していないようです。1つのページで複数のフォームの検証を追加する方法

demo site click here

シナリオ
左トップに「レポート」ボタンをクリック>、フォームのいずれかが表示され、その後変換レートのレポート]ボタンをクリックし、「検索」ボタンは、エラー・メッセージをクリックしてください表示されます。デフォルトでは、入力フィールドに値が入っていると、それぞれエラーメッセージが表示されます。 select2のドロップダウンでは、単に「国を選択」ではなく、値が入っていても、エラーメッセージが残っています。現在のところ、エラーメッセージは、別のフォームを開く場合でも保持されます。 "country report"ボタンをクリックすると、別のフォームが表示され、検索ボタンをクリックすると、入力フィールドが空であるためエラーメッセージが表示され、select2ドロップダウンから国を選択します。エラーメッセージが消えた(正常)。この間、コンバージョン率レポートフォームに戻ると、select2エラーメッセージが表示されます。たとえ私がその中の選択を変更したとしても、それはもはやエラーメッセージをトリガーしません。

私は多くのことを知っていますが、仲間の "中間"フロントエンドの開発者に感謝してください。

HTML要素

<form id="search_country_report_form" action="con_sum.html"> 
      <span class="close_search_pop lnr lnr-cross"></span> 
      <div class="report_search block_padding"> 
       <h2>Search Country report</h2> 

       <ul class="report_search_date_range clearfix"> 
        <li><span><b>Date range*</b></span></li> 
        <li> 
         <label>From</label><input type="text" readonly="readonly" name="startStringDate" id="search_country_date_from" /> 
        </li> 
        <li> 
         <label>to</label><input type="text" readonly="readonly" name="endStringDate" id="search_country_date_to" /> 
        </li> 
       </ul> 
       <ul class="report_search_top_cat clearfix"> 
        <li> 
         <label><b>Country name*</b></label> 
         <select id="search_country_country_name" name="countryName"> 
          <option value="0">Select country</option> 
          <option value="TH">Country #1</option> 
          <option value="MY">Country #2</option> 
         </select> 
        </li> 
       </ul> 
       <div class="btn_wrap clearfix"> 
        <button class="search_btn" type="submit">Search</button> 
       </div> 
      </div> 
     </form> 

jQueryのスクリプト

$("form").each(function() { 
     var search_country_report = $('#search_country_report_form'); 

     $.validator.addMethod("countryNameCheck", function (value) { 
      var theField = $("#search_country_country_name"); 
      if (theField.val() === '0') { 
       console.log($("#search_country_country_name").val()); 
       return false; 
      } else { 
       return true; 
       console.log($("#search_country_country_name").val()); 
      } 
     }); 

     var validobj = search_country_report.validate({ 
      rules: { 
       startStringDate: { 
        required: true 
       }, 
       endStringDate: { 
        required: true 
       }, 
       countryName: { 
        required: true, 
        countryNameCheck: true 
       } 
      }, 
      messages: { 
       startStringDate: "Required", 
       endStringDate: "Required", 
       countryName: "Country name is required" 
      }, 
      onKeyUp: true, 
      errorElement: 'span', 
      errorClass: "searchErrorText", 
      errorPlacement: function (error, element) { 
       var elem = $(element); 
       error.insertAfter(element); 
      }, 

      highlight: function (element, errorClass, validClass) { 
       var elem = $(element); 
       if (elem.hasClass("select2-offscreen")) { 
        $("#s2id_" + elem.attr("id") + " span").addClass(errorClass); 
       } else { 
        elem.addClass(errorClass); 
       } 
      }, 

      unhighlight: function (element, errorClass, validClass) { 
       var elem = $(element); 
       if (elem.hasClass("select2-offscreen")) { 
        $("#s2id_" + elem.attr("id") + " span").removeClass(errorClass); 

       } else { 
        elem.removeClass(errorClass); 
       } 
      } 
     }); 

     var thisParent = $('.select2-selection').parent(); 
     $(document).on("change", thisParent, function() { 
      if (!$.isEmptyObject(validobj.submitted)) { 
       validobj.form(); 
      } 
     }); 

     $(document).on("select2-opening", function (arg) { 
      var elem = $(arg.target); 
      if ($("#s2id_" + elem.attr("id") + " span").hasClass("myErrorClass")) { 

       $(".select2-drop span").addClass("myErrorClass"); 
      } else { 
       $(".select2-drop span").removeClass("myErrorClass"); 
      } 
     }); 

     search_country_report.submit(function() { 
      validobj.form(); 
     }); 
    }); 

答えて

0

それはonKeyUpではありません。それはonkeyupであり、何かを壊すことなくtrueに設定することはできません。ドキュメントを参照してください。

jqueryvalidation.org/validate/#onkeyup

第二に、あなたのカスタムメソッドは、一度だけ定義する必要があります。 .each()から削除してください。実際には.validate()メソッドが.each()の中で必要なのは唯一のようです。

あなたのコードに残っている可能性のある問題は、私が見たことがありません。

0

Sparkyの助けを借りてChearius solutionと結合してくれてありがとうございました。私は.eachの外にaddメソッドを移動して解決しました!将来誰かがこの問題に遭遇したら、それを共有したいだけです。

$.validator.addMethod("name", function (value, element) { 
     // get closest form 
     var thisForm = $(element).closest("form"); 
     // find the target 
     var theField = thisForm.find(".select2-hidden-accessible"); 
     if (theField.val() === '0') { 
      return false; 
     } else { 
      return true; 
     } 
    }); 
関連する問題