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

如何用jQuery实现表单验证后启用提交按钮并点击打开模态框?

解决jQuery表单验证与提交按钮启用、模态框触发问题

嗨,我来帮你搞定这个问题!你的需求很清晰:当两个下拉框都完成选择(表单验证通过)后启用提交按钮,点击提交时打开加载模态框。咱们先梳理下原代码里的几个小问题,再给出修正后的完整实现。

原代码的核心问题

  • 选择器错误:var toValidate = jQuery('#frm_acc', '#to_acc') 这个写法是在#to_acc元素内部查找#frm_acc,正确的多元素选择器应该用逗号分隔:jQuery('#frm_acc, #to_acc')。
  • 事件监听不匹配:下拉框的选择操作应该用change事件,而不是keyup(keyup是针对键盘输入的元素,比如输入框)。
  • 验证逻辑bug:原代码的遍历逻辑会覆盖valid变量,最后只有最后一个下拉框的状态会生效。正确的逻辑应该是默认设为true,只要有一个下拉框未选择,就把valid改为false。
  • jQuery重复引入冲突:你同时引入了完整版和 slim 版的jQuery,这会导致脚本冲突,只需要保留一个完整版即可。
  • 未阻止表单默认提交:点击提交按钮时,表单会默认提交并刷新页面,需要阻止这个行为才能正常显示模态框。

修正后的完整代码

HTML部分

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

<form class="form-horizontal" action="" method="post" id="contactForm">
  <div class="row">
    <!-- From Account name -->
    <div class="form-group col-6" style="margin-bottom: 0px;">
      <label class="col-sm-6 control-label p-sm-0 acc-merge" for="frm_acc">Text from:*</label>
      <select class="form-control select-data" name="frm_account" id="frm_acc" required>
        <option value="">Choose an items</option>
        <option value="1">Plumz</option>
        <option value="2">Plumz2</option>
        <option value="3">Plumz3</option>
        <option value="4">Plumz4</option>
        <option value="5">Plumz5</option>
      </select>
    </div>
    <!-- To account name -->
    <div class="form-group col-6" style="margin-bottom: 0px;">
      <label class="col-sm-6 control-label p-sm-0 acc-merge" for="to_acc">Text to:*</label>
      <select class="form-control select-data" name="to_account" id="to_acc" required>
        <option value="">Choose an items</option>
        <option value="1">Plumz</option>
        <option value="2">Plumz2</option>
        <option value="3">Plumz3</option>
        <option value="4">Plumz4</option>
        <option value="5">Plumz5</option>
      </select>
    </div>
  </div>
  <!-- Submit Button -->
  <div class="form-group ml-auto mt-2 mb-0">
    <div class="col-md-12 stockform_submit">
      <button type="submit" class="btn add-btn submit-btn" id="accMergebtn" disabled>Submit</button>
      <button type="reset" class="btn btn-default reset-btn stock_rst" style="left: 0%" id="reset-btn">Reset</button>
    </div>
  </div>
  <!-- modal -->
  <div class="modal fade" id="accloading" role="dialog" data-backdrop="static" aria-hidden="true">
    <div class="modal-dialog modal_load">
      <div class="modal-body">
        <img src="./img/loading.gif" alt="Please Wait" class="load_icon">
      </div>
    </div>
  </div>
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

JavaScript部分

$(document).ready(function() {
  // 初始化禁用提交按钮
  $("#accMergebtn").prop('disabled', true);
  const toValidate = $('#frm_acc, #to_acc');

  // 给下拉框绑定change事件
  toValidate.change(function() {
    let valid = true;
    // 遍历所有需要验证的下拉框
    toValidate.each(function() {
      if ($(this).val().trim() === '') {
        valid = false;
        return false; // 一旦发现无效,终止遍历提升效率
      }
    });
    // 根据验证结果启用/禁用按钮
    $("#accMergebtn").prop('disabled', !valid);
  });

  // 提交按钮点击事件
  $("#accMergebtn").click(function(e) {
    e.preventDefault(); // 阻止表单默认提交行为,避免页面刷新
    $('#accloading').modal('show'); // 打开加载模态框
    // 如果需要后续提交表单,可以在这里添加AJAX提交逻辑
  });
});

代码关键点说明

  1. 初始化状态:页面加载时直接禁用提交按钮,HTML里也给按钮加了disabled属性做双重保障。
  2. 验证逻辑优化:每次下拉框变化时,先默认valid为true,遍历过程中只要有一个下拉框未选择,就设为false并终止遍历,提升验证效率。
  3. 事件匹配:用change事件监听下拉框的选择变化,更符合下拉框的交互场景。
  4. 阻止默认提交:点击提交按钮时用e.preventDefault()阻止表单刷新,确保模态框能正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:23