type="button"不触发表单提交,type="submit"会自动提交所属form;submit按钮默认行为会干扰JS验证,需preventDefault()或onsubmit返回false拦截;enter键仅触发首个submit按钮;button比input更灵活且支持HTML内容;未声明type的button默认为submit,存在风险。
type="button" 不触发表单提交,type="submit" 会自动提交所属 <form> ——这是最根本的区别,不是“能不能”,而是“默认会不会”。
如果你在 <form> 里放了 <button type="submit"> 或 <input type="submit">,又同时绑了 onclick 做表单校验,不加干预就会出现:校验通过后提交一次,校验失败也照样提交一次(因为默认行为没被阻止)。
event.preventDefault() 才能拦住它onsubmit 事件处理器里返回 false(注意:只对 form 元素有效)type="button",把提交逻辑完全交给 JS 控制用户在文本框中按回车时,浏览器会自动点击当前 <form> 内第一个 type="submit" 按钮。这个行为和你有没有写 onclick 无关,也和按钮是否可见无关。
type="button" 完全不会响应 enter 键type="button"
type="submit" 按钮共存时,enter 键只触发第一个,无法指定<button type="submit"> 是现代推荐写法,<input type="submit"> 已逐渐被替代。
<button> 支持内嵌 HTML(比如图标、<span>、加载状态文案),<input> 只能靠 value 显示纯文本<button> 的样式控制更直接(伪元素、子元素、宽高继承等)<button> 的 type 默认是 "button" 而非 "submit",需显式声明当按钮功能与“提交整张表单”无关时,就该用 type="button" ——哪怕它最终也调用了 form.submit()。
fetch() 发送局部数据,不刷新页面容易被忽略的一点:type 属性不写,默认就是 "submit"(仅限 <button> 标签),所以不声明 type 的 <button> 在表单里是危险的。