天天看點

前端頁面校驗(使用Jquery-validate.js檔案的校驗)

在前端頁面如果不想自己手寫各種校驗,那就可以使用jquery-validate.js檔案的校驗;

具體的使用步驟:(基本上就四個大步驟)

首先,導入這個jquery-validate.js檔案和jquery-min.js檔案(後面這個檔案不一定非要是jquery-min.js,也可以是jquery-3.2.1.min.js)。

其次,該js檔案的前端校驗隻能驗證表單中的東西。是以必須要寫一個form表單。(把要校驗的東西放

<form id='hh'>

裡頭,當然了,如果你準備使用Ajax的話,

<form>

中不需要寫action和method了)。

再次,在

<script>

中寫一個

$("#hh").validate({......})

,建議:最好把它放到頁面加載函數中。

最後,在form表單中必須要使用type=submit的按鈕來送出。當點選該按鈕的時候,會去執行你寫在頁面加載函數window.onload中的$("#hh").validate({…});中的這個submitHandler:function(){ }函數,而不是像你往常使用那般 直接送出到某處。

注意:該前端驗證并不會驗證空值(也就是你直接敲空格鍵)。(是以說,在項目進行雙重校驗也是很有必要的)

<!DOCTYPE html> 
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <title>雲筆記</title>
      <script type="text/javascript" src="scripts/common/jquery.min.js"></script>
      <script type="text/javascript" src="scripts/login.js"></script>//下面會有
      <script type="text/javascript" src="scripts/cookie.js"></script>
      <script src="scripts/jquery.validate.js"></script>
      <link rel="stylesheet" href="styles/login.css" target="_blank" rel="external nofollow" />
      <style>
           label.error {//标簽選擇器
                 color:red;
           }
      </style>
</head>
   <body>
      <form id="zhuce">
            <div class="sig sig_out" tabindex='-1' id='zc' style='visibility:hidden;'>
               <dl>
                  <dt>
                     <div class='header'>
                        <h3>注&nbsp;冊</h3>
                     </div>
                  </dt>
                  <dt></dt>
                  <dt>
                     <div class='letter'>
                        <label for="regist_username">使用者名:&nbsp;</label>
                        <input type="text" name="name" id="regist_username" tabindex='5'/>
                        <div id="warning_1" style="display:none"><span></span></div>
                     </div>
                  </dt>
                  <dt>
                     <div class='letter'>
                        <label for="nickname">昵&nbsp;&nbsp;&nbsp;稱:&nbsp;</label>
                        <input type="text" name="nickname" id="nickname" tabindex='6'/>
                     </div>
                  </dt>
                  <dt>
                     <div class='letter'>
                        <label for="regist_password">密&nbsp;&nbsp;&nbsp;碼:&nbsp;</label>
                        <input type="password" name="password" id="regist_password" tabindex='7'/>
                        <div id="warning_2" style="display:none"><span></span></div>
                     </div>
                  </dt>
                  <dt>
                     <div class='password'>
                        <label for="final_password">&nbsp;&nbsp;&nbsp;确認密碼:&nbsp;</label>
                        <input type="password" name="final_password" id="final_password" tabindex='8'/>
                     </div>
                  </dt>
                  <dt>
                     <div>
                                             <input type="submit" name="" id="regist_button" value='&nbsp注&nbsp冊&nbsp' tabindex='9'/>
                        <input type="button" name="" id="back" value='&nbsp返&nbsp回&nbsp' tabindex='10'/>
                     </div>
                  </dt>
               </dl>
            </div>
         </form>
      </div>
     


<script type="text/javascript">
         function get(e){
            return document.getElementById(e);
         }
         get('sig_in').onclick=function(){
            get('dl').className='log log_out';
            get('zc').className='sig sig_in';
         }
         get('back').onclick=function(){
            get('zc').className='sig sig_out';
            get('dl').className='log log_in';
         }


         window.onload=function(){//js的頁面加載函數
                   var t=setTimeout("get('zc').style.visibility='visible'",800);


         
//在這裡的這個前端校驗,我隻校驗使用者名、密碼、确認密碼這三個輸入框。像name/password/final_password都是對應着上面的表單中的相應表單元件的name屬性的值。也就是說下面的rules中的name/password/final_password這三個單詞的位置所寫的隻能是表單元件的name屬性的值。
                   $('#zhuce').validate({//這裡就是使用jquery-validate前端校驗所需要寫的地方
                         rules:{
                             name:{
                                   required:true,
                                   remote: {//這是對你寫的注冊的姓名進行異步校驗,看是否沖突
                                      url: "/user/checkname",     //路徑
                                      type: "post",               //資料發送方式
                                      data: {                     //要傳遞的資料
                                              name: function() {//這裡必須這樣寫一個function。而且控制層的checkname方法的傳回值必須為布爾類型
                                                     return $("#regist_username").val();
                                               }
                                             //如果在這個位置你有兩個屬性想要傳到背景去校驗,而不是隻有一個name屬性,那麼,你就将這行上面的用藍色作為背景色的那部分再寫一個。有多少個屬性想傳到背景進行異步校驗,那麼這裡就寫多少個藍色背景色的代碼。

                                             }
                                   }
                              },
                             password:{required:true,minlength:6},
                             final_password:{equalTo:"#regist_password"}
                     },

                    messages:{
                              name:{required:"使用者名不能為空",remote:"使用者名已存在"},
                              password:{required:"密碼不能為空",minlength:"密碼長度至少6位"},
                              final_password:{equalTo:"密碼不一緻"}
                   },

                  submitHandler:function(){//當點選上面表單中的type=submit按鈕時,不會直接将内容送出到某處,而會來執行這裡
                        // alert(234);
                          register();//這個方法是我寫在login.js檔案中的一個注冊方法。login.js檔案中的内容将會在下面展示。
                  }

              });
         }
      </script>     
   </body>
</html>
           
前端頁面校驗(使用Jquery-validate.js檔案的校驗)
前端頁面校驗(使用Jquery-validate.js檔案的校驗)

下面是控制層Controller中的方法:(或許對應着看,更能了解怎麼使用jquery-validate.js提供的前端頁面校驗。。注意:我在項目中使用的是Springboot架構,對于它的一些注解,你們需要知道,才能夠看懂控制層代碼)

package com.oracle.cloudnote.web;

import com.oracle.cloudnote.bean.Result;
import com.oracle.cloudnote.service.UserService;
import com.oracle.cloudnote.utils.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpSessionRequiredException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.oracle.cloudnote.bean.User;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/register")
    public Object register(@Valid User user,BindingResult r){//@Valid注解是Springboot架構所吸納的hibernate架構特有的背景驗證所帶的注解
        Result result=new Result();
        if(r.hasErrors()){//Springboot所吸納的hibernate架構特有的背景驗證錯誤
            List<ObjectError> list=r.getAllErrors();
            for(ObjectError err:list){
                System.out.println(err.getDefaultMessage());
            }
            result.setSuccess(false);
            result.setMsg("格式錯誤");
            result.setData(list);
            return result;
        }
        boolean b=userService.register(user);
        if(!b){
            result.setSuccess(false);
            result.setMsg("使用者名已存在");
        }
        return result;
    }

    @RequestMapping("/checkname")
    public boolean checkName(String name){//如果要使用jquery-validate中的remote來實作名字的異步校驗,這裡的傳回值就必須布爾類型
        return userService.checkName(name);//傳回true則表示該使用者名可以注冊
    }

    @RequestMapping("/login")
    public Result login(@Valid User user, HttpSession  session){
        User  u=userService.login(user);
        Result r=new Result();
        if(u==null){
            r.setMsg("使用者名或密碼錯誤");
            r.setSuccess(false);
            return r;
        }
        session.setAttribute("user",u);
        r.setData(u);
        return r;
    }

    @RequestMapping("/logout")
    public Result logout(HttpSession  session){
//        session.removeAttribute("user");//當資料量大的時候,不适合,應使用如下的方法
        session.invalidate();
        Result r=new Result();
        r.setMsg("退出成功");
        return r;
    }



    @RequestMapping("/changepwd")
    public Result changePwd(HttpSession session,String last_password,String new_password){
        User user=(User)session.getAttribute("user");
        Result r=new Result();
        if(!user.getPassword().equals(Md5Util.md5(last_password))){
            r.setMsg("輸入的原密碼有誤");
            return r;
        }else{
            user.setPassword(Md5Util.md5(new_password));
            userService.changePwd(user);
            r.setMsg("密碼修改成功");
        }
        session.setAttribute("user",user);
        r.setData(user);
        return r;
    }
}
           

下面的是login.js檔案:

/**
 * 頁面初始化後,綁定函數。
 */
$(function(){
   //注冊
   $("#regist_button").click(function(){
      //register();
   });
   
   //登入
   $("#login").click(function(){
      login();
   });
   
   //登出
   $("#logout").click(function(){
      logout();
   });
   
   //修改密碼
   $("#changePassword").click(function(){
      //changepwd();
   })

});

//注冊
function register() {
   //alert("注冊成功.");
    var name=$("#regist_username").val();
    var nickname=$("#nickname").val();
    var password=$("#regist_password").val();

    name=name.trim();
    nickname=nickname.trim();
    password=password.trim();

   $.post('/user/register',{"name":name,"nickname":nickname,"password":password},
      function (response) {
         if(response.success){
            alert("注冊成功");
                $("#zc").attr("class","sig sig_out");
                $("#dl").attr("class","log log_in");
         }else{
            //alert("注冊失敗");
            alert(response.msg);
            if(response.msg=="格式錯誤"){
                    var errs=response.data;
                    for(var i=0;i<errs.length;i++){
                        alert(errs[i].field+"----"+errs[i].defaultMessage);

                        if(errs[i].field=="name"){
                            var error=$("#warning_1").children().get(0);
                            error.innerText=errs[i].defaultMessage;
                            error.style.color="red";
                            get('warning_1').style.display='block';
                        }
                        if(errs[i].field=="password"){
                            var error=$("#warning_2").children().get(0);
                            error.innerText=errs[i].defaultMessage;
                            error.style.color="red";
                            get('warning_2').style.display='block';
                        }

                    }
            }

         }

        });
}

//登陸
function login() {
   //alert("登陸成功.");
    var name=$("#count").val();
    var password=$("#password").val();

    name=name.trim();
    password=password.trim();

    $.post(//這種方式不能用來傳遞一些特殊參數,比如上傳檔案的參數
       "/user/login",
      {"name":name,"password":password},
      function (response) {//這裡的response就等于是控制層的方法中傳回的result對象
         if(response.success){
             addCookie("username",response.data.name,1);//注意:因為cookie中隻能儲存字元串,不能儲存整個的對象。是以要把user拆開來儲存
               addCookie("id",response.data.id,1);
               location.href="edit.html?id=" target="_blank" rel="external nofollow" +response.data.id;
         }else{
                alert(response.msg);
         }
    });


}

/**
 * 登出
 */
function logout(){
   //location.href="login.html" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ;
  // console.log(123123);
   var id=getCookie("id");
    $.post("/user/logout",{"id":id},function (response) {
        if(response.success){
            delCookie("id");//這兩個方法是定義在cook.js檔案中的
            delCookie("username");
            location.href="login.html" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ;
        }
    });
}

/**
 * 修改密碼
 */
function changepwd(){
   //alert("修改成功.");
    var last_password=$("#last_password").val();
    var new_password=$("#new_password").val();

    last_password=last_password.trim();
    new_password=new_password.trim();

    var id=getCookie("id");
    $.post(
        "/user/changepwd",
        {"id":id,"last_password":last_password,"new_password":new_password},
        function (response) {
            alert(response.msg);
            if(response.success){
                logout();
            }else{

            }
    });
}
           

因為在login.js檔案中用到了getCookie等等關于cookie的函數,這些函數都是封裝在cookie.js中的。cookie.js中的内容如下:

//擷取指定名稱的cookie的值
function getCookie(objName) {
   //得到分割的cookie名值對
   var arrStr = document.cookie.split("; ");
   for ( var i = 0; i < arrStr.length; i++) {
      //将名和值分開    
      var temp = arrStr[i].split("=");
      if (temp[0] == objName)
         return unescape(temp[1]);
   }
   return "";
}

//添加cookie
function addCookie(objName, objValue, objHours) { 
   var str = objName + "=" + escape(objValue);
   //為0時不設定過期時間,浏覽器關閉時cookie自動消失
   if (objHours > 0) { 
      var ms = objHours * 3600 * 1000;
      var date = new Date();
      date.setTime(date.getTime() + ms);
      str += "; expires=" + date.toGMTString();
   }
   document.cookie = str;
}

//兩個參數,一個是cookie的名字,一個是值
function setCookie(name, value) {
   //此 cookie 将被儲存 30 天
   var Days = 30; 
   var exp = new Date();
   exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
   document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}

//删除cookie
function delCookie(name) {
   var exp = new Date();
   exp.setTime(exp.getTime() - 1);
   var cval = getCookie(name);
   if (cval != null) {
      document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
   }
}
           

這個cookie.js檔案的用途,比如說:如果整個項目不能使用jsp頁面,隻使用html頁面,這時,你該怎麼在前端頁面中取出在背景session中存的使用者資訊呢?

這時就需要使用cookie了。在前端html頁面把登入成功後的資訊存入cookie中。要取的時候從cookie中取出來。(注意:存入cookie的時候不能直接存一整個對象,而是隻能存字元串)。

是以,在這個檔案中,就把往cookie中存值、取值、以及删除cookie封裝起來了。

繼續閱讀