JavaScript Web API入门day6

news2024/12/27 12:11:22

目录

1.正则表达式

1.1 什么是正则表达式

1.2 语法

1.3 元字符

1.3.1 边界符

1.3.2 量词

1.3.3 字符类

1.4 修饰符

1.5 案例

2.综合案例

2.1 小兔鲜页面注册

2.2 小兔鲜登录页面

2.3 小兔鲜首页页面


1.正则表达式

1.1 什么是正则表达式

正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。
在 JavaScript中,正则表达式也是对象。
正则表达式在 JavaScript中的使用场景:
  • Ø 表单验证(匹配
  • Ø 过滤敏感词(替换
  • Ø 字符串中提取我们想要的部分(提取

1.2 语法

正则同样道理,分为两步:
  • 1. 定义规则
  • 2. 查找

1. 定义正则表达式语法:

其中 / / 是正则表达式字面量
2.判断是否有符合规则的字符串:
test() 方法 用来查看正则表达式与指定的字符串是否匹配
例如:
3.检索(查找)符合规则的字符串:
exec() 方法 在一个指定字符串中执行一个搜索匹配
比如:
注意事项:
正则表达式检测查找 test方法和exec方法有什么区别?
  • Ø test方法 用于判断是否有符合规则的字符串,返回的是 布尔值 找到返回true,否则false
  • Ø exec方法用于检索(查找)符合规则的字符串,找到返 回数组,否则为 null

1.3 元字符

目标:能说出什么是元字符以及它的好处
普通字符:
大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。
也就是说普通字符只能够匹配字符串中与它们相同的字符。
元字符(特殊字符)
是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。
Ø 比如,规定用户只能输入英文26个英文字母,普通字符的话 abcdefghijklm…..
Ø 但是换成元字符写法: [a-z]
优势:是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能
元字符分类:
  • Ø 边界符(表示位置,开头和结尾,必须用什么开头,用什么结尾)
  • Ø 量词 (表示重复次数)
  • Ø 字符类 (比如 \d 表示 0~9)

1.3.1 边界符

正则表达式中的边界符(位置符)用来 提示字符所处的位置 ,主要有两个字符

注意:如果 ^ 和 $ 在一起,表示必须是精确匹配。

1.3.2 量词

量词用来  设定某个模式出现的次数

注意: 逗号左右两侧千万不要出现空格

1.3.3 字符类

(1) [ ] 匹配字符集合
后面的字符串只要包含 abc 中 任意 一个字符 ,都返回 true 。
(2)  [ ] 里面加上 - 连字符
使用连字符 - 表示一个范围
比如:
  • Ø [a-z] 表示 a 到 z 26个英文字母都可以
  • Ø [a-zA-Z] 表示大小写都可以
  • Ø [0-9] 表示 0~9 的数字都可以

(3) [ ] 里面加上 ^ 取反符号
比如:
  • Ø [^a-z] 匹配除了小写字母以外的字符
  • Ø 注意要写到中括号里面

(4) [ ]里面加 . 匹配除换行符之外的任何单个字符

用户名验证案例
需求:用户名要求用户英文字母,数字,下划线或者短横线组成,并且用户名长度为 6~16位
分析:
  • ①:首先准备好这种正则表达式模式 /^[a-zA-Z0-9-_]{6,16}$/
  • ②:当表单失去焦点就开始验证.
  • ③:如果符合正则规范, 则让后面的span标签添加 right 类.
  • ④:如果不符合正则规范, 则让后面的span标签添加 wrong 类.

 代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        span {
            display: inline-block;
            width: 250px;
            height: 30px;
            vertical-align: middle;
            line-height: 30px;
            padding-left: 15px;
        }

        .error {
            color: red;
            background: url(./images/error1.png) no-repeat left center;
        }

        .right {
            color: green;
            background: url(./images/right.png) no-repeat left center;
        }
    </style>
</head>

<body>
    <input type="text">
    <span></span>
    <script>
        const input = document.querySelector('input')
        const span = input.nextElementSibling
        const reg = /^[a-zA-Z0-9-_]{6,16}$/
        input.addEventListener('blur', function () {
            if (reg.test(this.value)) {
                span.innerHTML = '输入正确'
                span.className = 'right'
            } else {
                span.innerHTML = '请输入6到16个字符的英文数字下划线'
                span.className = 'error'
            }
        })
    </script>
</body>

</html>

(5). 预定义, 指的是 某些常见模式的简写方式。

1.4 修饰符

修饰符约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等
语法:

  • Ø i 是单词 ignore 的缩写,正则匹配时字母不区分大小写
  • Ø g 是单词 global 的缩写,匹配所有满足正则表达式的结果

注意事项:如果没有加g,一般都是只匹配第一个满足表达式的结果。

替换 replace 替换
语法:

1.5 案例

过滤敏感字
需求:要求用户不能输入敏感字 ,比如,pink老师上课很有**
分析:
①:用户输入内容
②:内容进行正则替换查找,找到敏感词,进行**
③:要全局替换使用修饰符 g
代码:
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <textarea name="" id="" cols="30" rows="10"></textarea>
  <button>发布</button>
  <div></div>
  <script>
    const tx = document.querySelector('textarea')
    const btn = document.querySelector('button')
    const div = document.querySelector('div')
    btn.addEventListener('click', function () {
      // console.log(tx.value)
      div.innerHTML = tx.value.replace(/激情|基情/g, '**')
      tx.value = ''
    })
  </script>
</body>

</html>

2.综合案例

2.1 小兔鲜页面注册

效果图:
分析业务模块:
①: 发送验证码模块
  • 用户点击之后,显示 05秒后重新获取
  • 时间到了,自动改为 重新获取
②: 各个表单验证模块
  • 用户名验证(注意封装函数 verifyxxx) , 失去焦点触发这个函数
    • 正则 /^[a-zA-Z0-9-_]{6,10}$/
    • 如果不符合要求,则出现提示信息 并 return false 中断程序
    • 否则 则返回return true
    • 之所以返回 布尔值,是为了最后的提交按钮做准备 侦听使用change事件,当鼠标离开了表单,并且表单值发生了变化时触发(类似京东效果)
  • 手机号验证
    • 正则: /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$/ ,其余同上
  • 验证码验证
    • 正则 /^\d{6}$/ ,其余同上
  • 密码验证
    • 正则 /^[a-zA-Z0-9-_]{6,20}$/ ,其余同上

  • 再次密码验证
    • 如果本次密码不等于上面输入的密码则返回错误信息 ,其余同上
  • 我同意模块
    • 添加类 .icon-queren2 则是默认选中样式 可以使用 toggle切换类
③: 勾选已经阅读同意模块
④: 下一步验证全部模块,只要上面有一个input验证不通过就不同意提交
  • 使用 submit 提交事件
  • 如果没有勾选同意协议,则提示 需要勾选
  • classList.contains() 看看有没有包含某个类,如果有则返回true,么有则返回false
  • 如果上面input表单 只要有模块,返回的是 false 则 阻止提交

代码:

<script>
    /* 1.发送验证码 */
    //1.1获取发送验证码
    const a = document.querySelector('.code')

    //定义一个变量,防止获取验证码时重复点击出现的bug
    let flat = true

    //1.2注册点击事件
    a.addEventListener('click', function () {
      if (flat) {
        //要先变为false
        flat = false
        let i = 5
        //保证不会延迟一秒
        a.innerHTML = `0${i}秒后重新获取`
        //开启计时器
        let num = setInterval(function () {
          i--
          a.innerHTML = `0${i}秒后重新获取`

          if (i === 0) {
            //关闭计时器
            clearInterval(num)
            //重新获取验证码
            a.innerHTML = '重新获取'
            //倒计时结束,才允许给重新获取
            flat = true
          }
        }, 1000)
      }

    })

    /* 2.用户名验证 */
    //2.1 获取对象
    const username = document.querySelector('[name=username]')

    //2.2 注册变化事件
    username.addEventListener('change', verifyName)

    //2.3 封装函数
    function verifyName() {
      //正则
      const reg = /^[a-zA-Z0-9-_]{6,10}$/
      const span = username.nextElementSibling
      //不合法
      if (!reg.test(username.value)) {
        //提示用户
        span.innerHTML = '输入不合法,请输入6~10位'
        return false
      }

      //合法
      span.innerHTML = ''
      return true
    }


    /* 3.手机号码验证 */
    //3.1 获取对象
    const phone = document.querySelector('[name=phone]')

    //3.2 注册变化事件
    phone.addEventListener('change', verifyPhone)

    //3.3 封装函数
    function verifyPhone() {
      //正则
      const reg = /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$/
      const span = phone.nextElementSibling
      //不合法
      if (!reg.test(phone.value)) {
        //提示用户
        span.innerHTML = '输入不合法,请输入正确的11位手机号码'
        return false
      }

      //合法
      span.innerHTML = ''
      return true
    }



    /* 4.验证码验证 */
    //4.1 获取对象
    const code = document.querySelector('[name=code]')

    //4.2 注册变化事件
    code.addEventListener('change', verifyCode)

    //4.3 封装函数
    function verifyCode() {
      //正则
      const reg = /^\d{6}$/
      const span = code.nextElementSibling
      //不合法
      if (!reg.test(code.value)) {
        //提示用户
        span.innerHTML = '请输入6位数字的验证码'
        return false
      }

      //合法
      span.innerHTML = ''
      return true
    }



    /* 5.密码验证 */
    //5.1 获取对象
    const password = document.querySelector('[name=password]')

    //5.2 密码验证变化
    password.addEventListener('change', verifyPassword)

    //5.3 封装函数
    function verifyPassword() {
      //正则
      const reg = /^[a-zA-Z0-9-_]{6,20}$/
      const span = password.nextElementSibling
      //不合法
      if (!reg.test(password.value)) {
        //提示用户
        span.innerHTML = '请输入6~20位的密码'
        return false
      }

      //合法
      span.innerHTML = ''
      return true
    }


    /* 6.密码再次验证 */
    //6.1 获取对象
    const confirm = document.querySelector('[name=confirm]')

    //6.2 注册变化事件
    confirm.addEventListener('change', verifyConfirm)

    //6.3 封装函数
    function verifyConfirm() {
      const span = confirm.nextElementSibling
      //不合法
      if (confirm.value !== password.value) {
        //提示用户
        span.innerHTML = '如果本次密码不等于上面输入的密码'
        return false
      }

      //合法
      span.innerHTML = ''
      return true
    }



    /* 6.我同意模块 */
    // 6.1 获取对象
    const queren = document.querySelector('.icon-queren')
    queren.addEventListener('click', function () {
      //切换类     有的类就删除,没有就添加
      this.classList.toggle('icon-queren2')
    })


    /* 7.提交模块 */
    // 7.1 获取对象
    const form = document.querySelector('form')
    // 7.2 点击事件
    form.addEventListener('submit', function (e) {
      //如果没有同意则给予提示信息
      if (!queren.classList.contains('icon-queren2')) {
        alert('请先同意协议')
        //取消自动提交
        e.preventDefault()
      }

      // 如果这样写,直接提交会显示信息不全
      // // 依次判断表单是否合法,不合法就阻止页面提交表单信息
      // if (!verifyName() || !verifyPhone() || !verifyCode() || !verifyPassword() || !verifyConfirm()) {
      //   // 阻止页面提交s
      //   e.preventDefault()
      // }

      // 这样写,可以看到全部提示信息
      if (!verifyName()) e.preventDefault()
      if (!verifyPhone()) e.preventDefault()
      if (!verifyCode()) e.preventDefault()
      if (!verifyPassword()) e.preventDefault()
      if (!verifyConfirm()) e.preventDefault()
    })
  </script>

2.2 小兔鲜登录页面

需求①: tab切换

需求②: 点击登录可以跳转页面
  • Ø 先阻止默认行为
  • Ø 如果没有勾选同意,则提示要勾选
  • Ø required 属性不能为空
  • Ø 假设登录成功
  • 把用户名记录到本地存储中
  • 同时跳转到首页 location.href

效果图:

代码:

<script>
    /* 1.点击下划线显示和切换显示 */
    // 获取对象
    const tab_nav = document.querySelector('.tab-nav')
    const pane = document.querySelectorAll('.tab-pane')

    // 注册点击事件
    tab_nav.addEventListener('click', function (e) {
      if (e.target.tagName === 'A') {
        // console.log(11);
        // 排他思想
        document.querySelector('.tab-nav .active').classList.remove('active')
        e.target.classList.add('active')

        //遍历pane(切换图片)
        for (let i = 0; i < pane.length; i++) {
          // 都先取消选择
          pane[i].style.display = 'none'
        }

        //再根据当前选择的对象显示信息
        pane[e.target.dataset.id].style = 'block'
      }
    })

    /* 2.提交事件 */
    // 获取对象
    const form = document.querySelector('form')
    const agree = document.querySelector('[name=agree]')
    const username = document.querySelector('[name=username]')


    // 注册点击事件
    form.addEventListener('submit', function (e) {
      // 阻止页面自动提交
      e.preventDefault()

      // 只有同意协议,才允许跳转页面
      if (!agree.checked) {
        return alert('请先同意协议')
      }

      // 添加本地存储
      localStorage.setItem('username', username.value)
      //页面跳转
      location.href = './index.html'
    })

  </script>

2.3 小兔鲜首页页面

需求:
  • 1. 从登录页面跳转过来之后,自动显示用户名
  • 2. 如果点击退出,则不显示用户名

步骤:
最好写个 渲染函数 ,因为一会的退出还需要用到
①:如果本地存储有记录的用户名, 读取本地存储数据
需要把用户名写到 第一个li里面
格式: <a href="javascript:;"><i class="iconfont icon-user"> pink老师</i></a>
因为登录了,所以第二个 里面的文字变为,退出登录
格式: <a href="javascript:;">退出登录</a>
②:如果本地存储没有数据,则复原为默认的结构
③: 点击 退出登录
删除本地存储对应的用户名数据
重新调用渲染函数即可

效果图:

代码:

<script>

    /* 1.显示用户名 */
    // 获取对象
    const li1 = document.querySelector('.xtx_navs li:first-child')
    const li2 = li1.nextElementSibling

    //渲染函数
    function render() {

      const username = localStorage.getItem('username')

      //获取本地存储的用户名
      if (username) {
        li1.innerHTML = `
        <a href="javascript:;"><i class="iconfont icon-user">${username} </i></a>`

        li2.innerHTML = `<a href="javascript:;">退出登录</a>`
      } else {
        li1.innerHTML = '<a href="./login.html">请先登录</a>'
        li2.innerHTML = '<a href="./register.html">免费注册</a>'

      }

    }
    //调用函数,渲染页面
    render()

    /* 2.点击退出登录 */
    //2.1删除本地存储对应的用户名数据
    li2.addEventListener('click', function () {
      localStorage.removeItem('username')
      // console.log(11)

      //2.2重新调用渲染函数即可
      render()
    })


  </script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chapter 12 Vue CLI脚手架组件化开发

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、项目目录结构二、组件化开发1. 组件化2. Vue 组件的基本结构3. 依赖包less & less-loader 前言 组件化开发是Vue.js的核心理念之一&#xff0c;Vue CLI为开发者提…

会声会影哪个版本最新

会声会影2023永久免费版能通过多种不同的特效的添加和项目的编辑和处理&#xff0c;能迅速的帮助用户能实现多种不同格式下的结果的提升&#xff0c;让用户能直接的完成相应的帮助和完善提升。 会声会影2023永久免费版简介&#xff1a; 会声会影2023永久免费版是一款简单的视频…

多模态在京东内容算法上的应用

多模态在京东内容算法上的应用 作者&#xff1a;京东零售技术 2024-09-04 北京 本文字数&#xff1a;5226 字 阅读完需&#xff1a;约 17 分钟 本文作者唐烨参与 DataFunsummit2024&#xff1a;推荐系统架构峰会&#xff0c;在专题【多模态推荐论坛】中分享了多模态算法在京…

如何在Word中插入复选框

如何在Word中插入复选框&#xff1a;详细教程与技巧 在Word中插入复选框是一项非常实用的技巧&#xff0c;尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时&#xff0c;复选框不仅能提高文档的功能性&#xff0c;还能显得更加专业。本文将详细讲解…

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉&#xff1a;生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐&#xff08;Biten et al.&#xff0c;2022&#xff09;或通过数据增强减少对象共现模…

各类AI工具编程能力测试对比

各类AI工具编程能力对比 现在各类AI工具火爆&#xff0c;擅长各类问题解决&#xff0c;闲来无事&#xff0c;验证下各类AI工具的编程能力如何。问题&#xff1a;c 实现杨辉三角&#xff0c;并main函数测试 kimi 对话窗口输入问题&#xff0c;得到了c的完整程序&#xff1a; …

JS面试真题 part2

JS面试真题 part2 6、typeof 与 instanceof 区别7、JavaScript原型&#xff0c;原型链&#xff1f;有什么特点8、说说你对作用域链的理解9、谈谈this对象的理解10、说说new操作符具体干了什么 6、typeof 与 instanceof 区别 自己回答&#xff1a; typeof&#xff1a;用来判断数…

SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …

数字证书与公钥基础设施

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;数字证书 数字证书是由第三方可信机构&#xff08;一般是证书服务器&#xff09;颁发的数字证书&#xff0c;可以证明身份的可信度。 数字证书具有以下特点以及性质&#xff1a…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式&#xff08;一&#xff09;程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例…

树状数组记录

树状数组&#xff08;Fenwick Tree&#xff09;是一种用于维护数组前缀和的数据结构&#xff0c;支持高效的单点更新和区间查询操作。它的查询和更新时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)&#xff0c;适用于需要频繁更新和查询的场景。 树状数组的基本操作 单点更…

HCIA--实验五:静态路由综合实验

静态路由综合实验 一、实验内容&#xff1a; 1.需求/目的&#xff1a; 在ensp模拟器中使用四个路由器&#xff0c;并且在路由器上创建loopback接口&#xff0c;相当于连接了一台主机&#xff0c;通过配置静态路由的方式实现全网通。 二、实验过程 1.道具&#xff1a; 4个…

基于 AC 驱动的电容结构 GaN LED 模型开发和应用

随着芯片尺寸减小&#xff0c;微小尺寸GaN 基 Micro LED 显示面临着显示与驱动高密度集成的难题&#xff0c;传统直流&#xff08;DC&#xff09;驱动技术会导致结温上升&#xff0c;降低器件寿命。南京大学团队创新提出交流&#xff08;AC&#xff09;驱动的单电极 LED&#x…

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类 class User(UserMixin):def __init__(self, id):self.id idapp.route(/login) def login():# 模拟用户登录过程user User(1)login_user(user)from flask…

openconnect-gui for qt 避坑指南

构建mingw_32 的时候 cmake居然识别的是vc 一直改不了 &#xff0c;一直到卸载qt重装 编译release 模式tap-win 下载一直不成功 修改cmake文件&#xff08;手动下载下来&#xff09;

智慧农业-自动化如何塑造农业的未来

全球人口的增长和气候变化对农业生产的持续影响&#xff0c;传统农业面临非常大的考验。为了保证农业效率、减少资源浪费和应对环境破坏&#xff0c;智能农业&#xff08;Smart Agriculture&#xff09;已成为未来农业发展的关键趋势。但在智能农业的诸多技术中&#xff0c;自动…

【OpenMV】AprilTag 机器视觉定位技术详解

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

C++开发基础之自定义异步日志库实现及性能测试

1. 前言 在软件开发中&#xff0c;日志记录是一个必不可少的部分。通过日志&#xff0c;我们可以记录系统的运行状态、错误信息以及调试数据。然而&#xff0c;当系统的日志量很大时&#xff0c;日志写入操作可能会影响系统的性能&#xff0c;尤其是在 I/O 操作较为频繁的情况…

VR虚拟展厅的应用场景有哪些?

虚拟展厅作为一种利用虚拟现实技术构建的三维展示空间&#xff0c;其应用场景广泛且多样。视创云展为企业虚拟展厅搭建提供技术支持。以下是一些主要的应用场景&#xff1a; 1. 博物馆和艺术展览 文物保护与展示&#xff1a; 在博物馆中&#xff0c;为了保护珍贵的文物和艺术…