如何让PHP识别提交表单的按钮(PHP与JavaScript实现)
解决表单提交按钮与JS延迟逻辑冲突的问题
我明白你遇到的两难处境:加按钮name属性就跳过延迟直接提交,不加又拿不到POST标记。咱们先拆解下问题根源,再给你几个靠谱的解决方案。
问题到底出在哪?
你的按钮默认是type="submit"(HTML里表单内的button如果不指定type,默认就是提交类型)。虽然你加了return false,但浏览器对带name属性的submit按钮的默认提交行为拦截有时候不太稳定,导致直接绕过了你的setTimeout逻辑。另外还有个容易被忽略的点:如果通过JS的form.submit()方法提交表单,不会自动携带任何提交按钮的name/value——只有用户手动点击submit按钮触发的提交,才会把对应按钮的数据传到后台。这也是你即使保留name,用JS提交后PHP拿不到值的原因。
解决方案来了
方案1:用隐藏字段标记提交来源(最推荐)
这是最稳妥的方式,不管表单怎么提交,都能准确拿到标记:
- 在你的
#answers表单里加一个隐藏输入框:
<form id="answers" method="post" ...> <!-- 其他表单元素 --> <input type="hidden" name="save_progress" id="save_progress_flag" value="0"> </form>
- 修改按钮代码,去掉name属性(避免默认提交干扰):
<button class="btn btn-primary btn-block btn-lg" onclick="save_progress(); return false;">Save Progress</button>
- 更新JS函数,提交前给隐藏字段赋值:
function save_progress(){ $('#save_progress_submit_container').modal('show'); // 标记是点击了「保存进度」按钮提交的 document.getElementById('save_progress_flag').value = "1"; setTimeout(function() { submit_quiz(); }, 1000); } function submit_quiz(){ $("#answers").submit(); }
之后PHP里通过$_POST['save_progress']就能判断:值为1就是点击了保存按钮,0则是其他按钮触发的提交。
方案2:彻底阻止按钮默认行为,手动传递标记
如果你想保留按钮的name,可以用更可靠的事件拦截方式,再手动添加提交标记:
- 修改按钮代码,传递事件对象:
<button class="btn btn-primary btn-block btn-lg" name="save_progress" onclick="save_progress(event);">Save Progress</button>
- 更新JS函数,彻底阻止默认提交,提交时临时添加字段:
function save_progress(e){ // 彻底阻止按钮的默认提交行为 e.preventDefault(); e.stopPropagation(); $('#save_progress_submit_container').modal('show'); setTimeout(function() { submit_quiz('save_progress'); }, 1000); } function submit_quiz(trigger){ const form = $("#answers")[0]; // 如果有触发标记,临时添加隐藏字段 if(trigger){ const input = document.createElement('input'); input.type = 'hidden'; input.name = trigger; input.value = '1'; form.appendChild(input); } form.submit(); }
方案3:把按钮改成非提交类型(最简单)
直接把按钮设为type="button",这样它完全不会触发表单默认提交,再结合方案1的隐藏字段即可:
<button type="button" class="btn btn-primary btn-block btn-lg" onclick="save_progress();">Save Progress</button>
JS逻辑和方案1完全一致,省心又不容易出问题。
内容的提问来源于stack exchange,提问作者gtilflm
相关产品推荐
相关产品推荐

