You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于复选框的jQuery文本框验证问题:未勾选时验证仍触发

仅在复选框勾选时验证文本框,取消勾选后停止验证

我希望仅在复选框被勾选时对文本框的值进行验证,目前验证功能可运行,但复选框未勾选时验证仍会执行。

原代码

JavaScript

$("#personal_deliver_same").on("click", function(){
  var check = $("#personal_deliver_same").is(':checked');
  if(check){
    $("#input-payment-postcode").keyup(function (){ 
      if($("#input-payment-postcode").val().length > 5) {
        alert("in2");
      }
    });     
  }
  else{
    alert("out2");
  }
});

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<label class="control-label" for="input-payment-postcode">Post Code</label>
<input type="text" name="personal_details[postcode]" value="" placeholder="" id="input-payment-postcode" class="formcontrol">
<br>
<input type="checkbox" id="personal_deliver_same" name="personal_details[shipping_address]" value="1" />
<label>My Checkbox</label>

问题原因

每次勾选复选框时,你都会给文本框绑定新的keyup事件,但取消勾选时并没有移除之前绑定的事件。这意味着即使取消了勾选,之前绑定的事件依然存在,输入文本时仍会触发验证逻辑。

解决方法

方案1:单次绑定,内部判断状态

最简洁的方式是给文本框绑定一次keyup事件,每次触发时先检查复选框的状态,再决定是否执行验证:

$("#input-payment-postcode").on("keyup", function() {
  // 仅在复选框勾选时执行验证
  if ($("#personal_deliver_same").is(':checked')) {
    if ($(this).val().length > 5) {
      alert("邮政编码长度不能超过5位");
    }
  }
});

方案2:动态绑定/解绑事件

如果需要严格在复选框切换时绑定或移除事件,记得使用off()先清除已有事件,避免重复绑定:

$("#personal_deliver_same").on("click", function(){
  const isChecked = $(this).is(':checked');
  const $postcodeInput = $("#input-payment-postcode");
  
  if(isChecked){
    // 先移除旧事件,再绑定新事件
    $postcodeInput.off("keyup").on("keyup", function (){ 
      if($(this).val().length > 5) {
        alert("邮政编码长度不能超过5位");
      }
    });     
  }
  else{
    // 移除验证事件
    $postcodeInput.off("keyup");
    alert("已停止邮政编码验证");
  }
});

完整可运行示例

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<label class="control-label" for="input-payment-postcode">邮政编码</label>
<input type="text" name="personal_details[postcode]" value="" placeholder="" id="input-payment-postcode" class="form-control">
<br>
<input type="checkbox" id="personal_deliver_same" name="personal_details[shipping_address]" value="1" />
<label>勾选后验证邮政编码</label>

<script>
$("#input-payment-postcode").on("keyup", function() {
  if ($("#personal_deliver_same").is(':checked')) {
    if ($(this).val().length > 5) {
      alert("邮政编码长度不能超过5位");
    }
  }
});
</script>

内容的提问来源于stack exchange,提问作者dee flor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:47:46