擁有一個(gè)屬于自己的javascript表單驗(yàn)證插件

字號:


    這篇文章主要幫助大家擁有一個(gè)屬于自己的javascript表單驗(yàn)證插件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    自己編寫了一個(gè)表單驗(yàn)證插件,使用起來很簡單,以后還可以擴(kuò)展更多的功能,比如ajax驗(yàn)證。
    每個(gè)需要驗(yàn)證的表單元素下面有一個(gè)span標(biāo)簽,這個(gè)標(biāo)簽的class有一個(gè)valid表示需要驗(yàn)證,如果有nullable則表示可為空;rule表示驗(yàn)證規(guī)則,msg表示錯(cuò)誤提示信息;to表示要驗(yàn)證的元素的name值,如果元素是單個(gè)的,to可以不寫。該插件會遍歷每個(gè)有valid的span標(biāo)簽,找出它前面需要驗(yàn)證的元素,根據(jù)rule驗(yàn)證,如果驗(yàn)證不通過,則顯示邊框?yàn)榧t色,鼠標(biāo)放在元素上時(shí)顯示錯(cuò)誤信息。
    驗(yàn)證時(shí)機(jī):1、點(diǎn)擊提交按鈕時(shí)顯式調(diào)用驗(yàn)證方法;2、當(dāng)元素觸發(fā)blur時(shí)驗(yàn)證。
    插件代碼:
    CSS:
    .failvalid
    {
     border: solid 2px red !important;
    }
    JS:
    /**
    * 驗(yàn)證插件
    */
    SimpoValidate = {
     //驗(yàn)證規(guī)則
     rules: {
      int: /^[1-9]\d*$/,
      number: /^[+-]?\d*\.?\d+$/
     },
     //初始化
     init: function () {
      $("span[class*='valid']").each(function () { //遍歷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);
        });
       }
      });
     },
     //驗(yàn)證全部,驗(yàn)證成功返回true
     valid: function () {
      var bl = true;
      $("span[class*='valid']").each(function () { //遍歷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;
     },
     //單個(gè)驗(yàn)證,驗(yàn)證成功返回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");
      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;
         }
        }
       }
       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;
         }
        }
       }
      }
      return true;
     },
     //獲取驗(yàn)證規(guī)則
     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;
      }
     },
     //紅邊框及錯(cuò)誤提示
     hilight: function (target, msg) {
      target.addClass("failvalid");
      target.bind("mouseover", function (e) {
       SimpoValidate.tips(target, msg, e);
      });
      target.bind("mouseout", function () {
       SimpoValidate.removetips();
      });
     },
     //取消紅邊框及錯(cuò)誤提示
     removehilight: function (target) {
      target.unbind("mouseover");
      target.unbind("mouseout");
      target.removeClass("failvalid");
      SimpoValidate.removetips();
     },
     //顯示提示
     tips: function (target, text, e) {
      var divtipsstyle = "position: absolute; left: 0; top: 0; background-color: #dceaf2; padding: 3px; border: solid 1px #6dbde4; visibility: hidden; line-height:20px; ";
      $("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();
    });
    如何使用:
    1、引用CSS和JS(必須引用jQuery):
    <link type="text/css" href="~/Scripts/SimpoValidate.css" rel="stylesheet" />
    <script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
    <script type="text/javascript" src="~/Scripts/ValidateUtil.js"></script>
    2、表單HTML代碼(部分代碼):
    <table cellpadding="0" cellspacing="0">
     <tr>
      <td>
       <input name="c" value="" type="text" />
       <span rule="int" msg="可為空,請?zhí)顚懻麛?shù)"></span>
      </td>
     </tr>
     <tr>
      <td>
       <input name="d" value="" type="text" />
       <span rule="number" msg="必填,請?zhí)顚憯?shù)字"></span>
      </td>
     </tr>
     <tr>
      <td>
       <select>
        <option value="-1">==請選擇==</option>
        <option value="1">是</option>
        <option value="2">否</option>
       </select>
       <span rule="^(?!-1$).+$" msg="必選"></span>
      </td>
     </tr>
     <tr>
      <td>
       <input name="a" value="1" type="checkbox" />
       <span>多</span>
       <input name="a" value="2" type="checkbox" />
       <span>少</span>
       <span rule="" msg="必選" to="a"></span>
      </td>
     </tr>
     <tr>
      <td>
       <input name="b" value="1" type="radio" />
       <span>狗</span>
       <input name="b" value="2" type="radio" />
       <span>貓</span>
       <span rule="" msg="必選" to="b"></span>
      </td>
     </tr>
     <tr>
      <td>
       <textarea cols="20" rows="5"></textarea>
       <span rule="^(.|\n){5,100}$" msg="可為空,長度必須大于等于5小于等于100"></span>
      </td>
     </tr>
    </table>
    3、執(zhí)行驗(yàn)證JS代碼:
    //保存數(shù)據(jù)
    function save() {
     if (SimpoValidate.valid()) { //執(zhí)行驗(yàn)證
      $("#frm").submit(); //提交表單
     }
    }
    效果圖:
    名單
    以上就是作者自己動手編寫的javascript表單驗(yàn)證插件,希望能夠幫助到大家。