JS实现支持Ajax验证的表单插件


Posted in Javascript onMarch 24, 2016

本文为大家分享了一个表单验证插件,支持ajax验证,使用起来很简单。
每个需要验证的表单元素下面有一个span标签,这个标签的class有一个valid表示需要验证,如果有nullable则表示可为空;rule表示验证规则,msg表示错误提示信息;to表示要验证的元素的name值,如果元素是单个的,to可以不写。该插件会遍历每个有valid的span标签,找出它前面需要验证的元素,根据rule验证,如果验证不通过,则显示边框为红色,鼠标放在元素上时显示错误信息。

验证时机:1、点击提交按钮时显式调用验证方法;2、当元素触发blur时验证。

插件代码:
CSS:

.failvalid
{
  border: solid 2px red !important;
}

JS:

/**
* 验证插件
*/

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>

效果图:

JS实现支持Ajax验证的表单插件

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript 贪吃蛇实现代码
Nov 22 Javascript
js 幻灯片的实现
Dec 06 Javascript
JS中的数组的sort方法使用示例
Jan 22 Javascript
JavaScript异步编程Promise模式的6个特性
Apr 03 Javascript
Egret引擎开发指南之编译项目
Sep 03 Javascript
json对象与数组以及转换成js对象的简单实现方法
Jun 24 Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 Javascript
js实现带缓动动画的导航栏效果
Jan 16 Javascript
AngularJS实现使用路由切换视图的方法
Jan 24 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
拥有一个属于自己的javascript表单验证插件
Mar 24 #Javascript
jquery zTree异步加载、模糊搜索简单实例分享
Mar 24 #Javascript
js+css实现select的美化效果
Mar 24 #Javascript
基于jQuery Ajax实现上传文件
Mar 24 #Javascript
Angular.js如何从PHP读取后台数据
Mar 24 #Javascript
JavaScript驾驭网页-获取网页元素
Mar 24 #Javascript
JavaScript驾驭网页-CSS与DOM
Mar 24 #Javascript
You might like
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
python实现解数独程序代码
2017/04/12 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
简单了解Django ContentType内置组件
2019/07/23 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
水果超市创业计划书
2014/01/27 职场文书
电气工程自动化求职信
2014/03/14 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
Python循环之while无限迭代
2022/04/30 Python
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技