JQuery验证器自定义错误放置不起作用

时间:2014-10-13 16:28:02

标签: javascript jquery checkbox jquery-validate

我在@TrueBlueAussie的帮助下使用自定义图像创建了一个复选框。我现在停留在下一步,即在自定义复选框之后放置验证错误消息。

如果我取消隐藏复选框,我可以看到它正在检查/未检查。我也得到验证错误按预期显示。虽然这样可行,但通过图像按钮取消选中复选框并不会删除错误消息。

此外,当我向复选框添加display:none时,错误消息根本不会显示。我的代码出了什么问题?

我创建了一个FIDDLE here来显示问题。请从复选框中删除display:none以查看症状。

HTML:

<input type="checkbox" id="AcceptTerms_check" name="AcceptTerms_check" style="display:none;"> 
<img class="chk-img" id="AcceptTerms" src="../../../wp-content/uploads/misc/notselected.png">
<span id="ts-cs-accept">I have read and accept the Terms and Conditions.</span>

jQuery验证器代码:

 jQuery("#InstallerForm").validate({
     rules: {
         InstBizNam: {
             required: true
         },
         AcceptTerms_check: {
             required: true
         }
     },
     messages: {
         InstBizNam: "Please enter business name",
         AcceptTerms_check: "Please read and accept the program terms to submit your application"
     },
     errorPlacement: function (error, element) {
         if (element.attr("name") == "AcceptTerms_check") {
             error.insertAfter("#ts-cs-accept");
         } else {
             error.insertAfter(element);
         }
     },
     submitHandler: function (form) {
         alert("SUBMITTED!");
     }
 });

1 个答案:

答案 0 :(得分:2)

这是因为默认情况下,隐藏元素将从验证中排除。您可以将自定义选择器传递给ignore选项以覆盖默认设置。

jQuery(document).ready(function() {
  jQuery("#InstallerForm").submit(function(event) {
    event.preventDefault();
    return false;
  });

  jQuery('.chk-img').click(function(e) {
    var element = jQuery(this);
    var $checkbox = jQuery('input:checkbox[name=' + this.id + '_check]');
    if ($checkbox.prop("checked")) {
      $checkbox.prop('checked', false);
      jQuery(element).attr("src", "//placehold.it/24/ff0000");
    } else {
      $checkbox.prop('checked', true);
      jQuery(element).attr("src", "//placehold.it/24/00ff00");
    }
    $checkbox.valid()
  });

  jQuery("#InstallerForm").validate({
    ignore: ':hidden:not(#AcceptTerms_check)',
    rules: {
      InstBizNam: {
        required: true
      },
      AcceptTerms_check: {
        required: true
      }
    },
    messages: {
      InstBizNam: "Please enter business name",
      AcceptTerms_check: "<br/>Please read and accept the program terms to submit your application"
    },
    errorPlacement: function(error, element) {
      if (element.attr("name") == "AcceptTerms_check") {
        error.insertAfter("#ts-cs-accept");
      } else {
        error.insertAfter(element);
      }
    },
    submitHandler: function(form) {
      alert("SUBMITTED!");
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.11.1/jquery.validate.min.js"></script>
<form id="InstallerForm" name="InstallerForm" action="" method="get">
  <fieldset>
    <label for="InstBizNam">Business Name*:</label>
    <input name="InstBizNam" id="InstBizNam" type="text" class="input-text" tabindex="5" placeholder="Business Name" />
    <br/>
    <br/>
    <input type="checkbox" id="AcceptTerms_check" name="AcceptTerms_check" style="display:none;" />
    <img class="chk-img" id="AcceptTerms" src="//placehold.it/24/ff0000" /> <span id="ts-cs-accept">Accept Terms</span>

    <br/>
    <br/>
    <input name="submit" type="submit" value="Submit Application" />
  </fieldset>
</form>

在上述情况下,我们忽略了除#AcceptTerms_check之外的所有隐藏元素。