欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

validform表单验证的实现方法

程序员文章站 2023-01-26 15:31:27
validform插件主要把所有的验证条件和验证提示信息绑定到每个表单元素,这种形式非常方便,下面写法更加智能得到label内容来提示 validform有什么用? 网...

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.初始化参数

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

页面地址:

 $(".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;
    }
  });
})

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