知其然知其所以然

在前端项目开发中,偶尔会有表单提交的问题:

用户输入表单后,不小心按了回车键,导致提前触发了提交事件?

问题概述

当表单中仅有一个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

从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输入框回车键自动触发提交事件!的更多相关文章

  1. angular4 form 表单中 input输入框的disabled属性

    直接加[disabled]="isDisabled"属性的话,出现报错 根据提示,做如下修改 private isEdit: boolean = true; private isD ...

  2. angular2+ form 表单中 input输入框的disabled属性设置无效

    最近项目中遇到一个表单input设置disabled问题,直接赋值angular原生的[disabled]=“isDisabled”无效,浏览器警告信息: 无奈,只能按照控制台提示修改: 问题解决

  3. Dynamics CRM Form表单中通过javascript抓取触发change事件字段的属性名

    通过下面这段代码可以抓取到change的事件源,从而判断出是哪个属性字段触发的事件, function change(pContext) {var fieldName=pContext.getEven ...

  4. form表单中get和post两种提交方式的区别

    一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...

  5. 清除表单input输入框内数据

    清除表单input输入框内数据 1. $(':input','#addVoucherType') //'#addVoucherType'表单id .not(':button') .val('') .r ...

  6. 【小瑕疵】表单中的button会自动提交?

    在表单中使用button标签的时候会发现,即使什么类型都没有设置,但是在点击的时候会发现,表单会自动提交 比如: 我在一个表单的button中添加一个函数,当点击这个按钮时会增加一行内容: 但是当我实 ...

  7. 2022年form表单中input控件最详细总结

    语法 <input type="" name="" id="" value="" placeholder=&quo ...

  8. 如何disabled禁用所有表单input输入框元素

    转载地址:https://www.zhangxinxu.com/wordpress/?p=8568 一.pointer-events:none和覆盖层方法的问题 经常会遇到需求,需要禁用div中或者f ...

  9. 表单中input name属性有无[]的区别

    1 input数组 如下一个表单: <input type="text" name="username[]" value="Jason" ...

  10. 前端表单中有按钮button自动提交表单

    问题描述 在设计表单时,表单内有一个按钮<button>,该按钮是用来获取其他数据或执行其他操作的.并不是让他提交表单. 解决方案 1) 设置 form 的 onsubmit='retur ...

随机推荐

  1. ZEGO 即构科技首发适配鸿蒙系统的 Express SDK 1.0 版本

    ​ 2019年8月,华为在开发者大会上正式发布鸿蒙系统. HarmonyOS 鸿蒙系统是一款"面向未来".面向全场景(移动办公.运动健康.社交通信.媒体娱乐等)的分布式操作系统.在 ...

  2. qumu虚拟机启动后无法远程连接

    通过 virsh 在启动 qemu 虚拟机,可以通过 VNC 访问虚拟机,但无法通过设置的 SSH 的外部映射端口登录.首先在宿主机上查看虚拟机(csv\tpm\name)的网络配置,可以看到端口映射 ...

  3. ASP.NET Core – MVC

    前言 在 ASP.NET Core – MVC vs Razor Page 里有提到 MVC. 它算是 WebAPI 的抽象. 但是通常 MVC 指的是比较传统的 Website, WebAPI 则是 ...

  4. @RestController和@Controller的区别

    @RestController 和 @Controller 是Spring框架中用于定义控制器(Controller)的两个非常重要的注解,它们都用于处理HTTP请求,但它们之间存在一些关键的区别. ...

  5. 暑假集训CSP提高模拟18

    \[暑假集训CSP提高模拟 \ 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 \] Very good problem, this make my news rotate. ...

  6. [CL-FOOL] CLOI 愚人赛的部分官方题解与小杂谈

    小细节 谁会拿 Rank 奖励? 头图里有写哦. 发现没有,这里的问号是蓝色的,点进去可以进到彩蛋界面. 当然彩蛋界面也什么都没有,提交界面藏在下面的源码里. 那么交什么呢. CLOI 的文件里有一团 ...

  7. 原生CSS、HTML 和 JavaScript 实现酷炫表单

    一直使用 Vue/React ,习惯了用组件,偶尔想用原生三剑客写点 Demo 发现样式丑的不忍直视.最近看 掘金小册<玩转CSS的艺术之美>看到 CSS 相关的内容,发现原生 CSS 也 ...

  8. 强大的USB协议分析工具

    2020年最后一天了,感谢大家一年来对我文章的支持,有你们的支持就是我强大的动力. 今天来给大家介绍一个USB 协议分析软件LeCroy USB Advisor,软件安装包下载连接如下: 链接:htt ...

  9. 2022年3月中国数据库排行榜:TiDB “三连降”仍霸榜首,“常胜四将军”得分集体下跌

    春暖花开好时光,三月一号迎榜来.2022年3月的 中国数据库流行度排行榜 已在墨天轮社区发布,本月共有 199个 数据库参与排名,相比上月新增四个数据库.排名前十的数据库得分均有所波动,整体排名变动略 ...

  10. [第一章 web入门]SQL注入-1

    启动靶机 很明显注入点为id值,单引号闭合影响语句,说明为单引号闭合 构造注入语句 ?id=1 ' and 1 =1 --+ 发现没报错,说明没有其他过滤 ,开始sql注入 ?id=1 ' order ...