2017-04-05 63 views
0

该页面包含多个表单,其中每个表单都已经验证实施没有问题。由于某些情况,我不得不使用addMethod进行jquery验证,以便使select2.js按照我的需要工作。如果select的值为0,则验证返回false。 addMethod为1表单工作,当我添加其他表单的addMethod时,验证似乎无法正常工作。jQuery多页表单验证1页添加方法

demo site click here

方案
点击“报告”按钮,左上方>则点击转换率报告按钮的形式将显示一个,点击“搜索”按钮,然后在错误信息将会呈现。默认情况下,当输入字段有值时,错误消息将分别消失。至于select2下拉列表,错误信息仍然存在(奇怪),即使其中有值,而不是“选择国家”。截至目前,即使您打开另一个表单,错误消息仍然会持续存在。现在点击“国家报告”按钮,将出现另一个表格,点击搜索按钮,由于输入字段为空,现在会显示错误信息,现在从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; 
     } 
    });