validform表单验证的实现方法


Posted in Javascript onMarch 08, 2019

validform插件主要把所有的验证条件和验证提示信息绑定到每个表单元素,这种形式非常方便,下面写法更加智能得到label内容来提示

validform有什么用?

网页上有大量的input需要你进行验证的时候,如果是弹窗的话,需要不停地判断,如果为空,弹窗。如果不是数字,弹窗。

所以要将这么多验证交给一个js去验证。

validateform.js简单使用方法

1.datatype

要想标识出来想要验证的对象,我们就需要给这个对象绑定datatype属性,validform.js已经内置了10种验证格式,如果不够,我们还可以使用

http://validform.rjboy.cn/Validform/Validform_Datatype.js

来对验证格式进行扩展。

1.1 datatype=*

这个验证是用来表示当前的对象不能为空的,任何字符均可

1.2 datatype=*6-16

validform这个js有个优点,它会自动扩展你所写的验证格式。不同的字段我们可能要求的字符数量不一样,用户名这里你写了*6-16,要求用户填入6到16位的字符。可标题这里又要求填入2到5个字符,难道我们要在验证格式这里再写一个*2-5吗?不用!形如"*6-16"的datatype,Validform会自动扩展,可以指定任意的数值范围。如内置基本类型有"*6-16",那么你绑定 datatype="*4-12"就表示4到12位任意字符。如果你自定义了一个datatype="zh2-4",表示2到4位中文字符,那么 datatype="zh2-6"就表示2到6位中文字符。

1.3 datatype=url

可以用来验证网址。

1.4 datatype=e

可以用来验证电子邮箱地址

1.5 datatype=m

用来验证手机号,但是给的正则表达式有问题,对于新出现的177号段之类的没有加入进去,这块需要注意一下。

1.6 其他注意事项

datatype支持规则累加或单选。用","分隔表示规则累加;用"|"分隔表示规则多选一,即只要符合其中一个规则就可以通过验证,绑定的规则会依次 验证,只要验证通过,后面的规则就会忽略不再比较。如绑定datatype="m|e",表示既可以填写手机号码,也能填写邮箱地址,如果知道填入的是手 机号码,那么就不会再检测他是不是邮箱地址;datatype="zh,s2-4",表示要符合自定义类型"zh",也要符合规则"s2-4"。

直接绑定正则:如可用这样写datatype="/\w{3,6}/i",要求是3到6位的字母,不区分大小写;
支持简单的逻辑运算:如datatype="m | e, *4-18 | /\w{3,6}/i | /^validform\.rjboy\.cn$/",
这 个表达式的意思是:可以是手机号码;或者是邮箱地址,但字符长度必须在4到18位;或者是3到6位的字母,不区分大小写;或者输入 validform.rjboy.cn,区分大小写。这里","分隔相当于逻辑运算里的"&&"; "|"分隔相当于逻辑运算里的"||";不支持括号运算。

2.ignore

绑定了ignore="ignore"的表单元素,在有输入时,会验证所填数据是否符合datatype所指定数据类型,没有填写内容时则会忽略对它的验证;

如何在表单中控制如果某几项要填都填,要不填都不填。

对这几项赋给相同的class 比如AllNeedOrEmpty

之后在初始化参数中的beforeCheck部分对这个class做操作,具体代码如下

beforeCheck: function(curform) {
  $("#sliderAd ul").each(function() {
    var needIgnore = true;
    var _this = $(this);
    var checkList = _this.find("input[class*=AllNeedOrEmpty]");
    checkList.each(function() {
      var that = $(this);
      if (that.val() != "") {
        checkList.each(function() {
          $(this).removeAttr("ignore");
        });
        needIgnore = false;
      }
    });
    if (needIgnore) {
      checkList.each(function() {
        $(this).attr("ignore", "ignore");
      });
    }
  });
},

上面的代码只是提供一个思路,肯定有更好的方法,

比如使用validform对象中的ignore方法和unignore方法,通过向这两个方法传入表单元素来忽略和重新获取验证效果。

不过这两种方法是对元素赋给和去掉dataIgnore来实现验证与否。

源码如下:

ignore: function(selector) {
    var obj = this;
    var selector = selector || "[datatype]"

    $(obj.forms).find(selector).each(function() {
      $(this).data("dataIgnore", "dataIgnore").removeClass("Validform_error");
    });

    return this;
  },

  unignore: function(selector) {
    var obj = this;
    var selector = selector || "[datatype]"

    $(obj.forms).find(selector).each(function() {
      $(this).removeData("dataIgnore");
    });

    return this;
  },

我的方法是控制ignore这个attr,而validform方法则是在元素上利用data方法来实现是否验证,思路基本一致,但是当元素是动态生成的时候我觉得还是ignore=ignore这个方法比较好,因为省事啊。

 欢迎评论相互探讨。

3.初始化参数

如下是官网例子中给出的所有的可用参数

页面地址:http://validform.rjboy.cn/document.html

$(".demoform").Validform({
  btnSubmit: "#btn_sub", //提交按钮
  btnReset: ".btn_reset",
  tiptype: 1, //
  ignoreHidden: false,
  dragonfly: false,
  tipSweep: true,
  label: ".label",
  showAllError: false,
  postonce: true,
  ajaxPost: true,
  datatype: {
    "*6-20": /^[^\s]{6,20}$/,
    "z2-4": /^[\u4E00-\u9FA5\uf900-\ufa2d]{2,4}$/,
    "username": function(gets, obj, curform, regxp) {
      //参数gets是获取到的表单元素值,obj为当前表单元素,curform为当前验证的表单,regxp为内置的一些正则表达式的引用;
      var reg1 = /^[\w\.]{4,16}$/,
        reg2 = /^[\u4E00-\u9FA5\uf900-\ufa2d]{2,8}$/;
      if (reg1.test(gets)) {
        return true;
      }
      if (reg2.test(gets)) {
        return true;
      }
      return false;
      //注意return可以返回true 或 false 或 字符串文字,true表示验证通过,返回字符串表示验证失败,字符串作为错误提示显示,返回false则用errmsg或默认的错误提示;
    },
    "phone": function() {
      // 5.0 版本之后,要实现二选一的验证效果,datatype 的名称 不 需要以 "option_" 开头;
    }
  },
  usePlugin: {
    swfupload: {},
    datepicker: {},
    passwordstrength: {},
    jqtransform: {
      selector: "select,input"
    }
  },
  beforeCheck: function(curform) {
    //在表单提交执行验证之前执行的函数,curform参数是当前表单对象。
    //这里明确return false的话将不会继续执行验证操作;
  },
  beforeSubmit: function(curform) {
    //在验证成功后,表单提交前执行的函数,curform参数是当前表单对象。
    //这里明确return false的话表单将不会提交;
  },
  callback: function(data) {
    //返回数据data是json对象,{"info":"demo info","status":"y"}
    //info: 输出提示信息;
    //status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作;
    //你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作;
    //ajax遇到服务端错误时也会执行回调,这时的data是{ status:**, statusText:**, readyState:**, responseText:** };

    //这里执行回调操作;
    //注意:如果不是ajax方式提交表单,传入callback,这时data参数是当前表单对象,回调函数会在表单验证全部通过后执行,然后判断是否提交表单,如果callback里明确return false,则表单不会提交,如果return true或没有return,则会提交表单。
  }
});

3.1 如何使用ajax提交数据,而不提交表单。

beforeSubmit: function (curform) {
   addNewAd();
   return false;
   //这里明确return false的话表单将不会提交;
 }

直接在beforeSubmit中加上对应的ajax提交函数,并加上return false就可以保证表单不会被提交而执行我们的ajax函数。

3.2 tiptype

用来设置提示信息的展示方式,可用的值有:1、2、3、4和function函数,默认tiptype为1。

1代表自定义弹出框提示。

2代表侧边提示,会在当前元素的父级的next对象的子级查找显示提示信息的对象。

如果不存在就会创建

if (tiptype == 2) {
  if ($(this).parent().next().find(".Validform_checktip").length == 0) {
    $(this).parent().next().append("<span class='Validform_checktip' />");
    $(this).siblings(".Validform_checktip").remove();
  }
}

3也是代表的侧边提示,不过它是会在当前元素的siblings对象中查找显示提示信息的对象

同样也是不存在就会创建

if (tiptype == 3) {
  if ($(this).siblings(".Validform_checktip").length == 0) {
    $(this).parent().append("<span class='Validform_checktip' />");
    $(this).parent().next().find(".Validform_checktip").remove();
  }
}

4也是侧边显示会在当前元素的父级的next对象下查找显示提示信息的对象

还可以传入自定义函数,实现你想要的提示效果。

validform实例

【1】引入js脚本:

<link href="${ctx}/assets/css/validform.css" rel="external nofollow" rel="stylesheet" type="text/css" />
<script src="${ctx}/assets/js/validform_min.js"></script>

【2】html:

<form action="$https://segmentfault.com/a/1190000018426565/insert" class="form-horizontal form-bordered" method="post" id="validform">
  <div class="form-group">
    <label class="control-label col-md-3">类型</label>
    <div class="col-md-4">
      <select class="form-control" data-width="100%" name="equipment.categoryId" id="equipmentCategory">
        <option value="">--请选择--</option>
         <c:forEach items="${equipmentCategoryList}" var="obj">
           <option value="${obj.id}" <c:if test="${obj.id eq equipment.categoryId }">selected</c:if> >${obj.name}</option>
        </c:forEach>
      </select>
    </div>
  </div>
  <div class="form-group">
    <label class="control-label col-md-3">设备名称</label>
    <div class="col-md-4">
      <input class="form-control inputxt" type="text" value="${equipment.name}" name="equipment.name"/> 
    </div>
  </div>
</form>

【3】js脚本:

// 添加验证
$(function(){
  var demo=$("#validform").Validform({//指明是哪一表单需要验证,名称需加在form表单上;
    tiptype:3
    ,label:".control-label"
    ,showAllError:true
    ,ignoreHidden:true
    ,datatype:{
      "zh1-6":/^[\u4E00-\u9FA5\uf900-\ufa2d]{1,6}$/
      ,"Aa1":/^[A-Za-z0-9]+$/
    }
  });
  demo.addRule([
    {
      ele:".inputxt"
      ,datatype:"*1-256"
    },
    {
      ele:"select"//<option value="">--请选择--</option>,这一项的值为空,否则无效
      ,datatype:"*"//也可以写到input标签里
    }
  ]);
  // 阻止表单提交(这是一种形式,因为还没找到两者比较时候的判断)
  $("#submit").click(function(event) {
    var highest = $("#highest").val();
    var lowest = $("#lowest").val();
    if(highest <= lowest){
      alert("最高层熟不能小于最低层数");
       return false;// 禁止提交
    }
    if(lowest > 2){
      alert("最低层数不能大于1");
      return false;
    }
  });
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js函数般调用正则
Apr 08 Javascript
xss文件页面内容读取(解决)
Nov 28 Javascript
JavaScript执行效率与性能提升方案
Dec 21 Javascript
密码框显示提示文字jquery示例
Aug 29 Javascript
详解JavaScript操作HTML DOM的基本方式
Oct 21 Javascript
js随机生成26个大小写字母
Feb 12 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
详解express与koa中间件模式对比
Aug 07 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 Javascript
详解JVM系列之内存模型
Jun 10 Javascript
webpack4.x下babel的安装、配置及使用详解
Mar 07 #Javascript
Webpack4 使用Babel处理ES6语法的方法示例
Mar 07 #Javascript
深入理解react 组件类型及使用场景
Mar 07 #Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 #Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 #Javascript
Vue中的情侣属性$dispatch和$broadcast详解
Mar 07 #Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 #jQuery
You might like
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
webpack4简单入门实例
2018/09/06 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
Flask-WTF表单的使用方法
2019/07/12 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python print不能立即打印的解决方式
2020/02/19 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
super关键字的用法
2012/04/10 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
小学教师寄语大全
2014/04/03 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
MySQL transaction事务安全示例讲解
2022/06/21 MySQL