用jQuery实现表单验证

article/2025/10/1 3:57:31

转载自:https://www.cnblogs.com/hellowzl/p/5612122.html
——选自《锋利的jQuery》(第2版)第5章的例题

5.1.5 表单验证

表单(form)作为 HTML 最重要的一个组成部分,几乎在每个网页上都有体现,例如用户提交信息、用户反馈信息和用户查询信息等,因此它是网站管理者与浏览者之间沟通的桥梁。在表单中,表单验证的作用也是非常重要的,它能使表单更加灵活、美观和丰富。

以一个简单的用户注册为例。首先新建一个表单, HTML 代码如下:

<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>jQueryStudy</title><style>.int{ height: 30px; text-align: left; width: 600px; }label{ width: 200px; margin-left: 20px; }.high{ color: red; }.msg{ font-size: 13px; }.onError{ color: red; }.onSuccess{ color: green; }</style><script src="http://code.jquery.com/jquery-latest.js"></script>    
</head>
<body><form method="post" action="#"><div class="int"><label for="name">姓名:</label><input type="text" id="name" class="required" /></div><div class="int"><label for="email">邮箱:</label><input type="text" id="email" class="required" /></div><div class="int"><label for="address">住址:</label><input type="text" id="address" /></div><div class="int"><input type="submit" value="提交" id="send" style="margin-left: 70px;" /><input type="reset" value="重置" id="res" /></div></form>    
</body>
</html>

显示效果如下图
在这里插入图片描述
在表单内 class 属性为 “required” 的文本框是必须填写的,因此需要将它与其他的非必须填写的表单元素加以区别,即在文本框后面追加一个红色的星号标识。可以使用 append() 方法来完成,代码如下:

//为表单的必填文本框添加提示信息(选择form中的所有后代input元素)$("form :input.required").each(function () {//通过jquery api:$("HTML字符串") 创建jquery对象var $required = $("<strong class='high'>*</strong>");//添加到this对象的父级对象下$(this).parent().append($required);});

显示效果如下图( 在必填元素后添加小红星标记)
在这里插入图片描述
用户在“姓名”文本框中填写完信息后,将光标的焦点从“姓名”文本框中移出时,需要即时判断姓名是否符合验证规则。当光标的焦点从“邮箱”文本框移出时,也需要即时判断“邮箱”填写是否正确,因此需要给表单元素添加失去焦点事件,即 blur 事件。 jQuery 代码如下:

//为表单的元素添加失去焦点事件$("form :input").blur(function () {// ...省略代码});

给表单里的必填元素添加验证功能的步骤如下:

 (1)判断当前失去焦点的元素是“姓名”还是“邮箱”,然后分别处理。    (2)如果是“姓名”,判断元素的值的长度是否小于 6 ,如果小于 6 ,则用红色字体提醒用户输入不正确,反之,则用绿色提醒用户输入正确。(3)如果是“邮箱”,判断元素的值是否符合邮箱的格式,如果不符合,则用红色字体提醒用户输入不正确,反之,则用绿色字体提醒用户输入正确。    (4)将提醒信息追加到当前元素的父元素下面。    

【注】:为了使用方便,当 text 文本框中的内容格式错误时,程序应尽量把所有提示信息都显示出来,而不是每次验证一种格式后只显示一个提示信息。 不过有时为了提高响应性,也会每次只显示一个提示信息。如:检查用户名是否重复,需要访问数据库。

如何提示,需要依据具体的业务需求来确定。

根据以上分析,可以写出如下 jQuery 代码:

//为表单的必填文本框添加提示信息(选择form中的所有后代input元素)$("form :input.required").each(function () {//通过jquery api:$("HTML字符串") 创建jquery对象var $required = $("<strong class='high'>*</strong>");//添加到this对象的父级对象下$(this).parent().append($required);});//为表单元素添加失去焦点事件$("form :input").blur(function(){var $parent = $(this).parent();//验证姓名if($(this).is("#name")){var nameVal = $.trim(this.value); //原生js去空格方式:this.replace(/(^\s*)|(\s*$)/g, "")var regName = /[~#^$@%&!*()<>:;'"{}【】  ]/;if(nameVal == "" || nameVal.length < 6 || regName.test(nameVal)){var errorMsg = " 姓名非空,长度6位以上,不包含特殊字符!";//class='msg onError' 中间的空格是层叠样式的格式$parent.append("<span class='msg onError'>" + errorMsg + "</span>");}else{var okMsg=" 输入正确";$parent.find(".high").remove();$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");}}//验证邮箱if($(this).is("#email")){var emailVal = $.trim(this.value);var regEmail = /.+@.+\.[a-zA-Z]{2,4}$/;if(emailVal== "" || (emailVal != "" && !regEmail.test(emailVal))){var errorMsg = " 请输入正确的E-Mail住址!";$parent.append("<span class='msg onError'>" + errorMsg + "</span>");}else{var okMsg=" 输入正确";$parent.find(".high").remove();$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");}}});

当连续几次输入错误的格式后,会出现如下图 所示的效果
在这里插入图片描述
由于每次在元素失去焦点后,都会创建一个新的提醒元素,然后将它追加到文档中,最后就出现了多次的提醒信息。因此,需要在创建提醒元素之前,将当前元素以前的提醒元素都删除。可以使用 remove() 方法来完成,代码如下:

//为表单元素添加失去焦点事件
$("form :input").blur(function(){ var $parent = $(this).parent();$parent.find(".msg").remove(); //删除以前的提醒元素(find():查找匹配元素集中元素的所有匹配元素)// ...省略代码
});

显示如下(正确的效果)
在这里插入图片描述
当鼠标在表单元素中多次失去焦点时,都可以提醒用户填写是否正确。但是,如果用户无视错误提醒,执意要单击“提交”按钮时,为了使表单填写准确,在表单提交之前,需要对表单的必须填写元素进行一次整体的验证。可以直接用 trigger() 方法来触发blur事件,从而达到验证效果。如果填写错误,就会以红色提醒用户;如果姓名和邮箱都不符合规则,那么就有两处错误,即有两个 class 为 “onError” 的元素,因此可以根据 class 为 “onError” 元素的长度来判断是否可以提交。如果长度为 0 ,即 true ,说明已经可以提交了;如果长度大于0,即 false ,说明有错误,需要阻止表单提交。阻止表单提交可以直接用 “return false” 语句。

根据上面的分析,可以在提交事件中写出如下jQuery代码:

//点击重置按钮时,通过trigger()来触发文本框的失去焦点事件
$("#send").click(function(){//trigger 事件执行完后,浏览器会为submit按钮获得焦点$("form .required:input").trigger("blur"); var numError = $("form .onError").length;if(numError){return false;}alert("注册成功!");
});

显示如下(验证通过)
在这里插入图片描述
用户也许会提出:为什么每次都要等字段元素失去焦点后,才提醒是否正确?如果输入时就可以提醒,这样就可以更加即时了。

为了达到用户提出的需求,需要给表单元素绑定 keyup 事件和 focus 事件,keyup 事件能在用户每次松开按键时触发,实现即时提醒;focus 事件能在元素得到焦点的时候触发,也可以实现即时提醒。

代码如下:

$("form :input").blur(function(){ //失去焦点处理函数//代码省略...
}).keyup(function(){//triggerHandler 防止事件执行完后,浏览器自动为标签获得焦点$(this).triggerHandler("blur"); 
}).focus(function(){$(this).triggerHandler("blur");
});

这样当用户将光标定位到文本框上和改变文本框的值时,表单就会即时提醒用户填写是否正确,从而符合了用户的需求。

在前面的章节已经提过,trigger(“blur”)不仅会触发为元素绑定的blur事件,也会触发浏览器默认的 blur 事件,即不能讲光标定位到文本框上。而 triggerHandler(“blur”)只会触发为元素绑定的 blur 事件,而不触发浏览器默认的 blur 事件。

至此,表单验证过程就全部完成。读者可以根据自己的实际需求修改验证规则。

【注】:客户端的验证仅用于提升用户的操作体验,而服务器仍需对用户输入的数据的合法性进行校验。对于禁用了脚本的用户和用户自制的网页提交操作,必须在服务器端验证。

完整代码:

<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>jQueryStudy</title><style>.int{ height: 30px; text-align: left; width: 600px; }label{ width: 200px; margin-left: 20px; }.high{ color: red; }.msg{ font-size: 13px; }.onError{ color: red; }.onSuccess{ color: green; }</style><script src="http://code.jquery.com/jquery-latest.js"></script>    
</head>
<body><form method="post" action="#"><div class="int"><label for="name">姓名:</label><input type="text" id="name" class="required" /></div><div class="int"><label for="email">邮箱:</label><input type="text" id="email" class="required" /></div><div class="int"><label for="address">住址:</label><input type="text" id="address" /></div><div class="int"><input type="submit" value="提交" id="send" style="margin-left: 70px;" /><input type="reset" value="重置" id="res" /></div></form><script>//为表单的必填文本框添加提示信息(选择form中的所有后代input元素)$("form :input.required").each(function () {//通过jquery api:$("HTML字符串") 创建jquery对象var $required = $("<strong class='high'>*</strong>");//添加到this对象的父级对象下$(this).parent().append($required);});//为表单元素添加失去焦点事件$("form :input").blur(function(){var $parent = $(this).parent();$parent.find(".msg").remove(); //删除以前的提醒元素(find():查找匹配元素集中元素的所有匹配元素)//验证姓名if($(this).is("#name")){var nameVal = $.trim(this.value); //原生js去空格方式:this.replace(/(^\s*)|(\s*$)/g, "")var regName = /[~#^$@%&!*()<>:;'"{}【】  ]/;if(nameVal == "" || nameVal.length < 6 || regName.test(nameVal)){var errorMsg = " 姓名非空,长度6位以上,不包含特殊字符!";//class='msg onError' 中间的空格是层叠样式的格式$parent.append("<span class='msg onError'>" + errorMsg + "</span>");}else{var okMsg=" 输入正确";$parent.find(".high").remove();$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");}}//验证邮箱if($(this).is("#email")){var emailVal = $.trim(this.value);var regEmail = /.+@.+\.[a-zA-Z]{2,4}$/;if(emailVal== "" || (emailVal != "" && !regEmail.test(emailVal))){var errorMsg = " 请输入正确的E-Mail住址!";$parent.append("<span class='msg onError'>" + errorMsg + "</span>");}else{var okMsg=" 输入正确";$parent.find(".high").remove();$parent.append("<span class='msg onSuccess'>" + okMsg + "</span>");}}}).keyup(function(){//triggerHandler 防止事件执行完后,浏览器自动为标签获得焦点$(this).triggerHandler("blur"); }).focus(function(){$(this).triggerHandler("blur");});//点击重置按钮时,通过trigger()来触发文本框的失去焦点事件$("#send").click(function(){//trigger 事件执行完后,浏览器会为submit按钮获得焦点$("form .required:input").trigger("blur"); var numError = $("form .onError").length;if(numError){return false;}alert("注册成功!");});</script>
</body>
</html>

更多资源:

jQuery 官方 API 地址: http://api.jquery.com/

在线引用 jQuery:http://code.jquery.com/


http://chatgpt.dhexx.cn/article/BDdQPsId.shtml

相关文章

jQuery-表单验证使用方法

目录 一、表单验证单词二、思维导图三、表单验证的使用方法四、复选框全选和取消全选 一、表单验证单词 二、思维导图 三、表单验证的使用方法 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title><…

jQuery-表单校验

为什么要表单验证 1.减轻服务器的压力 2.保证输入的数据符合要求 常用的表单验证 日期格式表单元素是否为空用户名和密码E-mail地址身份证号码 表单选择器 语法 描述 示例 :input 匹配所有input、textarea、select和button 元素 $("#myform :input")选取…

jQuery实现表单验证

1.基于html表单&#xff0c;利用jQuery实现表单验证功能。 2.html基本结构和样式&#xff1a; 3.html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <h…

JQuery-表单验证

1.什么是表单验证&#xff1f; 表单验证是javascript中的高级选项之一。 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。 2.为什么表单验证&#xff1f; 减轻服务器的压力 。 保证输入的数据符合要求。 3.案例 实现表单验证的案例在这里用GiWiFI页面…

SurfaceTexture

SurfaceTexture 类是在 Android 3.0 中引入的。就像 SurfaceView 是 Surface 和 View 的结合一样&#xff0c;SurfaceTexture 是 Surface 和 GLES texture 的粗糙结合&#xff08;有几个警告&#xff09;。 当你创建了一个 SurfaceTexture&#xff0c;你就创建了你的应用作为消…

UserWarning: findfont: Font family [‘sans-serif‘] not found. Falling back to DejaVu Sans

Python数据可视化分析时出现UserWarning: findfont: Font family [‘sans-serif’] not found. Falling back to DejaVu Sans…报错 原因&#xff1a;库中没有关于’Microsoft YaHei’的引用 换一种字体记一下 如 字体中文名称字体英文名称黑体SimHei宋体SimSun新宋体NSimSum…

The tag <fonta> is unrecognized in this browser. If you meant to render a React component, start its

写react 组件样式 styled-components 报错 是因为react 千万记住开头字母是大写 由于这个f小写了 但是这个是当成了一个组件在用 所以会一直报错 改为大写就会解决了 小伙伴们千万注意 react的项目组建开头必须大写

createfont(CreateFontIndirectW)

如何用CreateFont创建制定点大小的字符 import java.awt.Font; import java.io.File; import java.io.FileInputStream; public class Loadfont public static Font loadFont(String fontFileName, float fontSize) //第一个参数是外部字体名&#xff0c;第二个是字体大小 File…

MindFusion.WinForms Pack 2022.R2

MindFusion.WinForms Pack 2022.R2 每个节点多个标签-允许为单个流程图节点显示多个标题。您可以自定义节点标签&#xff0c;包括显示和定位。 混杂的 bhMoveLabels行为现在允许用户交互移动链接和节点标签。 水平偏移和垂直偏移现在适用于使用SetLinkLengthPosition方法定位的…

findfont: Font family [‘Times New Roman‘] not found. Falling back to DejaVu Sans.字体安装

问题描述 使用python对数据进行可视化的时候&#xff0c;matplotlib绘图的时候&#xff0c;提示警告如题所示&#xff1a; UserWarning: findfont: Font family [Times New Roman] not found. Falling back to DejaVu Sans. 环境说明&#xff1a;使用的是 CentOS系统&#xf…

Could not load file or assembly ‘office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce11

Could not load file or assembly office, Version12.0.0.0, Cultureneutral, PublicKeyToken71e9bce11 window10 Could not load file or assembly office, Version12.0.0.0, Cultureneutral, PublicKeyToken71e9bce11 新的改变 我们对Markdown编辑器进行了一些功能拓展与语…

jasperreports6.12.2 could not load the following font解决方法

jasperreports通过Java代码生成PDF的时候不能获取中文字体&#xff0c;报错提示如下&#xff1a; net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font: pdfFontName: STSong-Light pdfEncoding: Identity-H isPdfEmbedded : true本次环境&…

快速小巧的粘贴应用程序Hasty Paste

什么是 Hasty Paste? Hasty Paste 是一个快速粘贴文本并共享的地方&#xff0c;主要用于共享调试日志等&#xff0c;以帮助开发人员提供技术支持。该项目的目标是既快又小。 命令行安装 在群晖上以 Docker 方式安装。 官方的镜像没有发布在 docker hub&#xff0c;而是在 gh…

SpringBoot--解决BigDecimal传到前端后精度丢失的问题

原文网址&#xff1a;SpringBoot--解决BigDecimal传到前端后精度丢失的问题_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍SpringBoot如何解决BigDecimal传到前端后精度丢失问题。 解决方案是&#xff1a;转成字符串格式返回。 问题描述 实例 Controller package com.…

BigDecimal 简单使用

目录 为什么使用BigDecimal 解决方案 构造方法 类型转换 double 转 BigDecimal BigDecimal 转 String BigDecimal 转 double/int/long等 加减乘除取余 divide 舍入模式 比较大小 格式化(DecimalFormat) 小结 为什么使用BigDecimal 1.float和double类型的主要设计目…

BigDecimal用法

文章目录 1、创建一个BigDecimal对象1.1、常用构造函数1.1、常用计算方法 2、BigDecimal很方便的几个用法2.1、用BigDecimal去除小数点后多余的0&#xff1a;stripTrailingZeros()2.2、BigDecimal的原值和科学计数值2.3、用BigDecimal比较大小&#xff1a;compareTo()2.4、BigD…

mysql bigdecimal查询_mysql bigdecimal

java学习:Java中的其它类 568x573 - 55KB - JPEG Java中BigDecimal类你了解多少?! 720x480 - 30KB - JPEG TypeHandlers 640x396 - 25KB - JPEG BigDecimal equals方法可能不相等 678x260 - 9KB - JPEG

BigDecimal 详解

一&#xff0c;BigDecimal的简介 Java在java.math包中提供的API类BigDecimal&#xff0c;用来对超过16位有效位的数进行精确的运算。 双精度浮点型变量double可以处理16位有效数。在实际应用中&#xff0c;需要对更大或者更小的数进行运算和处理。float和double只能用来做科学…

BigDecimal加减乘除计算

BigDecimal的运算——加减乘除 首先是bigdecimal的初始化 这里对比了两种形式&#xff0c;第一种直接value写数字的值&#xff0c;第二种用string来表示 我们对其进行加减乘除绝对值的运算,其实就是Bigdecimal的类的一些调用 BigDecimal num1 new BigDecimal(0.005);BigDecim…

java 中 BigDecimal 详解

首先&#xff0c;学习一个东西&#xff0c;我们都必须要带着问题去学&#xff0c;这边我分为 【为什么&#xff1f;】【是什么&#xff1f;】【怎么用&#xff1f;】 【为什么要用BigDecimal&#xff1f;】 首先&#xff0c;我们先看一下&#xff0c;下面这个现象 那为什么会…