js WebAPI黑马条记(万字速通)

打印 上一主题 下一主题

主题 1734|帖子 1734|积分 5202

此条记来自于黑马程序员,pink老师yyds
复习:
splice() 方法用于添加或删除数组中的元素。
注意: 这种方法会改变原始数组。

  • 删除数组:
splice(起始位置, 删除的个数)
比如:1
  1. let arr = ['red', 'green', 'blue']
  2. arr.splice(1,1) // 删除green元素
  3. console.log(arr) // ['red, 'blue']
复制代码

  • 添加元素
splice(起始位置,删除个数,添加数组元素)
  1. let arr = ['red', 'green', 'blue']
  2. //arr.splice(1, 0, 'pink') // 在索引号是1的位置添加 pink
  3. //console.log(arr) // ['red', 'pink', 'green', 'blue']
  4. arr.splice(1, 0, 'pink', 'hotpink') // 在索引号是1的位置添加 pink  hotpink
  5. console.log(arr) // ['red', 'pink', 'hotpink', 'green', 'blue']
复制代码
Web APIs - 第1天条记

   了解 DOM 的结构并把握其基本的操作,体验 DOM 的在开发中的作用
  

  • 知道 ECMAScript 与 JavaScript 的关系
  • 了解 DOM 的相关概念及DOM 的本质是一个对象
  • 把握查找节点的基本方法
  • 把握节点属性和文本的操作
  • 能够使用间歇函数创建定时任务
介绍

   知道 ECMAScript 与 JavaScript 的关系,Web APIs 是浏览器扩展的功能。
  严酷意义上讲,我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系,ECMAScript 简称 ES 它提供了一套语言尺度规范,如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECMAScript 大部分的规范加以实现,并且在此基础上又扩展一些实用的功能,这些被扩展出来的内容我们称为 Web APIs。

ECMAScript 运行在浏览器中然后再结合 Web APIs 才是真正的 JavaScript,Web APIs 的核心是 DOM 和 BOM。
扩展阅读:ECMAScript 规范在不断的更新中,存在多个不同的版本,早期的版本号接纳数字顺序编号如 ECMAScript3、ECMAScript5,后来由于更新速度较快便接纳年份做为版本号,如 ECMAScript2017、ECMAScript2018 这种格式,ECMAScript6 是 2015 年发布的,常叫做 EMCAScript2015。
关于 JavaScript 历史的扩展阅读。
   知道 DOM 相关的概念,建立对 DOM 的初步熟悉,学习 DOM 的基本操作,体会 DOM 的作用
  DOM(Document Object Model)是将整个 HTML 文档的每一个标签元素视为一个对象,这个对象下包含了很多的属性和方法,通过操作这些属性或者调用这些方法实现对 HTML 的动态更新,为实现网页特效以及用户交互提供技能支撑。
简言之 DOM 是用来动态修改 HTML 的,其目的是开发网页特效及用户交互。
观察一个小例子:

上述的例子中当用户分分别点击【开始】或【竣事】按钮后,通过右侧调试窗口可以观察到 html 标签的内容在不断的发生改变,这便是通过 DOM 实现的。
概念

DOM 树

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>标题</title>
  7. </head>
  8. <body>
  9.   文本
  10.   <a href="">链接名</a>
  11.   <div id="" class="">文本</div>
  12. </body>
  13. </html>
复制代码
如下图所示,将 HTML 文档以树状结构直观的体现出来,我们称之为文档树或 DOM 树,文档树直观的体现了标签与标签之间的关系。

DOM 节点

节点是文档树的构成部分,每一个节点都是一个 DOM 对象,重要分为元素节点、属性节点、文本节点等。

  • 【元素节点】其实就是 HTML 标签,如上图中 head、div、body 等都属于元素节点。
  • 【属性节点】是指 HTML 标签中的属性,如上图中 a 标签的 href 属性、div 标签的 class 属性。
  • 【文本节点】是指 HTML 标签的笔墨内容,如 title 标签中的笔墨。
  • 【根节点】特指 html 标签。
  • 其它…
document

document 是 JavaScript 内置的专门用于 DOM 的对象,该对象包含了若干的属性和方法,document 是学习 DOM 的核心。
  1. <script>
  2.   // document 是内置的对象
  3.   // console.log(typeof document);
  4.   // 1. 通过 document 获取根节点
  5.   console.log(document.documentElement); // 对应 html 标签
  6.   // 2. 通过 document 节取 body 节点
  7.   console.log(document.body); // 对应 body 标签
  8.   // 3. 通过 document.write 方法向网页输出内容
  9.   document.write('Hello World!');
  10. </script>
复制代码
上述列举了 document 对象的部分属性和方法,我们先对 document 有一个整体的熟悉。
获取DOM对象


  • querySelector 满意条件的第一个元素
  • querySelectorAll 满意条件的元素集合 返回伪数组
  • 了解其他方式

    • getElementById
    • getElementsByTagName

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>DOM - 查找节点</title>
  7. </head>
  8. <body>
  9.   <h3>查找元素类型节点</h3>
  10.   <p>从整个 DOM 树中查找 DOM 节点是学习 DOM 的第一个步骤。</p>
  11.   <ul>
  12.       <li>元素</li>
  13.       <li>元素</li>
  14.       <li>元素</li>
  15.       <li>元素</li>
  16.   </ul>
  17.   <script>
  18.           const p = document.querySelector('p')  // 获取第一个p元素
  19.           const lis = document.querySelectorAll('li')  // 获取第一个p元素
  20.   </script>
  21. </body>
  22. </html>
复制代码
总结:


  • document.getElementById 专门获取元素类型节点,根据标签的 id 属性查找
  • 任意 DOM 对象都包含 nodeType 属性,用来检检测节点类型
操作元素内容

通过修改 DOM 的文本内容,动态改变网页的内容。

  • innerText 将文本内容添加/更新到任意标签位置,文本中包含的标签不会被剖析。
  1. <script>
  2.   // innerText 将文本内容添加/更新到任意标签位置
  3.   const intro = document.querySelector('.intro')
  4.   // intro.innerText = '嗨~ 我叫李雷!'
  5.   // intro.innerText = '<h4>嗨~ 我叫李雷!</h4>'
  6. </script>
复制代码

  • innerHTML 将文本内容添加/更新到任意标签位置,文本中包含的标签会被剖析。
  1. <script>
  2.   // innerHTML 将文本内容添加/更新到任意标签位置
  3.   const intro = document.querySelector('.intro')
  4.   intro.innerHTML = '嗨~ 我叫韩梅梅!'
  5.   intro.innerHTML = '<h4>嗨~ 我叫韩梅梅!</h4>'
  6. </script>
复制代码
总结:假如文本内容中包含 html 标签时保举使用 innerHTML,否则建议使用 innerText 属性。
##操作元素属性
有3种方式可以实现对属性的修改:
常用属性修改


  • 直接能过属性名修改,最简便的语法
  1. <script>
  2.   // 1. 获取 img 对应的 DOM 元素
  3.   const pic = document.querySelector('.pic')
  4.         // 2. 修改属性
  5.   pic.src = './images/lion.webp'
  6.   pic.width = 400;
  7.   pic.alt = '图片不见了...'
  8. </script>
复制代码
控制样式属性


  • 应用【修改样式】,通过修改行内样式 style 属性,实现对样式的动态修改。
通过元素节点获得的 style 属性自己的数据类型也是对象,如 box.style.color、box.style.width 分别用来获取元素节点 CSS 样式的 color 和 width 的值。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>练习 - 修改样式</title>
  7. </head>
  8. <body>
  9.   <div class="box">随便一些文本内容</div>
  10.   <script>
  11.     // 获取 DOM 节点
  12.     const box = document.querySelector('.intro')
  13.     box.style.color = 'red'
  14.     box.style.width = '300px'
  15.     // css 属性的 - 连接符与 JavaScript 的 减运算符
  16.     // 冲突,所以要改成驼峰法
  17.     box.style.backgroundColor = 'pink'
  18.   </script>
  19. </body>
  20. </html>
复制代码
任何标签都有 style 属性,通过 style 属性可以动态更改网页标签的样式,如要遇到 css 属性中包含字符 - 时,要将 - 去掉并将其后面的字母改成大写,如 background-color 要写成 box.style.backgroundColor

  • 操作类名(className) 操作 CSS
假如修改的样式比较多,直接通过 style属性 修改比较繁琐,我们可以通过借助于 css类名 的形式。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>练习 - 修改样式</title>
  7.     <style>
  8.         .pink {
  9.             background: pink;
  10.             color: hotpink;
  11.         }
  12.     </style>
  13. </head>
  14. <body>
  15.   <div class="box">随便一些文本内容</div>
  16.   <script>
  17.     // 获取 DOM 节点
  18.     const box = document.querySelector('.intro')
  19.     box.className = 'pink'
  20.   </script>
  21. </body>
  22. </html>
复制代码
  注意:
  1.由于class是关键字, 所以使用className去代替
  2.className 是使用新值换旧值, 假如需要添加一个类,需要保留之前的类名
  

  • 通过 classList 操作类控制 CSS
为了办理 className 容易覆盖以前的类名,我们可以通过 classList 方式追加和删除类名
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>Document</title>
  8.     <style>
  9.         div {
  10.             width: 200px;
  11.             height: 200px;
  12.             background-color: pink;
  13.         }
  14.         .active {
  15.             width: 300px;
  16.             height: 300px;
  17.             background-color: hotpink;
  18.             margin-left: 100px;
  19.         }
  20.     </style>
  21. </head>
  22. <body>
  23.     <div class="one"></div>
  24.     <script>
  25.         // 1.获取元素
  26.         // let box = document.querySelector('css选择器')
  27.         let box = document.querySelector('div')
  28.         // add是个方法 添加  追加
  29.         // box.classList.add('active')
  30.         // remove() 移除 类
  31.         // box.classList.remove('one')
  32.         // 切换类
  33.         box.classList.toggle('one')
  34.     </script>
  35. </body>
  36. </html>
复制代码
操作表单元素属性

表单很多环境,也需要修改属性,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框
正常的有属性有取值的跟其他的标签属性没有任何区别
获取OM对象.属性名
设置OM对象.属性名= 新值
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>Document</title>
  8. </head>
  9. <body>
  10.     <input type="text" value="请输入">
  11.     <button disabled>按钮</button>
  12.     <input type="checkbox" name="" id="" class="agree">
  13.     <script>
  14.         // 1. 获取元素
  15.         let input = document.querySelector('input')
  16.         // 2. 取值或者设置值  得到input里面的值可以用 value
  17.         // console.log(input.value)
  18.         input.value = '小米手机'
  19.         input.type = 'password'
  20.         // 2. 启用按钮
  21.         let btn = document.querySelector('button')
  22.         // disabled 不可用   =  false  这样可以让按钮启用
  23.         btn.disabled = false
  24.         // 3. 勾选复选框
  25.         let checkbox = document.querySelector('.agree')
  26.         checkbox.checked = false
  27.     </script>
  28. </body>
  29. </html>
复制代码
自定义属性

尺度属性: 标签天生自带的属性 比如class id title等, 可以直接使用点语法操作比如: disabled、checked、selected
自定义属性:
在html5中推出来了专门的data-自定义属性
在标签上一律以data-开头
在DOM对象上一律以dataset对象方式获取
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>Document</title>
  8. </head>
  9. <body>
  10.    <div data-id="1"> 自定义属性 </div>
  11.     <script>
  12.         // 1. 获取元素
  13.         let div = document.querySelector('div')
  14.         // 2. 获取自定义属性值
  15.          console.log(div.dataset.id)
  16.       
  17.     </script>
  18. </body>
  19. </html>
复制代码
间歇函数

   知道间歇函数的作用,使用间歇函数创建定时任务。
  setInterval 是 JavaScript 中内置的函数,它的作用是间隔固定的时间自动重复执行另一个函数,也叫定时器函数。
  1. <script>
  2.   // 1. 定义一个普通函数
  3.   function repeat() {
  4.     console.log('不知疲倦的执行下去....')
  5.   }
  6.   // 2. 使用 setInterval 调用 repeat 函数
  7.   // 间隔 1000 毫秒,重复调用 repeat
  8.   setInterval(repeat, 1000)
  9. </script>
复制代码
本日单词

单词阐明解释setInterval定时器setInterval(repeat, 1000) Web APIs - 第2天

   学会通过为 DOM 注册事故来实现可交互的网页特效。
  

  • 能够判断函数运行的环境并确字 this 所指代的对象
  • 明白事故的作用,知道应用事故的 3 个步调
   学习会为 DOM 注册事故,实现简单可交互的网页特交。
  事故

事故是编程语言中的术语,它是用来形貌程序的行为或状态的,一旦行为或状态发生改变,便立即调用一个函数。
比方:用户使用【鼠标点击】网页中的一个按钮、用户使用【鼠标拖拽】网页中的一张图片
事故监听

结合 DOM 使用事故时,需要为 DOM 对象添加事故监听,等待事故发生(触发)时,便立即调用一个函数。
addEventListener 是 DOM 对象专门用来添加事故监听的方法,它的两个参数分别为【事故类型】和【事故回调】。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>事件监听</title>
  7. </head>
  8. <body>
  9.   <h3>事件监听</h3>
  10.   <p id="text">为 DOM 元素添加事件监听,等待事件发生,便立即执行一个函数。</p>
  11.   <button id="btn">点击改变文字颜色</button>
  12.   <script>
  13.     // 1. 获取 button 对应的 DOM 对象
  14.     const btn = document.querySelector('#btn')
  15.     // 2. 添加事件监听
  16.     btn.addEventListener('click', function () {
  17.       console.log('等待事件被触发...')
  18.       // 改变 p 标签的文字颜色
  19.       let text = document.getElementById('text')
  20.       text.style.color = 'red'
  21.     })
  22.     // 3. 只要用户点击了按钮,事件便触发了!!!
  23.   </script>
  24. </body>
  25. </html>
复制代码
完成事故监听分成3个步调:

  • 获取 DOM 元素
  • 通过 addEventListener 方法为 DOM 节点添加事故监听
  • 等待事故触发,如用户点击了某个按钮时便会触发 click 事故类型
  • 事故触发后,相对应的回调函数会被执行
大白话形貌:所谓的事故无非就是找个机会(事故触发)调用一个函数(回调函数)。
事故类型

click 译成中文是【点击】的意思,它的含义是监听(等着)用户鼠标的单击操作,除了【单击】另有【双击】dblclick
  1. <script>
  2.   // 双击事件类型
  3.   btn.addEventListener('dblclick', function () {
  4.     console.log('等待事件被触发...');
  5.     // 改变 p 标签的文字颜色
  6.     const text = document.querySelector('.text')
  7.     text.style.color = 'red'
  8.   })
  9.   // 只要用户双击击了按钮,事件便触发了!!!
  10. </script>
复制代码
结论:【事故类型】决定了事故被触发的方式,如 click 代表鼠标单击,dblclick 代表鼠标双击。
事故处理程序

addEventListener 的第2个参数是函数,这个函数会在事故被触发时立即被调用,在这个函数中可以编写任意逻辑的代码,如改变 DOM 文本颜色、文本内容等。
  1. <script>
  2.   // 双击事件类型
  3.   btn.addEventListener('dblclick', function () {
  4.     console.log('等待事件被触发...')
  5.    
  6.     const text = document.querySelector('.text')
  7.     // 改变 p 标签的文字颜色
  8.     text.style.color = 'red'
  9.     // 改变 p 标签的文本内容
  10.     text.style.fontSize = '20px'
  11.   })
  12. </script>
复制代码
结论:【事故处理程序】决定了事故触发后应该执行的逻辑。
事故类型

将众多的事故类型分类可分为:鼠标事故、键盘事故、表单事故、核心事故等,我们逐一展开学习。
鼠标事故

鼠标事故是指跟鼠标操作相关的事故,如单击、双击、移动等。

  • `mouseenter 监听鼠标是否移入 DOM 元素
  1. <body>
  2.   <h3>鼠标事件</h3>
  3.   <p>监听与鼠标相关的操作</p>
  4.   <hr>
  5.   <div class="box"></div>
  6.   <script>
  7.     // 需要事件监听的 DOM 元素
  8.     const box = document.querySelector('.box');
  9.     // 监听鼠标是移入当前 DOM 元素
  10.     box.addEventListener('mouseenter', function () {
  11.       // 修改文本内容
  12.       this.innerText = '鼠标移入了...';
  13.       // 修改光标的风格
  14.       this.style.cursor = 'move';
  15.     })
  16.   </script>
  17. </body>
复制代码

  • `mouseleave 监听鼠标是否移出 DOM 元素
  1. <body>
  2.   <h3>鼠标事件</h3>
  3.   <p>监听与鼠标相关的操作</p>
  4.   <hr>
  5.   <div class="box"></div>
  6.   <script>
  7.     // 需要事件监听的 DOM 元素
  8.     const box = document.querySelector('.box');
  9.     // 监听鼠标是移出当前 DOM 元素
  10.     box.addEventListener('mouseleave', function () {
  11.       // 修改文本内容
  12.       this.innerText = '鼠标移出了...';
  13.     })
  14.   </script>
  15. </body>
复制代码
键盘事故

keydown 键盘按下触发
keyup 键盘抬起触发
核心事故

focus 获得核心
blur 失去核心
文本框输入事故

input
事故对象

任意事故类型被触发时与事故相关的信息会被以对象的形式记录下来,我们称这个对象为事故对象。
  1. <body>
  2.   <h3>事件对象</h3>
  3.   <p>任意事件类型被触发时与事件相关的信息会被以对象的形式记录下来,我们称这个对象为事件对象。</p>
  4.   <hr>
  5.   <div class="box"></div>
  6.   <script>
  7.     // 获取 .box 元素
  8.     const box = document.querySelector('.box')
  9.     // 添加事件监听
  10.     box.addEventListener('click', function (e) {
  11.       console.log('任意事件类型被触发后,相关信息会以对象形式被记录下来...');
  12.       // 事件回调函数的第1个参数即所谓的事件对象
  13.       console.log(e)
  14.     })
  15.   </script>
  16. </body>
复制代码
事故回调函数的【第1个参数】即所谓的事故对象,通常风俗性的将这个对数定名为 event、ev 、ev 。
接下来简单看一下事故对象中包含了哪些有用的信息:

  • ev.type 当前事故的类型
  • ev.clientX/Y 光标相对浏览器窗口的位置
  • ev.offsetX/Y 光标相于当前 DOM 元素的位置
注:在事故回调函数内部通过 window.event 同样可以获取事故对象。
环境对象

   能够分析判断函数运行在不同环境中 this 所指代的对象。
  环境对象指的是函数内部特别的变量 this ,它代表着当前函数运行时所处的环境。
  1. <script>
  2.   // 声明函数
  3.   function sayHi() {
  4.     // this 是一个变量
  5.     console.log(this);
  6.   }
  7.   // 声明一个对象
  8.   let user = {
  9.     name: '张三',
  10.     sayHi: sayHi // 此处把 sayHi 函数,赋值给 sayHi 属性
  11.   }
  12.   
  13.   let person = {
  14.     name: '李四',
  15.     sayHi: sayHi
  16.   }
  17.   // 直接调用
  18.   sayHi() // window
  19.   window.sayHi() // window
  20.   // 做为对象方法调用
  21.   user.sayHi()// user
  22.         person.sayHi()// person
  23. </script>
复制代码
结论:

  • this 本质上是一个变量,数据类型为对象
  • 函数的调用方式不同 this 变量的值也不同
  • 【谁调用 this 就是谁】是判断 this 值的粗略规则
  • 函数直接调用时实际上 window.sayHi() 所以 this 的值为 window
回调函数

假如将函数 A 做为参数传递给函数 B 时,我们称函数 A 为回调函数。
  1. <script>
  2.   // 声明 foo 函数
  3.   function foo(arg) {
  4.     console.log(arg);
  5.   }
  6.   // 普通的值做为参数
  7.   foo(10);
  8.   foo('hello world!');
  9.   foo(['html', 'css', 'javascript']);
  10.   function bar() {
  11.     console.log('函数也能当参数...');
  12.   }
  13.   // 函数也可以做为参数!!!!
  14.   foo(bar);
  15. </script>
复制代码
函数 bar 做参数传给了 foo 函数,bar 就是所谓的回调函数了!!!
我们回顾一下间歇函数 setInterval
  1. <script>
  2.         function fn() {
  3.     console.log('我是回调函数...');
  4.   }
  5.   // 调用定时器
  6.   setInterval(fn, 1000);
  7. </script>
复制代码
fn 函数做为参数传给了 setInterval ,这便是回调函数的实际应用了,结合刚刚学习的函数表达式上述代码另有另一种更常见写法。
  1. <script>
  2.   // 调用定时器,匿名函数做为参数
  3.   setInterval(function () {
  4.     console.log('我是回调函数...');
  5.   }, 1000);
  6. </script>
复制代码
结论:

  • 回调函数本质还是函数,只不过把它当成参数使用
  • 使用匿名函数做为回调函数比较常见
Web APIs - 第3天

   进一步学习 事故进阶,实现更多交互的网页特效,结合事故流的特征优化事故执行的服从
  

  • 把握制止事故冒泡的方法
  • 明白事故委托的实现原理
事故流

事故流是对事故执行过程的形貌,了解事故的执行过程有助于加深对事故的明白,提拔开发实践中对事故运用的灵活度。

如上图所示,任意事故被触发时总会经历两个阶段:【捕获阶段】和【冒泡阶段】。
简言之,捕获阶段是【从父到子】的传导过程,冒泡阶段是【从子向父】的传导过程。
捕获和冒泡

了解了什么是事故流之后,我们来看事故流是如何影响事故执行的:
  1. <body>
  2.   <h3>事件流</h3>
  3.   <p>事件流是事件在执行时的底层机制,主要体现在父子盒子之间事件的执行上。</p>
  4.   <div class="outer">
  5.     <div class="inner">
  6.       <div class="child"></div>
  7.     </div>
  8.   </div>
  9.   <script>
  10.     // 获取嵌套的3个节点
  11.     const outer = document.querySelector('.outer');
  12.     const inner = document.querySelector('.inner');
  13.     const child = document.querySelector('.child');
  14.                
  15.     // html 元素添加事件
  16.     document.documentElement.addEventListener('click', function () {
  17.       console.log('html...')
  18.     })
  19.                
  20.     // body 元素添加事件
  21.     document.body.addEventListener('click', function () {
  22.       console.log('body...')
  23.     })
  24.     // 外层的盒子添加事件
  25.     outer.addEventListener('click', function () {
  26.       console.log('outer...')
  27.     })
  28.    
  29.     // 中间的盒子添加事件
  30.     outer.addEventListener('click', function () {
  31.       console.log('inner...')
  32.     })
  33.    
  34.     // 内层的盒子添加事件
  35.     outer.addEventListener('click', function () {
  36.       console.log('child...')
  37.     })
  38.   </script>
  39. </body>
复制代码
执行上述代码后发现,当单击事故触发时,其先人元素的单击事故也【相继触发】,这是为什么呢?
结合事故流的特征,我们知道当某个元素的事故被触发时,事故总是会先颠末其先人才能到达当前元素,然后再由当前元素向先人传递,事故在流动的过程中遇到相同的事故便会被触发。
再来关注一个细节就是事故相继触发的【执行顺序】,事故的执行顺序是可控制的,即可以在捕获阶段被执行,也可以在冒泡阶段被执行。
假如事故是在冒泡阶段执行的,我们称为冒泡模式,它会先执行子盒子事故再去执行父盒子事故,默认是冒泡模式。
假如事故是在捕获阶段执行的,我们称为捕获模式,它会先执行父盒子事故再去执行子盒子事故。
  1. <body>
  2.   <h3>事件流</h3>
  3.   <p>事件流是事件在执行时的底层机制,主要体现在父子盒子之间事件的执行上。</p>
  4.   <div class="outer">
  5.     <div class="inner"></div>
  6.   </div>
  7.   <script>
  8.     // 获取嵌套的3个节点
  9.     const outer = document.querySelector('.outer')
  10.     const inner = document.querySelector('.inner')
  11.     // 外层的盒子
  12.     outer.addEventListener('click', function () {
  13.       console.log('outer...')
  14.     }, true) // true 表示在捕获阶段执行事件
  15.    
  16.     // 中间的盒子
  17.     outer.addEventListener('click', function () {
  18.       console.log('inner...')
  19.     }, true)
  20.   </script>
  21. </body>
复制代码
结论:

  • addEventListener 第3个参数决定了事故是在捕获阶段触发还是在冒泡阶段触发
  • addEventListener 第3个参数为 true 表示捕获阶段触发,false 表示冒泡阶段触发,默认值为 false
  • 事故流只会在父子元素具有相同事故类型时才会产生影响
  • 绝大部分场景都接纳默认的冒泡模式(其中一个原因是早期 IE 不支持捕获)
制止冒泡

制止冒泡是指阻断事故的流动,保证事故只在当前元素被执行,而不再去影响到其对应的先人元素。
  1. <body>
  2.   <h3>阻止冒泡</h3>
  3.   <p>阻止冒泡是指阻断事件的流动,保证事件只在当前元素被执行,而不再去影响到其对应的祖先元素。</p>
  4.   <div class="outer">
  5.     <div class="inner">
  6.       <div class="child"></div>
  7.     </div>
  8.   </div>
  9.   <script>
  10.     // 获取嵌套的3个节点
  11.     const outer = document.querySelector('.outer')
  12.     const inner = document.querySelector('.inner')
  13.     const child = document.querySelector('.child')
  14.     // 外层的盒子
  15.     outer.addEventListener('click', function () {
  16.       console.log('outer...')
  17.     })
  18.     // 中间的盒子
  19.     inner.addEventListener('click', function (ev) {
  20.       console.log('inner...')
  21.       // 阻止事件冒泡
  22.       ev.stopPropagation()
  23.     })
  24.     // 内层的盒子
  25.     child.addEventListener('click', function (ev) {
  26.       console.log('child...')
  27.       // 借助事件对象,阻止事件向上冒泡
  28.       ev.stopPropagation()
  29.     })
  30.   </script>
  31. </body>
复制代码
结论:事故对象中的 ev.stopPropagation 方法,专门用来制止事故冒泡。
   鼠标颠末事故:
  mouseover 和 mouseout 会有冒泡结果
  mouseenter 和 mouseleave 没有冒泡结果 (保举)
  事故委托

事故委托是使用事故流的特征办理一些实际开发需求的知识本事,重要的作用是提拔程序服从。
大量的事故监听是比较耗费性能的,如下代码所示
  1. <script>
  2.   // 假设页面中有 10000 个 button 元素
  3.   const buttons = document.querySelectorAll('table button');
  4.   for(let i = 0; i <= buttons.length; i++) {
  5.     // 为 10000 个 button 元素添加了事件
  6.     buttons.addEventListener('click', function () {
  7.       // 省略具体执行逻辑...
  8.     })
  9.   }
  10. </script>
复制代码
使用事故流的特征,可以对上述的代码举行优化,事故的的冒泡模式总是会将事故流向其父元素的,假如父元素监听了相同的事故类型,那么父元素的事故就会被触发并执行,正是使用这一特征对上述代码举行优化,如下代码所示:
  1. <script>
  2.   // 假设页面中有 10000 个 button 元素
  3.   let buttons = document.querySelectorAll('table button');
  4.   
  5.   // 假设上述的 10000 个 buttom 元素共同的祖先元素是 table
  6.   let parents = document.querySelector('table');
  7.   parents.addEventListener('click', function () {
  8.     console.log('点击任意子元素都会触发事件...');
  9.   })
  10. </script>
复制代码
我们的最终目的是保证只有点击 button 子元素才去执行事故的回调函数,如何判断用户点击是哪一个子元素呢?

事故对象中的属性 target 或 srcElement属性表示真正触发事故的元素,它是一个元素类型的节点。
  1. <script>
  2.   // 假设页面中有 10000 个 button 元素
  3.   const buttons = document.querySelectorAll('table button')
  4.   
  5.   // 假设上述的 10000 个 buttom 元素共同的祖先元素是 table
  6.   const parents = document.querySelector('table')
  7.   parents.addEventListener('click', function (ev) {
  8.     // console.log(ev.target);
  9.     // 只有 button 元素才会真正去执行逻辑
  10.     if(ev.target.tagName === 'BUTTON') {
  11.       // 执行的逻辑
  12.     }
  13.   })
  14. </script>
复制代码
优化过的代码只对先人元素添加事故监听,相比对 10000 个元素添加事故监听执行服从要高很多!!!
其他事故

页面加载事故

加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事故
有些时间需要等页面资源全部处理完了做一些事故
事故名:load
监听页面所有资源加载完毕:
  1. window.addEventListener('load', function() {
  2.     // xxxxx
  3. })
复制代码
元素滚动事故

滚动条在滚动的时间持续触发的事故
  1. window.addEventListener('scroll', function() {
  2.     // xxxxx
  3. })
复制代码
页面尺寸事故

会在窗口尺寸改变的时间触发事故:
  1. window.addEventListener('resize', function() {
  2.     // xxxxx
  3. })
复制代码
元素尺寸与位置

获取元素的自身宽高、包含元素自身设置的宽高、padding、border
offsetWidth和offsetHeight
获取出来的是数值,方便计算
注意: 获取的是可视宽高, 假如盒子是隐藏的,获取的结果是0
Web APIs - 第4天

   进一步学习 DOM 相关知识,实现可交互的网页特效
  

  • 能够插入、删除和替换元素节点
  • 能够依据元素节点关系查找节点
日期对象

把握 Date 日期对象的使用,动态获取当前计算机的时间。
ECMAScript 中内置了获取体系时间的对象 Date,使用 Date 时与之前学习的内置对象 console 和 Math 不同,它需要借助 new 关键字才能使用。
实例化

  1.   // 1. 实例化
  2.   // const date = new Date(); // 系统默认时间
  3.   const date = new Date('2020-05-01') // 指定时间
  4.   // date 变量即所谓的时间对象
  5.   console.log(typeof date)
复制代码
方法

  1. // 1. 实例化
  2. const date = new Date();
  3. // 2. 调用时间对象方法
  4. // 通过方法分别获取年、月、日,时、分、秒
  5. const year = date.getFullYear(); // 四位年份
  6. const month = date.getMonth(); // 0 ~ 11
复制代码
getFullYear 获取四位年份
getMonth 获取月份,取值为 0 ~ 11
getDate 获取月份中的每一天,不同月份取值也不相同
getDay 获取星期,取值为 0 ~ 6
getHours 获取小时,取值为 0 ~ 23
getMinutes 获取分钟,取值为 0 ~ 59
getSeconds 获取秒,取值为 0 ~ 59
时间戳

时间戳是指1970年01月01日00时00分00秒起至现在的总秒数或毫秒数,它是一种特别的计量时间的方式。
注:ECMAScript 中时间戳是以毫秒计的。
  1.     // 1. 实例化
  2.   const date = new Date()
  3.   // 2. 获取时间戳
  4.   console.log(date.getTime())
  5. // 还有一种获取时间戳的方法
  6.   console.log(+new Date())
  7.   // 还有一种获取时间戳的方法
  8.   console.log(Date.now())
复制代码
获取时间戳的方法,分别为 getTime 和 Date.now 和 +new Date()
DOM 节点

   把握元素节点创建、复制、插入、删除等操作的方法,能够依据元素节点的结构关系查找节点
  回顾之前 DOM 的操作都是针对元素节点的属性或文本的,除此之外也有专门针对元素节点自己的操作,如插入、复制、删除、替换等。
插入节点

在已有的 DOM 节点中插入新的 DOM 节点时,需要关注两个关键因素:首先要得到新的 DOM 节点,其次在哪个位置插入这个节点。
如下代码演示:
  1. <body>
  2.   <h3>插入节点</h3>
  3.   <p>在现有 dom 结构基础上插入新的元素节点</p>
  4.   <hr>
  5.   <!-- 普通盒子 -->
  6.   <div class="box"></div>
  7.   <!-- 点击按钮向 box 盒子插入节点 -->
  8.   <button class="btn">插入节点</button>
  9.   <script>
  10.     // 点击按钮,在网页中插入节点
  11.     const btn = document.querySelector('.btn')
  12.     btn.addEventListener('click', function () {
  13.       // 1. 获得一个 DOM 元素节点
  14.       const p = document.createElement('p')
  15.       p.innerText = '创建的新的p标签'
  16.       p.className = 'info'
  17.       
  18.       // 复制原有的 DOM 节点
  19.       const p2 = document.querySelector('p').cloneNode(true)
  20.       p2.style.color = 'red'
  21.       // 2. 插入盒子 box 盒子
  22.       document.querySelector('.box').appendChild(p)
  23.       document.querySelector('.box').appendChild(p2)
  24.     })
  25.   </script>
  26. </body>
复制代码
结论:


  • createElement 动态创建任意 DOM 节点
  • cloneNode 复制现有的 DOM 节点,传入参数 true 会复制所有子节点
  • appendChild 在末端(竣事标签前)插入节点
再来看另一种情形的代码演示:
  1. <body>
  2.   <h3>插入节点</h3>
  3.   <p>在现有 dom 结构基础上插入新的元素节点</p>
  4.         <hr>
  5.   <button class="btn1">在任意节点前插入</button>
  6.   <ul>
  7.     <li>HTML</li>
  8.     <li>CSS</li>
  9.     <li>JavaScript</li>
  10.   </ul>
  11.   <script>
  12.     // 点击按钮,在已有 DOM 中插入新节点
  13.     const btn1 = document.querySelector('.btn1')
  14.     btn1.addEventListener('click', function () {
  15.       // 第 2 个 li 元素
  16.       const relative = document.querySelector('li:nth-child(2)')
  17.       // 1. 动态创建新的节点
  18.       const li1 = document.createElement('li')
  19.       li1.style.color = 'red'
  20.       li1.innerText = 'Web APIs'
  21.       // 复制现有的节点
  22.       const li2 = document.querySelector('li:first-child').cloneNode(true)
  23.       li2.style.color = 'blue'
  24.       // 2. 在 relative 节点前插入
  25.       document.querySelector('ul').insertBefore(li1, relative)
  26.       document.querySelector('ul').insertBefore(li2, relative)
  27.     })
  28.   </script>
  29. </body>
复制代码
结论:


  • createElement 动态创建任意 DOM 节点
  • cloneNode 复制现有的 DOM 节点,传入参数 true 会复制所有子节点
  • insertBefore 在父节点中任意子节点之前插入新节点
删除节点

删除现有的 DOM 节点,也需要关注两个因素:首先由父节点删除子节点,其次是要删除哪个子节点。
  1. <body>
  2.   <!-- 点击按钮删除节点 -->
  3.   <button>删除节点</button>
  4.   <ul>
  5.     <li>HTML</li>
  6.     <li>CSS</li>
  7.     <li>Web APIs</li>
  8.   </ul>
  9.   <script>
  10.     const btn = document.querySelector('button')
  11.     btn.addEventListener('click', function () {
  12.       // 获取 ul 父节点
  13.       let ul = document.querySelector('ul')
  14.       // 待删除的子节点
  15.       let lis = document.querySelectorAll('li')
  16.       // 删除节点
  17.       ul.removeChild(lis[0])
  18.     })
  19.   </script>
  20. </body>
复制代码
结论:removeChild 删除节点时一定是由父子关系。
查找节点

DOM 树中的任意节点都不是孤立存在的,它们要么是父子关系,要么是兄弟关系,不仅如此,我们可以依据节点之间的关系查找节点。
父子关系

  1. <body>
  2.   <button class="btn1">所有的子节点</button>
  3.   <!-- 获取 ul 的子节点 -->
  4.   <ul>
  5.     <li>HTML</li>
  6.     <li>CSS</li>
  7.     <li>JavaScript 基础</li>
  8.     <li>Web APIs</li>
  9.   </ul>
  10.   <script>
  11.     const btn1 = document.querySelector('.btn1')
  12.     btn1.addEventListener('click', function () {
  13.       // 父节点
  14.       const ul = document.querySelector('ul')
  15.       // 所有的子节点
  16.       console.log(ul.childNodes)
  17.       // 只包含元素子节点
  18.       console.log(ul.children)
  19.     })
  20.   </script>
  21. </body>
复制代码
结论:


  • childNodes 获取全部的子节点,回车换行会被认为是空白文本节点
  • children 只获取元素类型节点
  1. <body>
  2.   <table>
  3.     <tr>
  4.       <td width="60">序号</td>
  5.       <td>课程名</td>
  6.       <td>难度</td>
  7.       <td width="80">操作</td>
  8.     </tr>
  9.     <tr>
  10.       <td>1</td>
  11.       <td><span>HTML</span></td>
  12.       <td>初级</td>
  13.       <td><button>变色</button></td>
  14.     </tr>
  15.     <tr>
  16.       <td>2</td>
  17.       <td><span>CSS</span></td>
  18.       <td>初级</td>
  19.       <td><button>变色</button></td>
  20.     </tr>
  21.     <tr>
  22.       <td>3</td>
  23.       <td><span>Web APIs</span></td>
  24.       <td>中级</td>
  25.       <td><button>变色</button></td>
  26.     </tr>
  27.   </table>
  28.   <script>
  29.     // 获取所有 button 节点,并添加事件监听
  30.     const buttons = document.querySelectorAll('table button')
  31.     for(let i = 0; i < buttons.length; i++) {
  32.       buttons[i].addEventListener('click', function () {
  33.         // console.log(this.parentNode); // 父节点 td
  34.         // console.log(this.parentNode.parentNode); // 爷爷节点 tr
  35.         this.parentNode.parentNode.style.color = 'red'
  36.       })
  37.     }
  38.   </script>
  39. </body>
复制代码
结论:parentNode 获取父节点,以相对位置查找节点,实际应用中非常灵活。
兄弟关系

  1. <body>
  2.   <ul>
  3.     <li>HTML</li>
  4.     <li>CSS</li>
  5.     <li>JavaScript 基础</li>
  6.     <li>Web APIs</li>
  7.   </ul>
  8.   <script>
  9.     // 获取所有 li 节点
  10.     const lis = document.querySelectorAll('ul li')
  11.     // 对所有的 li 节点添加事件监听
  12.     for(let i = 0; i < lis.length; i++) {
  13.       lis[i].addEventListener('click', function () {
  14.         // 前一个节点
  15.         console.log(this.previousSibling)
  16.         // 下一下节点
  17.         console.log(this.nextSibling)
  18.       })
  19.     }
  20.   </script>
  21. </body>
复制代码
结论:


  • previousSibling 获取前一个节点,以相对位置查找节点,实际应用中非常灵活。
  • nextSibling 获取后一个节点,以相对位置查找节点,实际应用中非常灵活。
Web APIs - 第5天条记

   目标: 能够使用JS操作浏览器,具备使用本地存储实现弟子就业表的本事
  

  • BOM操作
  • 综合案例
js构成

JavaScript的构成


  • ECMAScript:

    • 规定了js基础语法核心知识。
    • 比如:变量、分支语句、循环语句、对象等等

  • Web APIs :

    • DOM 文档对象模型, 定义了一套操作HTML文档的API
    • BOM 浏览器对象模型,定义了一套操作浏览器窗口的API


window对象

BOM (Browser Object Model ) 是浏览器对象模型


  • window对象是一个全局对象,也可以说是JavaScript中的顶级对象
  • 像document、alert()、console.log()这些都是window的属性,基本BOM的属性和方法都是window的
  • 所有通过var定义在全局作用域中的变量、函数都会变成window对象的属性和方法
  • window对象下的属性和方法调用的时间可以省略window

定时器-延迟函数

JavaScript 内置的一个用来让代码延迟执行的函数,叫 setTimeout
语法:
  1. setTimeout(回调函数, 延迟时间)
复制代码
setTimeout 仅仅只执行一次,所以可以明白为就是把一段代码延迟执行, 平时省略window
间歇函数 setInterval : 每隔一段时间就执行一次, , 平时省略window
清除延时函数:
  1. clearTimeout(timerId)
复制代码
  注意点
  

  • 延时函数需要等待,所以后面的代码先执行
  • 返回值是一个正整数,表示定时器的编号
  1. <body>  <script>    // 定时器之延迟函数    // 1. 开启延迟函数    let timerId = setTimeout(function () {      console.log('我只执行一次')    }, 3000)    // 1.1 延迟函数返回的还是一个正整数数字,表示延迟函数的编号    console.log(timerId)    // 1.2 延迟函数需要等待时间,所以下面的代码优先执行    // 2. 关闭延迟函数    clearTimeout(timerId)
  2.   </script></body>
复制代码
location对象

location (地址) 它拆分并保存了 URL 地址的各个构成部分, 它是一个对象
属性/方法阐明href属性,获取完整的 URL 地址,赋值时用于地址的跳转search属性,获取地址中携带的参数,符号 ?后面部分hash属性,获取地址中的啥希值,符号 # 后面部分reload()方法,用来革新当前页面,传入参数 true 时表示强制革新
  1. <body>
  2.   <form>
  3.     <input type="text" name="search"> <button>搜索</button>
  4.   </form>
  5.   <a href="#/music">音乐</a>
  6.   <a href="#/download">下载</a>
  7.   <button class="reload">刷新页面</button>
  8.   <script>
  9.     // location 对象  
  10.     // 1. href属性 (重点) 得到完整地址,赋值则是跳转到新地址
  11.     console.log(location.href)
  12.     // location.href = 'http://www.itcast.cn'
  13.     // 2. search属性  得到 ? 后面的地址
  14.     console.log(location.search)  // ?search=笔记本
  15.     // 3. hash属性  得到 # 后面的地址
  16.     console.log(location.hash)
  17.     // 4. reload 方法  刷新页面
  18.     const btn = document.querySelector('.reload')
  19.     btn.addEventListener('click', function () {
  20.       // location.reload() // 页面刷新
  21.       location.reload(true) // 强制页面刷新 ctrl+f5
  22.     })
  23.   </script>
  24. </body>
复制代码
navigator对象

navigator是对象,该对象下记录了浏览器自身的相关信息
常用属性和方法:


  • 通过 userAgent 检测浏览器的版本及平台
  1. // 检测 userAgent(浏览器信息)
  2. (function () {
  3.   const userAgent = navigator.userAgent
  4.   // 验证是否为Android或iPhone
  5.   const android = userAgent.match(/(Android);?[\s\/]+([\d.]+)?/)
  6.   const iphone = userAgent.match(/(iPhone\sOS)\s([\d_]+)/)
  7.   // 如果是Android或iPhone,则跳转至移动站点
  8.   if (android || iphone) {
  9.     location.href = 'http://m.itcast.cn'
  10.   }})();
复制代码
histroy对象

history (历史)是对象,重要管理历史记录, 该对象与浏览器地址栏的操作相对应,如前进、退却等
使用场景
history对象一样平常在实际开发中比较少用,但是会在一些OA 办公体系中见到。

常见方法:

  1. <body>
  2.   <button class="back">←后退</button>
  3.   <button class="forward">前进→</button>
  4.   <script>
  5.     // histroy对象
  6.     // 1.前进
  7.     const forward = document.querySelector('.forward')
  8.     forward.addEventListener('click', function () {
  9.       // history.forward()
  10.       history.go(1)
  11.     })
  12.     // 2.后退
  13.     const back = document.querySelector('.back')
  14.     back.addEventListener('click', function () {
  15.       // history.back()
  16.       history.go(-1)
  17.     })
  18.   </script>
  19. </body>
复制代码
本地存储(本日重点)

本地存储:将数据存储在本地浏览器中
常见的使用场景:
https://todomvc.com/examples/vanilla-es6/ 页面革新数据不丢失
好处:
1、页面革新或者关闭不丢失数据,实现数据持久化
2、容量较大,sessionStorage和 localStorage 约 5M 左右
localStorage(重点)

作用: 数据可以长期保留在本地浏览器中,革新页面和关闭页面,数据也不会丢失
**特性:**以键值对的形式存储,并且存储的是字符串, 省略了window

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.   <title>本地存储-localstorage</title>
  8. </head>
  9. <body>
  10.   <script>
  11.     // 本地存储 - localstorage 存储的是字符串
  12.     // 1. 存储
  13.     localStorage.setItem('age', 18)
  14.     // 2. 获取
  15.     console.log(typeof localStorage.getItem('age'))
  16.     // 3. 删除
  17.     localStorage.removeItem('age')
  18.   </script>
  19. </body>
  20. </html>
复制代码
sessionStorage(了解)

特性:


  • 用法跟localStorage基本相同
  • 区别是:当页面浏览器被关闭时,存储在 sessionStorage 的数据会被清除
存储:sessionStorage.setItem(key,value)
获取:sessionStorage.getItem(key)
删除:sessionStorage.removeItem(key)
localStorage 存储复杂数据类型

**题目:**本地只能存储字符串,无法存储复杂数据类型.
**办理:**需要将复杂数据类型转换成 JSON字符串,在存储到本地
**语法:**JSON.stringify(复杂数据类型)
JSON字符串:


  • 首先是1个字符串
  • 属性名使用双引号引起来,不能单引号
  • 属性值假如是字符串型也必须双引号
  1. <body>
  2.   <script>
  3.     // 本地存储复杂数据类型
  4.     const goods = {
  5.       name: '小米',
  6.       price: 1999
  7.     }
  8.     // localStorage.setItem('goods', goods)
  9.     // console.log(localStorage.getItem('goods'))
  10.     // 1. 把对象转换为JSON字符串  JSON.stringify
  11.     localStorage.setItem('goods', JSON.stringify(goods))
  12.     // console.log(typeof localStorage.getItem('goods'))
  13.   </script>
  14. </body>
复制代码
**题目:**因为本地存储里面取出来的是字符串,不是对象,无法直接使用
**办理: **把取出来的字符串转换为对象
**语法:**JSON.parse(JSON字符串)
  1. <body>
  2.   <script>
  3.     // 本地存储复杂数据类型
  4.     const goods = {
  5.       name: '小米',
  6.       price: 1999
  7.     }
  8.     // localStorage.setItem('goods', goods)
  9.     // console.log(localStorage.getItem('goods'))
  10.     // 1. 把对象转换为JSON字符串  JSON.stringify
  11.     localStorage.setItem('goods', JSON.stringify(goods))
  12.     // console.log(typeof localStorage.getItem('goods'))
  13.     // 2. 把JSON字符串转换为对象  JSON.parse
  14.     console.log(JSON.parse(localStorage.getItem('goods')))
  15.   </script>
  16. </body>
复制代码
综合案例

数组map 方法

使用场景:
map 可以遍历数组处理数据,并且返回新的数组
语法:
  1. <body>
  2.   <script>
  3.   const arr = ['red', 'blue', 'pink']
  4.   // 1. 数组 map方法 处理数据并且 返回一个数组
  5.    const newArr = arr.map(function (ele, index) {
  6.     // console.log(ele)  // 数组元素
  7.     // console.log(index) // 索引号
  8.     return ele + '颜色'
  9.         })
  10. console.log(newArr)
  11. </script>
  12. </body>
复制代码
  map 也称为映射。映射是个术语,指两个元素的集之间元素相互“对应”的关系。
  map重点在于有返回值,forEach没有返回值(undefined)
  数组join方法

**作用:**join() 方法用于把数组中的所有元素转换一个字符串
语法:
  1. <body>
  2.   <script>
  3.     const arr = ['red', 'blue', 'pink']
  4.     // 1. 数组 map方法 处理数据并且 返回一个数组
  5.     const newArr = arr.map(function (ele, index) {
  6.       // console.log(ele)  // 数组元素
  7.       // console.log(index) // 索引号
  8.       return ele + '颜色'
  9.     })
  10.     console.log(newArr)
  11.     // 2. 数组join方法  把数组转换为字符串
  12.     // 小括号为空则逗号分割
  13.     console.log(newArr.join())  // red颜色,blue颜色,pink颜色
  14.     // 小括号是空字符串,则元素之间没有分隔符
  15.     console.log(newArr.join(''))  //red颜色blue颜色pink颜色
  16.     console.log(newArr.join('|'))  //red颜色|blue颜色|pink颜色
  17.   </script>
  18. </body>
复制代码
Web APIs - 第6天条记

   目标:能够使用正则表达式完成小兔鲜注册页面的表单验证,具备常见的表单验证本事
  

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

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


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

正则基本使用


  • 定义规则
    1. const reg =  /表达式/
    复制代码

    • 其中/ /是正则表达式字面量
    • 正则表达式也是对象

  • 使用正则

    • test()方法 用来查看正则表达式与指定的字符串是否匹配
    • 假如正则表达式与指定的字符串匹配 ,返回true,否则false

  1. <body>
  2.   <script>
  3.     // 正则表达式的基本使用
  4.     const str = 'web前端开发'
  5.     // 1. 定义规则
  6.     const reg = /web/
  7.     // 2. 使用正则  test()
  8.     console.log(reg.test(str))  // true  如果符合规则匹配上则返回true
  9.     console.log(reg.test('java开发'))  // false  如果不符合规则匹配上则返回 false
  10.   </script>
  11. </body>
复制代码
元字符


  • 普通字符:


  • 大多数的字符仅能够形貌它们自己,这些字符称作普通字符,比方所有的字母和数字。
  • 普通字符只能够匹配字符串中与它们相同的字符。
  • 比如,规定用户只能输入英文26个英笔墨母,普通字符的话 /[abcdefghijklmnopqrstuvwxyz]/

  • 元字符(特别字符)


  • 是一些具有特别含义的字符,可以极大提高了灵活性和强盛的匹配功能。
  • 比如,规定用户只能输入英文26个英笔墨母,换成元字符写法: /[a-z]/
界限符

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

   假如 ^ 和 $ 在一起,表示必须是精确匹配
  1. <body>
  2.   <script>
  3.     // 元字符之边界符
  4.     // 1. 匹配开头的位置 ^
  5.     const reg = /^web/
  6.     console.log(reg.test('web前端'))  // true
  7.     console.log(reg.test('前端web'))  // false
  8.     console.log(reg.test('前端web学习'))  // false
  9.     console.log(reg.test('we'))  // false
  10.     // 2. 匹配结束的位置 $
  11.     const reg1 = /web$/
  12.     console.log(reg1.test('web前端'))  //  false
  13.     console.log(reg1.test('前端web'))  // true
  14.     console.log(reg1.test('前端web学习'))  // false
  15.     console.log(reg1.test('we'))  // false  
  16.     // 3. 精确匹配 ^ $
  17.     const reg2 = /^web$/
  18.     console.log(reg2.test('web前端'))  //  false
  19.     console.log(reg2.test('前端web'))  // false
  20.     console.log(reg2.test('前端web学习'))  // false
  21.     console.log(reg2.test('we'))  // false
  22.     console.log(reg2.test('web'))  // true
  23.     console.log(reg2.test('webweb'))  // flase
  24.   </script>
  25. </body>
复制代码
量词

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

   注意: 逗号左右两侧千万不要出现空格
  1. <body>
  2.   <script>
  3.     // 元字符之量词
  4.     // 1. * 重复次数 >= 0 次
  5.     const reg1 = /^w*$/
  6.     console.log(reg1.test(''))  // true
  7.     console.log(reg1.test('w'))  // true
  8.     console.log(reg1.test('ww'))  // true
  9.     console.log('-----------------------')
  10.     // 2. + 重复次数 >= 1 次
  11.     const reg2 = /^w+$/
  12.     console.log(reg2.test(''))  // false
  13.     console.log(reg2.test('w'))  // true
  14.     console.log(reg2.test('ww'))  // true
  15.     console.log('-----------------------')
  16.     // 3. ? 重复次数  0 || 1
  17.     const reg3 = /^w?$/
  18.     console.log(reg3.test(''))  // true
  19.     console.log(reg3.test('w'))  // true
  20.     console.log(reg3.test('ww'))  // false
  21.     console.log('-----------------------')
  22.     // 4. {n} 重复 n 次
  23.     const reg4 = /^w{3}$/
  24.     console.log(reg4.test(''))  // false
  25.     console.log(reg4.test('w'))  // flase
  26.     console.log(reg4.test('ww'))  // false
  27.     console.log(reg4.test('www'))  // true
  28.     console.log(reg4.test('wwww'))  // false
  29.     console.log('-----------------------')
  30.     // 5. {n,} 重复次数 >= n
  31.     const reg5 = /^w{2,}$/
  32.     console.log(reg5.test(''))  // false
  33.     console.log(reg5.test('w'))  // false
  34.     console.log(reg5.test('ww'))  // true
  35.     console.log(reg5.test('www'))  // true
  36.     console.log('-----------------------')
  37.     // 6. {n,m}   n =< 重复次数 <= m
  38.     const reg6 = /^w{2,4}$/
  39.     console.log(reg6.test('w'))  // false
  40.     console.log(reg6.test('ww'))  // true
  41.     console.log(reg6.test('www'))  // true
  42.     console.log(reg6.test('wwww'))  // true
  43.     console.log(reg6.test('wwwww'))  // false
  44.     // 7. 注意事项: 逗号两侧千万不要加空格否则会匹配失败
  45.   </script>
复制代码
范围

表示字符的范围,定义的规则限定在某个范围,比如只能是英笔墨母,或者数字等等,用表示范围

  1. <body>
  2.   <script>
  3.     // 元字符之范围  []  
  4.     // 1. [abc] 匹配包含的单个字符, 多选1
  5.     const reg1 = /^[abc]$/
  6.     console.log(reg1.test('a'))  // true
  7.     console.log(reg1.test('b'))  // true
  8.     console.log(reg1.test('c'))  // true
  9.     console.log(reg1.test('d'))  // false
  10.     console.log(reg1.test('ab'))  // false
  11.     // 2. [a-z] 连字符 单个
  12.     const reg2 = /^[a-z]$/
  13.     console.log(reg2.test('a'))  // true
  14.     console.log(reg2.test('p'))  // true
  15.     console.log(reg2.test('0'))  // false
  16.     console.log(reg2.test('A'))  // false
  17.     // 想要包含小写字母,大写字母 ,数字
  18.     const reg3 = /^[a-zA-Z0-9]$/
  19.     console.log(reg3.test('B'))  // true
  20.     console.log(reg3.test('b'))  // true
  21.     console.log(reg3.test(9))  // true
  22.     console.log(reg3.test(','))  // flase
  23.     // 用户名可以输入英文字母,数字,可以加下划线,要求 6~16位
  24.     const reg4 = /^[a-zA-Z0-9_]{6,16}$/
  25.     console.log(reg4.test('abcd1'))  // false
  26.     console.log(reg4.test('abcd12'))  // true
  27.     console.log(reg4.test('ABcd12'))  // true
  28.     console.log(reg4.test('ABcd12_'))  // true
  29.     // 3. [^a-z] 取反符
  30.     const reg5 = /^[^a-z]$/
  31.     console.log(reg5.test('a'))  // false
  32.     console.log(reg5.test('A'))  // true
  33.     console.log(reg5.test(8))  // true
  34.   </script>
  35. </body>
复制代码
字符类

某些常见模式的简写方式,区分字母和数字


替换和修饰符

replace 替换方法,可以完成字符的替换

  1. <body>
  2.   <script>
  3.     // 替换和修饰符
  4.     const str = '欢迎大家学习前端,相信大家一定能学好前端,都成为前端大神'
  5.     // 1. 替换  replace  需求:把前端替换为 web
  6.     // 1.1 replace 返回值是替换完毕的字符串
  7.     // const strEnd = str.replace(/前端/, 'web') 只能替换一个
  8.   </script>
  9. </body>
复制代码
修饰符束缚正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等


  • i 是单词 ignore 的缩写,正则匹配时字母不区分大小写
  • g 是单词 global 的缩写,匹配所有满意正则表达式的结果
  1. <body>
  2.   <script>
  3.     // 替换和修饰符
  4.     const str = '欢迎大家学习前端,相信大家一定能学好前端,都成为前端大神'
  5.     // 1. 替换  replace  需求:把前端替换为 web
  6.     // 1.1 replace 返回值是替换完毕的字符串
  7.     // const strEnd = str.replace(/前端/, 'web') 只能替换一个
  8.     // 2. 修饰符 g 全部替换
  9.     const strEnd = str.replace(/前端/g, 'web')
  10.     console.log(strEnd)
  11.   </script>
  12. </body>
复制代码
正则插件


change 事故

给input注册 change 事故,值被修改并且失去核心后触发
判断是否有类


元素.classList.contains() 看看有没有包含某个类,假如有则返回true,么有则返回false
个人实战文档

本次实战是对自己整个 api阶段 的总结。
参考结果如下地址:
http://erabbit.itheima.net/#/product/3995139
本次实战重要分为以下几个模块。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表