小工具知识网

当前位置: 首页 > 行业知识 > 【web APIs】6、(学习笔记)有案例!

行业知识

【web APIs】6、(学习笔记)有案例!

2026-10-29 14:14:17 来源:互联网转载

���示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • 一、正则表达式
      • 正则基本使用
      • 元字符
        • 边界符
        • 量词
        • 范围
        • 字符类
        • 二、替换和修饰符
        • 三、正则插件
        • change 事件
        • 判断是否有类
        • 四、案例举例
            • 学生就业信息表
            • 用户注册界面
            • 用户登录界面
            • 顶部导航显示登录人信息
            • 放大镜效果

              前言

              • 正则表达式
              • 综合案例
              • 阶段案例

                一、正则表达式

                正则表达式(Regular Expression)是一种字符串匹配的模式(规则)

                使用场景:

                • 例如 验证表单:手机号表单要求用户只能输入11位的数字 (匹配)
                • 过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等

                  正则基本使用

                  1. 定义规则

                    const reg =  /表达式/
                    • 其中/ /是正则表达式字面量
                    • 正则表达式也是对象
                    • 使用正则

                      • test()方法 用来查看正则表达式与指定的字符串是否匹配
                      • 如果正则表达式与指定的字符串匹配 ,返回true,否则false
                        // 正则表达式的基本使用    const str = 'web前端开发'    // 1. 定义规则    const reg = /web/    // 2. 使用正则  test()    console.log(reg.test(str))  // true  如果符合规则匹配上则返回true    console.log(reg.test('java开发'))  // false  如果不符合规则匹配上则返回 false  

                  元字符

                  1. 普通字符:
                  • 大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。
                  • 普通字符只能够匹配字符串中与它们相同的字符。
                  • 比如,规定用户只能输入英文26个英文字母,普通字符的话 /[abcdefghijklmnopqrstuvwxyz]/
                    1. 元字符(特殊字符)
                    • 是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。
                    • 比如,规定用户只能输入英文26个英文字母,换成元字符写法: /[a-z]/
                      边界符

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

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

                            // 元字符之边界符    // 1. 匹配开头的位置 ^    const reg = /^web/    console.log(reg.test('web前端'))  // true    console.log(reg.test('前端web'))  // false    console.log(reg.test('前端web学习'))  // false    console.log(reg.test('we'))  // false    // 2. 匹配结束的位置 $    const reg1 = /web$/    console.log(reg1.test('web前端'))  //  false    console.log(reg1.test('前端web'))  // true    console.log(reg1.test('前端web学习'))  // false    console.log(reg1.test('we'))  // false      // 3. 精确匹配 ^ $    const reg2 = /^web$/    console.log(reg2.test('web前端'))  //  false    console.log(reg2.test('前端web'))  // false    console.log(reg2.test('前端web学习'))  // false    console.log(reg2.test('we'))  // false     console.log(reg2.test('web'))  // true    console.log(reg2.test('webweb'))  // flase   
                      量词

                      量词用来设定某个模式重复次数

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

                            // 元字符之量词    // 1. * 重复次数 >= 0 次    const reg1 = /^w*$/    console.log(reg1.test(''))  // true    console.log(reg1.test('w'))  // true    console.log(reg1.test('ww'))  // true    console.log('-----------------------')    // 2. + 重复次数 >= 1 次    const reg2 = /^w+$/    console.log(reg2.test(''))  // false    console.log(reg2.test('w'))  // true    console.log(reg2.test('ww'))  // true    console.log('-----------------------')    // 3. ? 重复次数  0 || 1     const reg3 = /^w?$/    console.log(reg3.test(''))  // true    console.log(reg3.test('w'))  // true    console.log(reg3.test('ww'))  // false    console.log('-----------------------')    // 4. {n} 重复 n 次    const reg4 = /^w{3}$/    console.log(reg4.test(''))  // false    console.log(reg4.test('w'))  // flase    console.log(reg4.test('ww'))  // false    console.log(reg4.test('www'))  // true    console.log(reg4.test('wwww'))  // false    console.log('-----------------------')    // 5. {n,} 重复次数 >= n     const reg5 = /^w{2,}$/    console.log(reg5.test(''))  // false    console.log(reg5.test('w'))  // false    console.log(reg5.test('ww'))  // true    console.log(reg5.test('www'))  // true    console.log('-----------------------')    // 6. {n,m}   n =         `      })      tbody.innerHTML = new_data.join('');    }    //del删除事件(借助自定义属性)    const tbody = document.querySelector('tbody')    tbody.addEventListener('click', function (e) {      if (e.target.tagName === 'A') {        arr.splice(e.target.dataset.id, 1)         //arr  render里面的new_data是添加在tbody里面        localStorage.removeItem('data', JSON.stringify(arr[e.target.dataset.id]))        render()        localStorage.setItem('data', JSON.stringify(arr))      }    })  

                      用户注册界面

                      验证码模块;用户名、手机号、密码等验证模块;同意服务协议模块;表达提交模块。

                          (function () {      // 1. 发送短信验证码模块      const code = document.querySelector('.code')      let flag = true  // 通过一个变量来控制   节流阀       //  1.1 点击事件      code.addEventListener('click', function () {        if (flag) {          // 取反了,不能马上第二次点击          flag = false          let i = 5          // 点击完毕之后立马触发          code.innerHTML = `0${i}秒后重新获取`          // 开启定时器          let timerId = setInterval(function () {            i--            code.innerHTML = `0${i}秒后重新获取`            if (i === 0) {              // 清除定时器              clearInterval(timerId)              // 从新获取              code.innerHTML = `重新获取`              // 到时间了,可以开启 flag了              flag = true            }          }, 1000)        }      })    })();    // 2. 验证的是用户名    // 2.1 获取用户名表单    const username = document.querySelector('[name=username]')    // 2.2 使用change事件  值发生变化的时候    username.addEventListener('change', verifyName)    // 2.3 封装verifyName函数    function verifyName() {      // console.log(11)      const span = username.nextElementSibling      // 2.4 定规则  用户名      const reg = /^[a-zA-Z0-9-_]{6,10}$/      if (!reg.test(username.value)) {        // console.log(11)        span.innerText = '输入不合法,请输入6~10位'        return false      }      // 2.5 合法的 就清空span      span.innerText = ''      return true    }    // 3. 验证的是手机号    // 2.1 获取手机表单    const phone = document.querySelector('[name=phone]')    // 2.2 使用change事件  值发生变化的时候    phone.addEventListener('change', verifyPhone)    // 2.3 verifyPhone    function verifyPhone() {      // console.log(11)      const span = phone.nextElementSibling      // 2.4 定规则  用户名      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}$/      if (!reg.test(phone.value)) {        // console.log(11)        span.innerText = '输入不合法,请输入正确的11位手机号码'        return false      }      // 2.5 合法的 就清空span      span.innerText = ''      return true    }    // 4. 验证的是验证码    // 4.1 获取验证码表单    const codeInput = document.querySelector('[name=code]')    //4.2 使用change事件  值发生变化的时候    codeInput.addEventListener('change', verifyCode)    // 4.3 verifyPhone    function verifyCode() {      // console.log(11)      const span = codeInput.nextElementSibling      // 4.4 定规则  验证码      const reg = /^\d{6}$/      if (!reg.test(codeInput.value)) {        // console.log(11)        span.innerText = '输入不合法,6 位数字'        return false      }      // 4.5 合法的 就清空span      span.innerText = ''      return true    }    // 5. 验证的是密码框    // 5.1 获取密码表单    const password = document.querySelector('[name=password]')    //5.2 使用change事件  值发生变化的时候    password.addEventListener('change', verifyPwd)    // 5.3 verifyPhone    function verifyPwd() {      // console.log(11)      const span = password.nextElementSibling      // 5.4 定规则  密码      const reg = /^[a-zA-Z0-9-_]{6,20}$/      if (!reg.test(password.value)) {        // console.log(11)        span.innerText = '输入不合法,6~20位数字字母符号组成'        return false      }      // 5.5 合法的 就清空span      span.innerText = ''      return true    }    // 6. 密码的再次验证    // 6.1 获取再次验证表单    const confirm = document.querySelector('[name=confirm]')    //6.2 使用change事件  值发生变化的时候    confirm.addEventListener('change', verifyConfirm)    // 6.3 verifyPhone    function verifyConfirm() {      // console.log(11)      const span = confirm.nextElementSibling      // 6.4 当前表单的值不等于 密码框的值就是错误的      if (confirm.value !== password.value) {        // console.log(11)        span.innerText = '两次密码输入不一致'        return false      }      // 6.5 合法的 就清空span      span.innerText = ''      return true    }    // 7. 我同意    const queren = document.querySelector('.icon-queren')    queren.addEventListener('click', function () {      // 切换类  原来有的就删掉,原来没有就添加      this.classList.toggle('icon-queren2')    })    // 8. 提交模块    const form = document.querySelector('form')    form.addEventListener('submit', function (e) {      // 判断是否勾选我同意模块 ,如果有 icon-queren2说明就勾选了,否则没勾选      if (!queren.classList.contains('icon-queren2')) {        alert('请勾选同意协议')        // 阻止提交        e.preventDefault()      }      // 依次判断上面的每个框框 是否通过,只要有一个没有通过的就阻止      // console.log(verifyName())      if (!verifyName()) e.preventDefault()      if (!verifyPhone()) e.preventDefault()      if (!verifyCode()) e.preventDefault()      if (!verifyPwd()) e.preventDefault()      if (!verifyConfirm()) e.preventDefault()    })  

                      用户登录界面

                      tab栏切换;表单提交模块并存储localStorage;location跳转首页

                          // 1. tab栏切换  事件委托    const tab_nav = document.querySelector('.tab-nav')    const pane = document.querySelectorAll('.tab-pane')    // 1.1 事件监听    tab_nav.addEventListener('click', function (e) {      if (e.target.tagName === 'A') {        // 取消上一个active        tab_nav.querySelector('.active').classList.remove('active')        // 当前元素添加active        e.target.classList.add('active')        // 先干掉所有人  for循环        for (let i = 0; i  

                      顶部导航显示登录人信息

                      从本地存储获取信息;退出登录模块并删除本地存储的数据

                          // 1、 获取第一个小li    const li1 = document.querySelector('.xtx_navs li:first-child')    const li2 = li1.nextElementSibling    // 2. 最好做个渲染函数 因为退出登录需要重新渲染    function render() {      // 2.1 读取本地存储的用户名      const uname = localStorage.getItem('xtx-uname')      // console.log(uname)      if (uname) {        li1.innerHTML = `${uname          }        `        li2.innerHTML = '退出登录'      } else {        li1.innerHTML = '请先登录'        li2.innerHTML = '免费注册'      }    }    render()  // 调用函数    // 2. 点击退出登录模块    li2.addEventListener('click', function () {      // 删除本地存储的数据      localStorage.removeItem('xtx-uname')      // 重新渲染      render()    })  

                      放大镜效果

                      //三个图的故事    (function () {      // 1. 获取三个盒子      // 2. 小盒子 图片切换效果      const small = document.querySelector('.small')      //  中盒子      const middle = document.querySelector('.middle')      //  大盒子      const large = document.querySelector('.large')      // 2. 事件委托      small.addEventListener('mouseover', function (e) {        if (e.target.tagName === 'IMG') {          // console.log(111)          // 排他 干掉以前的 active  li 上面          this.querySelector('.active').classList.remove('active')          // 当前元素的爸爸添加 active          e.target.parentNode.classList.add('active')          // 拿到当前小图片的 src          // console.log(e.target.src)          // 让中等盒子里面的图片,src 更换为   小图片src          middle.querySelector('img').src = e.target.src          // 大盒子更换背景图片          large.style.backgroundImage = `url(${e.target.src})`        }      })      // 3. 鼠标经过中等盒子, 显示隐藏 大盒子      middle.addEventListener('mouseenter', show)      middle.addEventListener('mouseleave', hide)      let timeId = null      // 显示函数 显示大盒子      function show() {        // 先清除定时器        clearTimeout(timeId)        large.style.display = 'block'      }      // 隐藏函数 隐藏大盒子      function hide() {        timeId = setTimeout(function () {          large.style.display = 'none'        }, 200)      }      // 4. 鼠标经过大盒子, 显示隐藏 大盒子      large.addEventListener('mouseenter', show)      large.addEventListener('mouseleave', hide)      // 5. 鼠标经过中等盒子,显示隐藏 黑色遮罩层      const layer = document.querySelector('.layer')      middle.addEventListener('mouseenter', function () {        layer.style.display = 'block'      })      middle.addEventListener('mouseleave', function () {        layer.style.display = 'none'      })      // 6.移动黑色遮罩盒子      middle.addEventListener('mousemove', function (e) {        // let x = 10, y = 20        // console.log(11)        // 鼠标在middle 盒子里面的坐标 = 鼠标在页面中的坐标 - middle 中等盒子的坐标        // console.log(e.pageX)鼠标在页面中的坐标        // middle 中等盒子的坐标        // console.log(middle.getBoundingClientRect().left)        let x = e.pageX - middle.getBoundingClientRect().left        let y = e.pageY - middle.getBoundingClientRect().top - document.documentElement.scrollTop        // console.log(x, y)        // 黑色遮罩移动 在 middle 盒子内 限定移动的距离        if (x >= 0 && x = 0 && y           // 黑色盒子不是一直移动的          // 声明2个变量 黑色盒子移动的 mx my变量           let mx = 0, my = 0          if (x = 100 && y  300) my = 200          layer.style.left = mx + 'px'          layer.style.top = my + 'px'          // 大盒子的背景图片要跟随 中等盒子移动  存在的关系是 2倍             large.style.backgroundPositionX = -2 * mx + 'px'          large.style.backgroundPositionY = -2 * my + 'px'        }      })    })();    

上一篇:怎么查询电脑软件服务器?

下一篇:小霸王站群深度解析,性能、特色与优势全攻略!