javaScript-06 表单验证 详细易懂,加案例分析

简介: javaScript-06 表单验证 详细易懂,加案例分析

一.JS表单验证基本介绍

1.1.JS表单验证概述

  • 表单验证是JavaScript中高级选项之一。
  • JavaScript可用来在大数据被送往服务器前对HTML表单中的这些输入数据进行验证。

1.2表单验证的作用

减轻服务器的压力

如果没有表单验证那么用户输入的账号密码就要先发送到服务器验证,这样的话如果同时有多个设备同时发送请求那么就会很影响性能

保证输入的数据符合要求

如果我们在用户输入的时候就开始验证,要是符合规则的话我们就可以直接发送到服务器这样服务器就不需要验证了直接可以接受了

1.3JS表单验证需求分析

表单验证需求
   1、用户名不能为空
   2、用户名必须在6-14位
   3、用户名和密码由数字和字母组成(正则表达式)
   4、密码和确认密码一致,邮箱地址合法
   5、统一失去焦点验证
   6、错误信息统一在span标签中显示,要求字体12号,红色,验证成功显示绿色字体
   7、文本框获得焦点,清除错误信息,如果文本框中数据不合法,要求清空文本框的value
   8、最终表单所有项均合法方可提交

二.JavaScript 事件列表

在网页中不同的元素在操作过程中会激活一些不同操作。如:鼠标单击,按下键盘,失去焦点等。我们可以针对这些操作进行代码的编写。

//方式一:命名函数
<input type="button" value="点我试试" onclick="事件处理函数()">
//方式二:匿名函数
元素对象.onclick = function () {
  事件处理的代码
}

事件名

作用

onclick

单击事件

ondblclick

双击事件

onload

加载完毕

onfocus

得到焦点

onblur

失去焦点

onchange

改变事件

onmouseover

鼠标上移

onmouseout

鼠标移除

onsubmit

表单提交事件

三.表单验证方式

3.1 string常见方法

indexOf(), lastIndexOf() 查找字符位置
charAt() 按索引返回字符串
concat() 拼接字符串
substr()  按长度截取字符串
slice() 截取字符串
substring() 截取字符串
replace() 替换字符串
toUpperCase(), toLowerCase() 大小写转换

3.2 案例

例:submit事件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <!-- action=""  提交的地址 -->
    <!-- method=""  提交数据的请求方式  get  post -->
    <form action="demo2.html" method="get" onsubmit="return myf();">
      账号 <input type="text" id="username">
      <br>
      密码 <input type="password">
      <br>
      <input type="submit" value="注册" />
    </form>
    <script type="text/javascript">
      // 表单验证 
      // 1.利用string提供的方法  判断表单元素  是否满足要求
      // 账号
      function myf() {
        var username = document.getElementById('username').value;
        if (username.trim().length === 0 ||
          "" === username.trim()) {
          alert("用户名不能为空");
          return false;
        } else { //不为空
          if (username.trim().length < 6 || username.trim().length > 12) {
            alert('账户必须在6-12位之间');
            return false;
          } else { //满足6-12
            //需求:必须时纯数字  charAt(index)
            var flag = true;
            for (var i = 0; i < username.length; i++) {
              var chr = username.charAt(i);
              if (!(chr > '0' && chr < '9')) {
                flag = false;
                break;
              }
            }
            if (!flag) {
              alert('必须时纯数字');
              return false;
            }
          }
        }
        return true; //条件不满足  直接返回true
      };
    </script>
  </body>
</html>

例:焦点事件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
      span{
        font-size: 12px;
        color: red;
      }
    </style>
  </head>
  <body>
    <form action="demo2.html" method="get" onsubmit="return myf();">
      账号 <input onfocus="myb();" onblur="mya();" type="text" id="username">
      <span id="error_username"></span>
      <br>
      密码  <input onblur="myc();" type="password" id="pwd">
      <span id="error_pwd"></span>
      <br>
      <input type="submit" value="注册"/>
    </form>
    <script type="text/javascript">
      // 焦点事件: onfocus  onblur
      // 账号的获取焦点事件
      function myb(){
        document.getElementById('error_username').innerHTML = '账号的长度在4-12之间'
      }
      // 账号的失焦事件
      function mya(){
        var username = document.getElementById('username').value;
        if(!username){
          document.getElementById('error_username').innerHTML = '账号不能为空'
          return false;
        }else{
          document.getElementById('error_username').innerHTML = 'ok'
        }
        return true;
      }
      // 密码的失去焦点事件
      function myc(){
        var pwd = document.getElementById('pwd').value;
        if(pwd.trim().length <4 || pwd.trim().length >12){
          document.getElementById('error_pwd').innerHTML = '密码必须在4-12之间'
          return false
        }else{
          document.getElementById('error_pwd').innerHTML = ''
        }
        return true;
      }
      function myf(){
        // 调用焦点事件  处理结果
        var uname = mya();
        var pwd = myc();
        if(!uname || !pwd){
          return false;
        }
        return true;
      }
    </script>
  </body>
</html>

四.表单验证方式二

4.1正则表达式概述

  • 正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串搜索模式
  • 用某种模式去匹配一类字符串的公式

4.2 定义方式

//字面量方式,其由包含在斜杠之间的模式组成,如下所示:
var re = /ab+c/;
//构造函数方式,调用RegExp对象的构造函数,如下所示:
var re = new RegExp("ab+c");
var regex = /正则规则/;
//调用方法判断是否满足要求
var flag = regex.test('内容');

4.3 正则规则符号介绍

4.4案例

<!-- 注册 -->
  <!-- onsubmit 点击提交按钮的时候触发 -->
  <!-- onkeyup:键盘事件     onabort:鼠标焦点事件 -->
  <form action="注册成功.html" onsubmit="return cheekAll()">
    <div>
      <label>
        账号:<input id="name" type="text" onkeyup="checkName()" />
        <span style="color: red;" id="sname"></span>
      </label>
    </div>
    <div>
      <label>
        密码:<input id="pwd" type="password" onkeyup="checkPwd()" />
        <span style="color: red;" id="spwd"></span>
      </label>
    </div>
    <button type="submit">注册</button>
    <button type="reset">清空/重置</button>
  </form>
  </body>
  <script type="text/javascript">
    function $(id) {
      //通过id获取组件并且返回 
      return document.getElementById(id);
    }
    //正则表达式验证
    //1.账号验证:只能由数字和大小写的英文字母及下划线组成,并且长度在6-10
    function checkName() {
      //获取账号
      var name = $("name").value;
      var reg = /^\w{6,10}$/;
      if (!reg.test(name)) {
        $("sname").innerHTML = "账号不符合规则";
        return false;
      } else {
        //清空span内容
        $("sname").innerHTML = "";
        return true;
      }
    }
    //1.密码验证:只能由数字组成,并且长度为6
    function checkPwd() {
      //获取密码
      var pwd = $("pwd").value;
      var reg = /^\d{6}$/;
      if (!reg.test(pwd)) {
        $("spwd").innerHTML = "密码不符合规则";
        return false;
      } else { //输入正确
        //清空span内容
        $("spwd").innerHTML = "";
        return true;
      }
    }
    //3.总方法
    function cheekAll() {
      //调用验证组件的方法
      if (!checkName() || !cheekAll()) {
        return false;
      } else {
        return true;
      }
    }
  </script>

五.案例

例:漂浮广告

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
      *{margin: 0px;padding: 0px;}
      #oDiv{
        width: 200px;
        height: 200px;
        background-color: yellow;
        opacity: 0.2;
        border-radius: 100%;
        position: absolute;
        left: 0px;
        margin-top: 20px;
      }
    </style>
  </head>
  <body>
    <!-- html -->
    <div id="oDiv"></div>
    <!-- 引入js兼容型插件库 -->
    <script src="js/myjs.js" type="text/javascript" charset="utf-8"></script>
    <!-- js -->
    <script type="text/javascript">
      // 获取和模型div
      var oDiv = document.querySelector('#oDiv');
      // 获取和模型div的left属性值
      var oDivLeft = parseInt(getStyle(oDiv,'left'));
      var oDivTop = parseInt(getStyle(oDiv,'top'));
      // console.log(oDivLeft);
      //获取当前屏幕中的可视区宽度
      var documentClientWidth = client().width-200;
      //获取当前屏幕中的可视区高度
      var documentClientHeight = client().height-200;
      console.log("可视区宽度: "+documentClientWidth);
      var flag1 = true;
      var flag2 = true;
      // 开启一个定时器(每隔500毫秒让left+10)
      window.setInterval(function(){
        //判断flag1标记只要为true  +10 一直可以进行
        if(flag1 === true){
          // 每个500毫秒 +10
          oDivLeft+=10;
        }
        // 只要left值大于了可视区宽度  标记取反
        if(oDivLeft >= documentClientWidth){
          flag1 = false;
        }
        // 当oDiv达到最右侧   标记取反
        if(flag1 === false){
          oDivLeft-=10;
        }
        //只要left只小于等于0  标记取反
        if(oDivLeft<=0){
          flag1 = true;
        }
        // ====================================
        if(flag2 === true){
          // 每个500毫秒 +10
          oDivTop+=10;
        }
        // 只要left值大于了可视区宽度  标记取反
        if(oDivTop >= documentClientHeight){
          flag2 = false;
        }
        // 当oDiv达到最右侧   标记取反
        if(flag2 === false){
          oDivTop-=10;
        }
        //只要left只小于等于0  标记取反
        if(oDivTop<=0){
          flag2 = true;
        }
        console.log(oDivLeft);
        // 将结果重新赋值给当前oDiv的left属性即可
        oDiv.style.left = oDivLeft+'px';
        oDiv.style.top = oDivTop+'px';
      },100);
    </script>
  </body>
</html>

例:放大镜

function $(id) {
  return document.getElementById(id);
}
function getStyle(obj, name) {
  if (obj.currentStyle) { //兼容IE
    return obj.currentStyle[name];
  } else { //非IE
    return getComputedStyle(obj, false)[name];
  }
}
//封装可视区宽度和高度的一个方法
function client() {
  if (window.innerWidth != null) // ie9 +  最新浏览器
  {
    return {
      width: window.innerWidth,
      height: window.innerHeight
    }
  } else if (document.compatMode === "CSS1Compat") // 标准浏览器
  {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight
    }
  }
  return { // 怪异浏览器
    width: document.body.clientWidth,
    height: document.body.clientHeight
  }
}
/**
 * scroll()方法的封装
 */
function scroll() {
  //直接return一个json对象
  return {
    "left": window.pageXOffset || document.documentElement.left || document.body.scrollLeft,
    "top": window.pageYOffset || document.documentElement.top || document.body.scrollTop
  };
}
// 获得鼠标位置(兼容多浏览器ie,firefox)
function mouseCoords(ev) {
    if (ev.pageX || ev.pageY) {
    return {
      x: ev.pageX,
      y: ev.pageY
    };
    }
    return {
    x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
    y: ev.clientY + document.body.scrollTop - document.body.clientTop
    };
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
      /* 设置表格中的内容居中对齐 */
      table tr {
        text-align: center;
      }
      /* 设置img标签的边框 */
      table tr td img {
        border: 1px solid red;
      }
      /* 设置oDivImg的样式 */
      #oDivImg{
        position: absolute;
        display: none;
        left: 0px;
        top:0px;
      }
    </style>
    <!-- 引入js -->
    <script src="js/myjs.js" type="text/javascript" charset="utf-8"></script>
  </head>
  <body>
    <div id="oDivImg">
      <img src="img/show1_big.jpg" alt="">
    </div>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
      <tr>
        <td colspan="5"><img id="bigImg" src="img/show1_big.jpg" alt=""></td>
      </tr>
      <tr>
        <td><img name = "smallImg" src="img/show1.jpg" alt=""></td>
        <td><img name = "smallImg" src="img/show2.jpg" alt=""></td>
        <td><img name = "smallImg" src="img/show3.jpg" alt=""></td>
        <td><img name = "smallImg" src="img/show4.jpg" alt=""></td>
        <td><img name = "smallImg" src="img/show5.jpg" alt=""></td>
      </tr>
    </table>
    <!-- js区域 -->
    <script type="text/javascript">
      // 定义数组  保存所有大图片的名称
      var bigImgs = [
        "img/show1_big.jpg",
        "img/show2_big.jpg",
        "img/show3_big.jpg",
        "img/show4_big.jpg",
        "img/show5_big.jpg"
      ];
      // 1.当鼠标触碰小图片时  边框  变换
      // (1)获取name属性为smallImg的所有图片标签
      var samllImgs = document.getElementsByName('smallImg');
      // 获取大图片img对象
      var bigImg = document.getElementById('bigImg');
      // 获取oDivImg标签
      var oDivImg = document.getElementById('oDivImg');
      // (2)遍历为每一个小图片标签设置onmouseover  onmouseout事件
      for(var i = 0;i<samllImgs.length;i++){
        samllImgs[i].setAttribute('index',i);
        // 2.当鼠标触碰小图片时  大图片  变换
        samllImgs[i].onmouseover = function(event){
          this.style.border = "1px solid yellow";
          bigImg.src = bigImgs[this.getAttribute('index')];//5
          // 当鼠标触碰小图片时,隐藏的div显示
          oDivImg.style.display = 'block';
          // 每一个函数中参数都有一个事件对象属性  event
          // 可以通过event对象获取鼠标的位置
          // alert(event.pageX+"   "+event.pageY);
          // oDivImg.style.left = (event.pageX+30)+"px";
          // oDivImg.style.top = (event.pageY+30)+"px";
          // 兼容性处理鼠标获取的位置
          event = event || window.event;
          var demo = mouseCoords(event);
          // alert(demo)
          oDivImg.style.left = (demo.x)+'px'
          oDivImg.style.top = (demo.y)+'px'
        };
        samllImgs[i].onmouseout = function(){
          this.style.border = "1px solid red";
          oDivImg.style.display = 'none';
        };
      }
      // 3.当鼠标触碰小图片时  隐藏的div图片也要显示 (鼠标右下角位置)
    </script>
  </body>
</html>
相关文章
|
2月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
5月前
|
数据采集 Web App开发 JavaScript
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
|
2月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
50 3
|
2月前
|
JavaScript 前端开发 安全
JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择
本文深入探讨了JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择。JavaScript以其灵活性和广泛的生态支持著称,而TypeScript通过引入静态类型系统,提高了代码的可靠性和可维护性,特别适合大型项目。文章还讨论了结合使用两种语言的优势,以及如何根据项目需求和技术背景做出最佳选择。
64 4
|
2月前
|
JavaScript 前端开发 API
Vue.js与Angular的优劣分析
Vue.js和Angular都是非常流行的JavaScript框架,它们在构建现代Web应用程序方面各有优劣
|
2月前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
63 4
|
2月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
351 9
|
2月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
60 1
|
2月前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
48 1
|
3月前
|
数据采集 JSON 前端开发
JavaScript逆向爬虫实战分析
JavaScript逆向爬虫实战分析
47 4