表单提交事件兼容问题:如何仅在确认提交后触发按钮加载效果?
解决表单提交时仅在确认提交后显示加载效果的问题
很理解你的困扰——这种情况确实常见,当表单自带confirm确认框时,用户取消后加载效果还挂在按钮上,体验很不好。下面给你几个简单直接的解决方案:
方案一:改进全局提交事件(推荐)
修改你现有的全局代码,先判断表单是否真的要提交(也就是onsubmit的返回值),再触发加载效果:
// add loading effect for forms $('form').not('.form-ajax').on('submit', function(e) { const $form = $(this); const nativeOnSubmit = this.onsubmit; let shouldSubmit = true; // 先执行表单原生的onsubmit逻辑(比如你的confirm对话框) if (nativeOnSubmit) { shouldSubmit = nativeOnSubmit.call(this, e); } // 如果用户取消提交,直接终止流程 if (!shouldSubmit) { e.preventDefault(); return; } // 确认提交后,再给按钮添加加载效果 btnLoad($form.find('button[type="submit"]')); });
这个方法的好处是不需要修改任何表单的HTML,全局统一处理所有情况,不管是原生onsubmit里的confirm,还是其他自定义的确认逻辑,都能完美兼容。
方案二:针对单个表单手动控制(适合特殊场景)
如果只是个别表单需要这种确认逻辑,也可以直接在表单的onsubmit里手动控制加载效果的触发:
<form method="post" action="/delete/post" onsubmit=" if (confirm('Do you want to delete this post ?')) { btnLoad($(this).find('button[type=\"submit\"]')); return true; } else { return false; } " > <input type="hidden" value="2" name="id" /> <button type="submit"> Delete post </button> </form>
同时记得把你原来的全局代码里的btnLoad调用去掉,避免重复触发加载效果。
补充说明
如果之后你用的是自定义模态框(不是原生confirm),逻辑也是类似的:先等待用户确认操作,在确认回调里触发btnLoad,然后手动调用form.submit()提交表单即可。
内容的提问来源于stack exchange,提问作者Vincent Decaux
相关产品推荐
相关产品推荐

