【3分钟学会】一招禁用表单中input输入框回车键自动触发提交事件!
知其然知其所以然
在前端项目开发中,偶尔会有表单提交的问题:
用户输入表单后,不小心按了回车键,导致提前触发了提交事件?
问题概述
当表单中仅有一个input输入框时,按下回车键就会自动触发提交事件,这是为什么呢?
这里就要提到一个标准:W3C

文中最后一句话已经解释了原因:
当表单中只有一个单行文本输入字段时,用户代理应接受在该字段中按Enter键作为提交表单的请求。
既然知道了这种现象不是bug,而是切实的标准后,那我们如何在项目中避免呢,毕竟不是每个项目都希望用户回车的时候突然就触发了提交事件的。
为了提升用户体验,我将提供几个实用方案!
实用方案
1、原生表单
代码复现
<form>
<input type="text" id="myInput">
<button onclick="submitForm()">Submit</button>
</form>
上述代码省略了部分提交事件方法,重点突出表单。
解决方案
方案1
在 input 中添加 onkeydown="if(event.keyCode==13){return false;}" 。
通过监听 input 输入框的键盘事件来控制表单进程,keyCode的值为13即按下了回车键,返回false,即为取消提交事件。
<form>
<input type="text" id="myInput" onkeydown="if(event.keyCode==13){return false;}">
<button onclick="submitForm()">Submit</button>
</form>
方案2
在 form 标签中添加 onsubmit="return false;"。
通过主动对form表单添加提交属性,来控制提交事件,return false即为取消提交。
<form onsubmit="return false;">
<input type="text" id="myInput">
<button type="button" onclick="submitForm()">Submit</button>
</form>
注:有的人可能会困惑,为什么自己的添加了一样的代码,没有生效的问题,这里需要注意一点,就是 button 按钮的默认事件。
从MDN查询到,button 在不添加 type 属性时,默认值是 submit。
所以,如果你按照此方案不生效,请检查下 button 是否有 type 属性,或已经写了 submit ,input 回车仍然会自动提交,请将 button 的 type 属性改为其他值。
方案3
如果你想保证 dom 元素上的整洁清爽,也可以通过 js 的方式。
使用JavaScript阻止默认行为。
你可以给 input 元素添加一个 keypress 或 keydown 事件监听器,并在用户按下回车键时阻止默认行为。
document.getElementById('myInput').addEventListener('keypress', function (event) {
if (event.key === 'Enter') {
event.preventDefault();
}
});
2、Vue + ElementPlus
代码复现
<template>
<el-form>
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
</el-form-item>
</el-form>
</template>
<script setup lang="ts">
import { reactive } from 'vue'
interface IForm {
name: string
}
const form = reactive<IForm>({
name: '',
})
const submitForm = async () => {
if (form.name.trim() === '') {
alert('姓名不能为空')
return
}
alert('提交成功:' + form.name)
}
</script>
这里用的是 Vue3,vue2+elementUI 也是一样的效果。方案等同。
解决方案
ElementPlus 文档中已经很贴心了做了提示:ElementPlus-Form

就按照官方给出的方案照做就是:
<el-form @submit.prevent>
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
</el-form-item>
</el-form>
当然,也可以写成 @submit.native 效果是一样的。
3、React + Ant Design
代码复现
import { Form, Input, Button } from 'antd'
interface FormValues {
username: string
}
const App = () => {
const onFinish = (values: FormValues) => {
console.log('Form values:', values)
}
return (
<Form onFinish={onFinish}>
<Form.Item label="Username" name="username">
<Input />
</Form.Item>
<Form.Item label={null}>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
)
}
export default App
解决方案
通过对 input 添加 onKeyDown 监听键盘按键来阻止回车提交事件。
import React from 'react'
import { Form, Input, Button } from 'antd'
interface FormValues {
username: string
}
const App = () => {
const onFinish = (values: FormValues) => {
console.log('Form values:', values)
}
// 监听 onKeyDown 事件,阻止回车键的默认行为
const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === 'Enter') {
e.preventDefault()
}
}
return (
<Form onFinish={onFinish}>
<Form.Item label="Username" name="username">
{/* onKeyDown 事件绑定到 Input 组件 */}
<Input onKeyDown={handleKeyDown} />
</Form.Item>
<Form.Item label={null}>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
)
}
export default App
上述方案,总结完毕!
如果小伙伴有其他更好用的方案,可以留言分享~
【3分钟学会】一招禁用表单中input输入框回车键自动触发提交事件!的更多相关文章
- angular4 form 表单中 input输入框的disabled属性
直接加[disabled]="isDisabled"属性的话,出现报错 根据提示,做如下修改 private isEdit: boolean = true; private isD ...
- angular2+ form 表单中 input输入框的disabled属性设置无效
最近项目中遇到一个表单input设置disabled问题,直接赋值angular原生的[disabled]=“isDisabled”无效,浏览器警告信息: 无奈,只能按照控制台提示修改: 问题解决
- Dynamics CRM Form表单中通过javascript抓取触发change事件字段的属性名
通过下面这段代码可以抓取到change的事件源,从而判断出是哪个属性字段触发的事件, function change(pContext) {var fieldName=pContext.getEven ...
- form表单中get和post两种提交方式的区别
一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...
- 清除表单input输入框内数据
清除表单input输入框内数据 1. $(':input','#addVoucherType') //'#addVoucherType'表单id .not(':button') .val('') .r ...
- 【小瑕疵】表单中的button会自动提交?
在表单中使用button标签的时候会发现,即使什么类型都没有设置,但是在点击的时候会发现,表单会自动提交 比如: 我在一个表单的button中添加一个函数,当点击这个按钮时会增加一行内容: 但是当我实 ...
- 2022年form表单中input控件最详细总结
语法 <input type="" name="" id="" value="" placeholder=&quo ...
- 如何disabled禁用所有表单input输入框元素
转载地址:https://www.zhangxinxu.com/wordpress/?p=8568 一.pointer-events:none和覆盖层方法的问题 经常会遇到需求,需要禁用div中或者f ...
- 表单中input name属性有无[]的区别
1 input数组 如下一个表单: <input type="text" name="username[]" value="Jason" ...
- 前端表单中有按钮button自动提交表单
问题描述 在设计表单时,表单内有一个按钮<button>,该按钮是用来获取其他数据或执行其他操作的.并不是让他提交表单. 解决方案 1) 设置 form 的 onsubmit='retur ...
随机推荐
- vue-i18n 8.28.2(完成)
https://kazupon.github.io/vue-i18n/zh/introduction.html 开始 如果使用模块系统 (例如通过 vue-cli),则需要导入 Vue 和 VueI1 ...
- Jmeter、postman、python 三大主流技术如何操作数据库?
1.前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性:例如商品搜索功能 自动化测试或性能测试中,某 ...
- Nuxt Kit API :路径解析工具
title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nux ...
- ptmalloc、tcmalloc与jemalloc对比分析
背景介绍 在开发微信看一看期间,为了进行耗时优化,基础库这层按照惯例使用tcmalloc替代glibc标配的ptmalloc做优化,CPU消耗和耗时确实有所降低.但在晚上高峰时期,在CPU刚刚超过50 ...
- 利用3D标签,生成RLE标签编码,并保存到csv文件
# coding:utf-8from glob import globimport osimport SimpleITK as sitkfrom pathlib import Pathimport n ...
- python处理nii文件
第一步安装nibabel,可以使用命令:pip install nibabel 之后: from nibabel.viewers import OrthoSlicer3D as osdimport n ...
- 02-react中jsx的基本使用
// 使用 createElement太繁琐 不直观 不优雅开发体验不好 代码维护不行 // jsx 不是 js 而是 js的扩展语法 // jsx 是react的核心内容 // react项目中已经 ...
- 云原生周刊:K8s 中的服务和网络 | 2024.4.29
开源项目推荐 k8s-image-swapper k8s-image-swapper 是 Kubernetes 的一个变更 Webhook,它将镜像下载到自己的镜像仓库,并将镜像指向该新位置.它是 d ...
- SpringBoot读取properties文件配置项
使用SpringBoot开发过程中,难免需要配置相关数据项,然后在Java代码中@Autowired注入并使用. 我们应该如何读取properties文件中的配置项呢? 基于SpringBoot项目, ...
- Webstorm 2024 安装使用 (附加永久激活码、补丁)
下载安装 第二步,安装完成之后,下载补丁 下载地址(里面包含激活码) 完成,之后输入激活码 免责声明:本文中的资源均来自互联网,仅供个人学习和交流使用,严禁用于商业行为,下载后请在24小时内从电脑中彻 ...
