如何用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提交逻辑 }); });
代码关键点说明
- 初始化状态:页面加载时直接禁用提交按钮,HTML里也给按钮加了
disabled属性做双重保障。 - 验证逻辑优化:每次下拉框变化时,先默认
valid为true,遍历过程中只要有一个下拉框未选择,就设为false并终止遍历,提升验证效率。 - 事件匹配:用
change事件监听下拉框的选择变化,更符合下拉框的交互场景。 - 阻止默认提交:点击提交按钮时用
e.preventDefault()阻止表单刷新,确保模态框能正常显示。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

