自己编写了一个表单验证插件,支持ajax验证,使用起来很简单。
每个需要验证的表单元素下面有一个span标签,这个标签的class有一个valid表示需要验证,如果有nullable则表示可为空;rule表示验证规则,msg表示错误提示信息;to表示要验证的元素的name值,如果元素是单个的,to可以不写。该插件会遍历每个有valid的span标签,找出它前面需要验证的元素,根据rule验证,如果验证不通过,则显示边框为红色,鼠标放在元素上时显示错误信息。
验证时机:1、点击提交按钮时显式调用验证方法;2、当元素触发blur时验证。
插件代码:
CSS:
.failvalid
{
border: solid 2px red !important;
}
JS:
/**
* suxiang
* 2014年12月22日
* 验证插件
*/
SimpoValidate = {
//验证规则
rules: {
int: /^[1-9]\\d*$/,
number: /^[+-]?\\d*\\.?\\d+$/
},
//初始化
init: function () {
$(\".valid\").each(function () { //遍历span
if ($(this)[0].tagName.toLowerCase() == \"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 () {
SimpoValidate.ajaxCheckResult = true;
var bl = true;
$(\".valid\").each(function () { //遍历span
if ($(this)[0].tagName.toLowerCase() == \"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 && SimpoValidate.ajaxCheckResult;
},
//单个验证,验证成功返回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\");
var ajaxAction = validSpan.attr(\"ajaxAction\");
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;
}
}
if (ajaxAction) {
SimpoValidate.ajaxCheck(target, val, ajaxAction);
}
}
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;
}
}
if (ajaxAction) {
SimpoValidate.ajaxCheck(target, val, ajaxAction);
}
}
}
return true;
},
ajaxCheckResult: true,
ajaxCheck: function (target, value, ajaxAction) {
var targetName = target.attr(\"name\");
var data = new Object();
data[targetName] = value;
$.ajax({
url: ajaxAction,
type: \"POST\",
data: data,
async: false,
success: function (data) {
if (data.data == true) {
SimpoValidate.removehilight(target);
}
else {
SimpoValidate.ajaxCheckResult = false;
SimpoValidate.hilight(target, data.data);
}
}
});
},
//获取验证规则
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; z-index:99999; left: 0; top: 0; background-color: #dceaf2; padding: 3px; border: solid 1px #6dbde4; visibility: hidden; line-height:20px; font-size:12px;\";
$(\"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();
});
如何使用:
Edit页面:
@using Model.Suya;
@{
ViewBag.Title = \"Add\";
Layout = \"~/Views/Shared/_Layout.cshtml\";
}
@{
List<sys_post> postList = (List<sys_post>)ViewData[\"postList\"];
sys_post post = (sys_post)ViewData[\"post\"];
}
<script type=\"text/javascript\">
$(function () {
//部门树
$(\'#dept\').combotree({
url: \'GetDeptTree\',
required: false,
checkbox: true,
onLoadSuccess: function () {
$(\'#dept\').combotree(\'setValue\', \"@(post.depCode)\");
}
});
//操作结果
$(\"#ifrm\").load(function (data) {
var data = eval(\"(\" + $(\"#ifrm\").contents().find(\"body\").html() + \")\");
alert(data.msg);
if (data.ok) back();
});
$(\"select[name=\'postLevel\']\").find(\"option[value=\'@(post.postLevel)\']\").attr(\"selected\", \"selected\");
});
//保存
function save() {
if (valid()) {
$(\"#frm\").submit();
}
}
//验证
function valid() {
var dept = $(\"input[name=\'dept\']\");
if (!dept.val()) {
SimpoValidate.hilight(dept.parent(), \"请选择所属部门\");
} else {
SimpoValidate.removehilight(dept.parent());
}
return SimpoValidate.valid();
}
//返回
function back() {
parent.$(\'#ttTab\').tabs(\'select\', \"岗位管理\");
var tab = parent.$(\'#ttTab\').tabs(\'getSelected\');
tab.find(\"iframe\").contents().find(\"#btnSearch\").click();
parent.$(\"#ttTab\").tabs(\'close\', \'修改岗位信息\');
}
</script>
<div class=\"tiao\">
<input type=\"button\" class=\"submit_btn\" value=\"保存\" onclick=\"save()\" />
<input type=\"button\" class=\"submit_btn\" value=\"返回\" onclick=\"back()\" />
</div>
<iframe id=\"ifrm\" name=\"ifrm\" style=\"display: none;\"></iframe>
<form id=\"frm\" method=\"post\" enctype=\"multipart/form-data\" action=\"/HR/PostManage/SaveEdit?id=@(post.id)\"
target=\"ifrm\">
<div class=\"adminMainContent\">
<div class=\"box\">
<div class=\"box-title\">
基础信息
</div>
<div class=\"box-content\">
<table cellpadding=\"0\" cellspacing=\"0\" class=\"detail\" width=\"100%\">
<tr>
<td class=\"title\">
<span class=\"mst\">*</span>岗位名称:
</td>
<td style=\"width: 35%;\">
<input type=\"text\" class=\"xinxi_txt\" name=\"postName\" value=\"@post.postName\" />
<span class=\"valid\" msg=\"必填,且长度不能超过50\" rule=\"^(.|\\n){0,50}$\"></span>
</td>
<td class=\"title\">
<span class=\"mst\">*</span>岗位编号:
</td>
<td style=\"width: 35%;\">
<input type=\"text\" class=\"xinxi_txt\" name=\"postCode\" value=\"@post.postCode\" />
<span class=\"valid\" msg=\"必填,且长度不能超过20\" rule=\"^(.|\\n){0,20}$\" ajaxaction=\"/HR/PostManage/AjaxCheckPostCode?id=@post.id\">
</span>
</td>
</tr>
<tr>
<td class=\"title\">
<span class=\"mst\">*</span> 所属部门:
</td>
<td style=\"width: 35%;\">
<input type=\"text\" name=\"depCode\" id=\"dept\" class=\"easyui-combotree\" style=\"height: 30px;\" />
</td>
<td class=\"title\">
<span class=\"mst\">*</span>汇报对象:
</td>
<td style=\"width: 35%;\">
<select class=\"xueli\" name=\"reportPostCode\" id=\"agreementType\">
<option value=\"\" selected=\"selected\">==请选择==</option>
@foreach (sys_post item in postList)
{
if (item.postCode == post.reportPostCode)
{
<option value=\"@item.postCode\" selected=\"selected\">@item.postName</option>
}
else
{
<option value=\"@item.postCode\">@item.postName</option>
}
}
</select>
<span class=\"valid\" msg=\"请选择合同分类\">
</td>
</tr>
<tr>
<td class=\"title\">
<span class=\"mst\">*</span>岗位级别:
</td>
<td style=\"width: 35%;\">
<select class=\"xueli\" name=\"postLevel\">
<option value=\"\" selected=\"selected\">==请选择==</option>
<option value=\"1\">1</option>
<option value=\"2\">2</option>
<option value=\"3\">3</option>
<option value=\"4\">4</option>
<option value=\"5\">5</option>
<option value=\"6\">6</option>
</select>
<span class=\"valid\" msg=\"请选择岗位级别\">
</td>
<td class=\"title\">
</td>
<td style=\"width: 35%;\">
</td>
</tr>
<tr>
<td class=\"title\">
<span class=\"mst\">*</span>备注:
</td>
<td colspan=\"3\" style=\"width: 35%;\">
<textarea name=\"remarks\" style=\"width: 500px;\">@post.remarks</textarea>
<span class=\"valid\" msg=\"长度不得超过500\" rule=\"^(.|\\n){0,500}$\"></span>
</td>
</tr>
</table>
</div>
</div>
</div>
</form>
效果图:
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文地址:https://www.stayed.cn/item/25002
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我