首页 > 编程 > JavaScript > 正文

自己编写的支持Ajax验证的JS表单验证插件

2019-11-20 12:28:18
字体:
来源:转载
供稿:网友

    自己编写了一个表单验证插件,支持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>

效果图:

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表