是触发表单提交的正确写法,其默认type为"button";需显式声明type="submit"才能触发验证、submit事件及formdata收集,避免onclick调form.submit()或touchstart阻断。

button type="submit" 是默认行为,但必须明确声明
很多开发者以为 <button></button> 放在 <form></form> 里就会自动提交,其实不然——<button></button> 的默认 type 值是 "button"(即普通按钮,无任何表单行为),不是 "submit"。不显式写 type="submit",点击它根本不会触发表单提交。
- ✅ 正确写法:
<button type="submit">提交</button> - ❌ 错误写法:
<button>提交</button>(等价于type="button") - ⚠️ 注意:即使有
name或value属性,也不改变默认类型
避免用 onclick 调 form.submit() 替代原生 submit
有人习惯写 <button onclick="document.getElementById('myform').submit()"></button>,这看似可行,但会绕过浏览器原生的表单验证(如 required、pattern)、submit 事件监听,也丢失了 submit 时自动收集的 FormData 行为。
- ✅ 推荐:用
<button type="submit"></button>触发原生流程,再通过form.addEventListener('submit', handler)拦截处理 - ❌ 不推荐:手动调
form.submit()—— 它不触发submit事件,也无法被event.preventDefault()阻止 - ? 小技巧:想禁用提交时,应在
submit事件里preventDefault(),而不是提前 disable button
button 的 name 和 value 会作为表单数据发送
和 <input type="submit"> 一样,<button type="submit"></button> 的 name 和 value 会在提交时作为键值对加入请求体(尤其是 application/x-www-form-urlencoded 或 FormData)。
- ✅ 示例:
<button type="submit" name="action" value="save">保存</button>→ 提交后服务端收到action=save - ⚠️ 注意:若多个 submit button 共存,只有被点击的那个的
name=value会被发送;未点击的不会出现在数据中 - ? 别用空字符串或纯空格做
value,某些旧浏览器可能忽略或报错
移动端点击无响应?检查是否被 touchstart 阻断
在 iOS Safari 或部分安卓 WebView 中,如果给 <button type="submit"></button> 绑定了 touchstart 并调用了 preventDefault(),会导致 click 事件不触发,从而表单无法提交。
- ✅ 安全做法:优先监听
click或submit,避免在touchstart里无条件preventDefault() - ⚠️ 兼容提示:iOS 15.4+ 对
touchstart+preventDefault()更严格,容易意外阻断表单交互 - ? 调试方法:点击后检查 Network 面板是否有请求发出;没发出就大概率是事件被拦截了
type="submit" 这个显式声明,以及误用 form.submit() 破坏验证链路——这两点几乎覆盖了 80% 的“button 不提交”问题。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











