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

如何让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:用隐藏字段标记提交来源(最推荐)

这是最稳妥的方式,不管表单怎么提交,都能准确拿到标记:

  1. 在你的#answers表单里加一个隐藏输入框:
<form id="answers" method="post" ...>
  <!-- 其他表单元素 -->
  <input type="hidden" name="save_progress" id="save_progress_flag" value="0">
</form>
  1. 修改按钮代码,去掉name属性(避免默认提交干扰):
<button class="btn btn-primary btn-block btn-lg" onclick="save_progress(); return false;">Save Progress</button>
  1. 更新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,可以用更可靠的事件拦截方式,再手动添加提交标记:

  1. 修改按钮代码,传递事件对象:
<button class="btn btn-primary btn-block btn-lg" name="save_progress" onclick="save_progress(event);">Save Progress</button>
  1. 更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:26:21