基于jQuery的轻量级JavaScript表单验证插件实现
本文介绍了一款基于jQuery开发的轻量级JavaScript表单验证插件。该插件通过HTML属性定义验证规则,支持整数、数字及正则表达式等多种校验类型。具备提交按钮触发与失焦验证两种模式,并能实时显示错误边框与提示信息,旨在简化前端表单校验逻辑并提升用户体验。
插件概述与设计理念
本文分享了一个自行编写的表单验证插件,其使用方式简便,且具备良好的扩展性,未来可进一步集成如AJAX异步验证等更多功能。
插件的设计依赖于HTML结构,每个待验证的表单元素下方需包含一个class为valid的span标签。若该span同时包含nullable类名,则代表该字段允许为空。通过rule属性指定具体的验证规则,msg属性定义错误提示文案,to属性指向目标元素的name值;若目标元素为单一控件,to属性可省略。插件运行时会遍历所有带有valid类的span标签,定位其前置的待验证元素,依据rule执行校验。若校验失败,元素边框将变为红色,且鼠标悬停时会展示对应的错误信息。
验证触发的时机主要包含两种场景:一是用户点击提交按钮时显式调用验证方法;二是当表单元素失去焦点(blur事件)时自动触发验证。
核心代码实现
以下是插件的核心代码实现部分。
相关的CSS样式定义如下。
.failvalid
{
border: solid 2px red !important;
}
JavaScript插件的具体逻辑代码如下。
/**
* 验证插件
*/
SimpoValidate = {
//验证规则
rules: {
int: /^[1-9]\d*$/,
number: /^[+-]?\d*\.?\d+$/
},
//初始化
init: function () {
$("span[class*='valid']").each(function () { //遍历span
var validSpan = $(this);
var to = validSpan.attr("to");
var target;
if (to) {
target = $("input[name='" + to + "'],select[name='" + to + "'],textarea[name='" + to + "']");
} else {
var target = validSpan.prev();
}
if (target) {
target.blur(function () {
SimpoValidate.validOne(target, validSpan);
});
}
});
},
//验证全部,验证成功返回true
valid: function () {
var bl = true;
$("span[class*='valid']").each(function () { //遍历span
var validSpan = $(this);
var to = validSpan.attr("to");
var target;
if (to) {
target = $("input[name='" + to + "'],select[name='" + to + "'],textarea[name='" + to + "']");
} else {
target = validSpan.prev();
}
if (target) {
if (!SimpoValidate.validOne(target, validSpan)) {
bl = false;
}
}
});
return bl;
},
//单个验证,验证成功返回true
validOne: function (target, validSpan) {
SimpoValidate.removehilight(target, msg);
var rule = SimpoValidate.getRule(validSpan);
var msg = validSpan.attr("msg");
var nullable = validSpan.attr("class").indexOf("nullable") == -1 ? false : true; //是否可为空
var to = validSpan.attr("to");
if (target) {
//checkbox或radio
if (target[0].tagName.toLowerCase() == "input" && target.attr("type") && (target.attr("type").toLowerCase() == "checkbox" || target.attr("type").toLowerCase() == "radio")) {
var checkedInput = $("input[name='" + to + "']:checked");
if (!nullable) {
if (checkedInput.length == 0) {
SimpoValidate.hilight(target, msg);
return false;
}
}
}
//input或select
if (target[0].tagName.toLowerCase() == "input" || target[0].tagName.toLowerCase() == "select") {
var val = target.val();
if (!nullable) {
if ($.trim(val) == "") {
SimpoValidate.hilight(target, msg);
return false;
}
}
else {
if ($.trim(val) == "") {
SimpoValidate.removehilight(target, msg);
return true;
}
}
if (rule) {
var reg = new RegExp(rule);
if (!reg.test(val)) {
SimpoValidate.hilight(target, msg);
return false;
}
}
}
else if (target[0].tagName.toLowerCase() == "textarea") {
var val = target.text();
if (!nullable) {
if ($.trim(val) == "") {
SimpoValidate.hilight(target, msg);
return false;
}
}
else {
if ($.trim(val) == "") {
SimpoValidate.removehilight(target, msg);
return true;
}
}
if (rule) {
var reg = new RegExp(rule);
if (!reg.test(val)) {
SimpoValidate.hilight(target, msg);
return false;
}
}
}
}
return true;
},
//获取验证规则
getRule: function (validSpan) {
var rule = validSpan.attr("rule");
switch ($.trim(rule)) {
case "int":
return this.rules.int;
case "number":
return this.rules.number;
default:
return rule;
break;
}
},
//红边框及错误提示
hilight: function (target, msg) {
target.addClass("failvalid");
target.bind("mouseover", function (e) {
SimpoValidate.tips(target, msg, e);
});
target.bind("mouseout", function () {
SimpoValidate.removetips();
});
},
//取消红边框及错误提示
removehilight: function (target) {
target.unbind("mouseover");
target.unbind("mouseout");
target.removeClass("failvalid");
SimpoValidate.removetips();
},
//显示提示
tips: function (target, text, e) {
var divtipsstyle = "position: absolute; left: 0; top: 0; background-color: #dceaf2; padding: 3px; border: solid 1px #6dbde4; visibility: hidden; line-height:20px; ";
$("body").append("<div class='div-tips' style='" + divtipsstyle + "'>" + text + "</div>");
var divtips = $(".div-tips");
divtips.css("visibility", "visible");
var top = e.clientY + $(window).scrollTop() - divtips.height() - 18;
var left = e.clientX;
divtips.css("top", top);
divtips.css("left", left);
$(target).mousemove(function (e) {
var top = e.clientY + $(window).scrollTop() - divtips.height() - 18;
var left = e.clientX;
divtips.css("top", top);
divtips.css("left", left);
});
},
//移除提示
removetips: function () {
$(".div-tips").remove();
}
};
$(function () {
SimpoValidate.init();
});
使用指南与示例
接下来介绍该插件的具体使用步骤。
第一步,引入必要的CSS和JS文件,其中必须确保已引用jQuery库。
<link type="text/css" href="~/Scripts/SimpoValidate.css" rel="stylesheet" />
<script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
<script type="text/javascript" src="~/Scripts/ValidateUtil.js"></script>
第二步,构建表单的HTML结构,部分示例代码如下。
<table class="table-test" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<tr>
<td>
<input name="c" value="" type="text" />
<span class="valid nullable" rule="int" msg="可为空,请填写正整数"></span>
</td>
</tr>
<tr>
<td>
<input name="d" value="" type="text" />
<span class="valid" rule="number" msg="必填,请填写数字"></span>
</td>
</tr>
<tr>
<td>
<select>
<option value="-1">==请选择==</option>
<option value="1">是</option>
<option value="2">否</option>
</select>
<span class="valid" rule="^(?!-1$).+$" msg="必选"></span>
</td>
</tr>
<tr>
<td>
<input name="a" value="1" type="checkbox" />
<span>多</span>
<input name="a" value="2" type="checkbox" />
<span>少</span>
<span class="valid" rule="" msg="必选" to="a"></span>
</td>
</tr>
<tr>
<td>
<input name="b" value="1" type="radio" />
<span>狗</span>
<input name="b" value="2" type="radio" />
<span>猫</span>
<span class="valid" rule="" msg="必选" to="b"></span>
</td>
</tr>
<tr>
<td>
<textarea cols="20" rows="5" style="height: 50px; width: 300px;"></textarea>
<span class="valid nullable" rule="^(.|\n){5,100}$" msg="可为空,长度必须大于等于5小于等于100"></span>
</td>
</tr>
</table>
第三步,编写执行验证的JS代码,例如在保存数据时调用验证逻辑。
//保存数据
function save() {
if (SimpoValidate.valid()) { //执行验证
$("#frm").submit(); //提交表单
}
}
插件运行后的界面效果如图所示。

上述内容即为作者自主开发的JavaScript表单验证插件的完整介绍,希望能为广大开发者提供实用的参考与帮助。
JavaScript怎么准确判断数据类型:typeof、instanceof与Object.prototype.toString
2026-11-05 17:09:21
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
