Web APIs(八)

180 阅读7分钟

web APIS

一、案例-更换皮肤

1.标签关键代码

<input type="color" />

2.js关键代码

<script>
   const colorInput = document.querySelector("input");
      colorInput.addEventListener("click", function () {
        console.log(this.value);
        document.body.style.backgroundColor = this.value;
      });
</script>

二、本地储存

1.随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,HTML5规范提出了相关解决方案。

2.本地储存特性

①数据存储在用户浏览器中 ②设置、读取方便、甚至页面刷新不丢失数据 ③容量较大,sessionStorage和localStorage约 5M 左右

3.localStorage

①生命周期永久生效,除非手动删除 否则关闭页面也会存在 ②可以多窗口(页面)共享(同一浏览器可以共享) ③以键值对的形式存储使用

4.localStorage语法

①储存数据

localStotage.setItem(key,value)

②获取数据

localStorage.getItem(key)

③删除数据

localStorage.removeItem(key)

④清除数据

localStorage.clear()
<!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>
    <input type="color" />
    <script>
      // 页面刷新   代码重新执行
      document.body.style.backgroundColor = localStorage.getItem("bgColor");

      const colorInput = document.querySelector("input");
      colorInput.addEventListener("click", function () {
        // console.log(this.value);
        document.body.style.backgroundColor = this.value;
        // 设置颜色到本地存储中
        localStorage.setItem("bgColor", this.value);
      });
    </script>
  </body>
</html>

5.储存复杂数据类型存储

①本地只能存储字符串,无法存储复杂数据类型.需要将复杂数据类型转换成JSON字符串,在存储到本地

②JSON.stringify(复杂数据类型):将复杂数据转换成JSON字符串 存储 本地存储中

③JSON.parse(JSON字符串):将JSON字符串转换成对象 取出 时候使用

 <script>
      const strArr = localStorage.getItem("arr");
      //   let arr = [];
      if (strArr) {
        arr = JSON.parse(strArr);
      } else {
        let arr = [];
      }
      let arr = [];
     
     ...
     
       // 给数组插入新的元素
        arr.push(data);
        const strArr = JSON.stringify(arr);
        localStorage.setItem("arr", strArr);
     
       // 执行数组删除元素
        arr.splice(index, 1);
        const strArr = JSON.stringify(arr);
        localStorage.setItem("arr", strArr);
 </script>

6.sessionStorage

①生命周期为关闭浏览器窗口 ②在同一个窗口(页面)下数据可以共享 ③以键值对的形式存储使用 ④用法跟localStorage 基本相同

本地存储的技术 sessionStorage  会话(打开页面到关闭页面之间过程 一次会话  ajax node)存储
      登录的时候 
      它的用法和 localStorage 用法一样 
      区别只有一个 
      sessionStorage 关闭页面后 数据就丢失 
      localStorage 除非是用户主动删除 否则一直存在 直到天荒地老

三、自定义属性

1.固有属性:标签天生自带的属性 比如class id title等, 可以直接使用点语法操作

      // 获取 dom元素的固有属性  通过点语法来获取
      const a = document.querySelector("a");
      // 获取固有属性
      // console.log(a.href);
      // console.log(a.id);

      // 直接修改
      // a.href="http://www.qq.com";
      // a.id="top";

2.自定义属性:由程序员自己添加的属性,在DOM对象中找不到, 无法使用点语法操作,必须使用专门的API

getAttribute('属性名') // 获取自定义属性
setAttribute('属性名', '属性值') // 设置自定义属性
removeAttribute('属性名') // 删除自定义属性


// 获取 getAttribute("属性名")
      // console.log(a.hello);
      // console.log(a.aa);
      // console.log( a.getAttribute("hello") );
      // console.log( a.getAttribute("aa") );

      // 设置 setAttribute(key,value)
      // a.setAttribute("hello","123");

      // 删除掉属性 removeAttribute(key)
      // a.removeAttribute("hello");

      //  自定义属性 -> h5建议的 自定义属性
      // 属性的时候 data-xxx 开头
      //  获取的时候  a.dataset.xxx
      //  设置  a.dataset.index = 3;

      // console.log(a.dataset.index);
      // a.dataset.index = 3;
      小结 
      标签的属性 有两种分为
      1 固有属性  比如 id href src     点语法的方式获取和设置 方便
      2 自定义属性
        1 随机自己瞎命名  
          <a  abc="123" >  
            获取 (getAttribute) 设置 setAttribute(key,value)  删除   removeAttribute(key)
        2 h5建议 data- xxx
          <a  data-abc="123" >  
            获取(a.dataset.abc)  设置(a.dataset.abc=456);
      3 最强大是  (getAttribute)  setAttribute removeAttribute 
            上述的这个方式,可以获取到任意的属性(固有属性和h5建议的自定义属性)
            <a data-index="0" id="nav" href="http://www.baidu.com" hello="no" aa="bb" >跳转</a >
      */
      //  console.log( a.getAttribute("data-index") );
      //  console.log( a.getAttribute("id") );
      //  console.log( a.getAttribute("href") );
      //  console.log( a.getAttribute("hello") );
      //  console.log( a.getAttribute("aa") );

3.data-自定义属性

①传统的自定义属性没有专门的定义规则,开发者随意定值,不够规范,所以在html5中推出来了专门的data-自定义属性。在标签上一律以data-开头,在DOM对象上一律以dataset对象方式获取

②语法

h5建议 data- xxx
      <a  data-abc="123" >  
      获取(a.dataset.abc)  设置(a.dataset.abc=456);

4.案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>13-自定义属性使用演示.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <ul></ul>
    <script>
      // 根据数组 渲染出li标签 点击li标签的时候  根据它对应的颜色 设置到 我body标签背景中

      // 数组
      let arr = [
        { price: "100", title: "去旅游", color: "yellow" },
        { price: "200", title: "去读书", color: "red" },
        { price: "300", title: "去吃饭", color: "blue" },
      ];

      const ul = document.querySelector("ul");
      let html = ``;
      for (let index = 0; index < arr.length; index++) {
        html += `<li data-price="${arr[index].price}" data-color="${arr[index].color}" >${arr[index].title}</li>`;
      }
      ul.innerHTML = html;

      // 事件委托
      ul.addEventListener("click", function (event) {
        // 当前点击的是li标签
        if (event.target.nodeName === "LI") {
          // 设置body标签的背景颜色  等于什么  =  等于当前被点击的元素(li) 身上的自定义属性 data-color
          // document.body.style.backgroundColor = event.target.dataset.color;
          document.body.style.backgroundColor =
            event.target.getAttribute("data-color");
          // alert(
          //   // `你想要去做的事情,要花这么多钱哦 ${event.target.dataset.price}`
          // );
        }
      });
    </script>
  </body>
</html>

四、高阶函数

1.把一个函数 看成是个普通数据,应用在 参数 或者返回值 技术

2.语法

      //  function f1(callback) {
      //    callback();
      //  }

      //  function f2() {
      //    console.log("我就是高阶函数");
      //  }

      //  f1(f2);// f2 当成是一个普通的参数来使用(形参来使用)

五、事件取消与绑定

1.绑定事件

元素.addEventListener(事件类型,函数)

2.取消事件

元素.removeEventListener(事件类型,函数)

3.总结

①addEventListener 可以绑定多个同名事件

②removeEventListener 可以取消对应的事件类型和事件处理函数

③无法取消 addEventListener 事件 对应的匿名函数

      const btn = document.querySelector("button");

      btn.addEventListener("click", function () {
        console.log("你好");
      });

      //  想要取消 这个 输出你好的行为
      btn.removeEventListener("click", function () {
        console.log("你好");
      });

六、事件流补充(目标阶段(补充)、冒泡阶段、捕获阶段)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>16-事件流动.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      div {
        width: 300px;
        height: 300px;
        padding: 20px;
        overflow: hidden;
      }
      .a {
        background-color: red;
      }
      .b {
        background-color: salmon;
      }
      .c {
        background-color: seagreen;
      }
    </style>
  </head>
  <body>
    <div class="a">
      爷爷
      <div class="b">
        爸爸
        <div class="c">儿子</div>
      </div>
    </div>
    <script>
      /* 
      事件流动  3个阶段  
      1 最重要的冒泡阶段
      2 知道  捕获阶段 
        addEventListener 第三个参数  true|false 来进行切换
      3 目标阶段 了解一下 

       */
      const a = document.querySelector(".a");
      const b = document.querySelector(".b");
      const c = document.querySelector(".c");
      a.addEventListener("click", function () {
        console.log("爷爷");
      });
      b.addEventListener("click", function () {
        // 这个c 是最底层的元素
        console.log("爸爸");
      });
      c.addEventListener("click", function () {
        // 这个c 是最底层的元素
        console.log("儿子 目标阶段");
      });
    </script>
  </body>
</html>

七、字符串方法

1.大写转小写

      // 转大写 转小写。
      // let msg = 'dfdfdsf';
      // console.log(msg.toLowerCase()); //转成小写

2.小写转大写

      // 转大写 转小写。
      // let msg = 'HELLODFDFDFDFDFD';
      // console.log(msg.toUpperCase());

3.字符串转数组

      // 字符串和数组很相似
      // 能不能把字符串 转成数组?
      const str = "abcdefg"; //=> ["a","b","c","d","e","f","g"]
      // // split("")   分割
      // console.log(str.split(""));

      // 横线分割的字符串 用双引号中间带-表示("-")
      // const str = 'a-b-c-d-e-f-g'; // ["a","b","c","d","e","f","g"]
      // console.log(str.split('-'));

      // console.dir(str);

4.总结

      1 转大写  toUpperCase()

      2 转小写 toLowerCase()

      3 转数组 str.split('') 按照什么来分割你的字符串变成数组

八、数组方法

1.数组转字符串

      const arr = ["a", "b", "c", "d"];
      // console.log(arr.join("")); // join 数组转字符串
      // console.log(arr.join("-")); // a-b-c-d 数组转字符串

2.数组之间连接

      // 连接  数组和数组之间连接
      // const arr1 = ['1', '2', '3'];
      // const arr2 = ['a', 'b', 'c'];
      // 将两个数组合并成一个数组
      // console.log(arr1.concat(arr2));

3.字符串之间连接

      //字符串也有一个 concat 也是表示合并
      // const str1 = "123";
      // const str2 = "abc";
      // console.log(str1.concat(str2));// 很少用  有什么用? 当你的键盘 + 键坏  使用它
      // console.log(str1 + str2); // 更加简单好理解

九、正则表达式

1.正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。

2.语法

let 变量名 = /表达式/
let reg = /前段/

3.判断是否有符合规则的字符串

test() 方法 用来查看正则表达式与指定的字符串是否匹配

regObj.test(被检测的字符串)

如:
    <script>
      /* 
      正则的作用 寻找字符串  检测 这个字符串这有没有我想要的文字
       */
      //   const str = `金钱对你意味着什么?你有梦想吗?等等等等。一下子都让我陷入了沉思。真的需要好好的想想,然后写下来`;

      // 判断一下这个字符串中有没有 梦想 两个字

      // 定义规则
      //   const reg = /刘同学/;

      // 规则和字符串 匹配  test
      //   console.log(reg.test(str)); // 有 返回true 没有返回false

      const div = document.querySelector("div");
      const str = `你个傻嗨嗨,日日傻嗨嗨,食shi啊梁非凡`;
      const reg = /傻嗨嗨/ && /非凡/;
      if (reg.test(str)) {
        div.innerText = `你个***,日日***,食shi啊梁**`;
        alert("系统提醒:请注意言行举止,营造良好聊天环境");
      } else {
        div.innerText = str;
      }
    </script>

4.检索(查找)符合规则的字符串: exec() 方法 在一个指定字符串中执行一个搜索匹配,找到返回数组,否则为 null

5.元字符

(1)普通字符:大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。 也就是说普通字符只能够匹配字符串中与它们相同的字符。

(2)元字符:是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。

例如:普通字符的话 abcdefghijklm…..但是换成元字符写法: [a-z]

(3)边界符:

① ^ 表示匹配行首文本(以谁开头)

② $ 表示匹配行尾文本(以谁结束)

    <script>
      const str = `金来123`;
      // const reg = /梦想/; // 只要字符串中 包含有 梦想  返回true

      // 你检测的字符串 必须要以 “梦” 开头  以 “想” 结尾
      //
      // const reg = /^金来$/; // 只能匹配 "金来"
      const reg = /^金来/; // `金来123`;
      // const reg = /金来$/; //  `1234323金来`;
      // console.log(reg.test(str));

      /* 
      边界符 
      开头 ^ 
      结尾 $ 
       */
    </script>

(4)量词:

① * 重复零次或者更多次

// const reg=/路飞/;    

// console.log(/^路*$/.test('')); // true
// console.log(/^路*$/.test('路')); // true
// console.log(/^路*$/.test('路路')); // true
// console.log(/^路*$/.test('路路路')); // true

② + 重复一次或者更多次

// const reg=/路飞/;   

// console.log(/^路+$/.test(''));
// console.log(/^路+$/.test('路'));
// console.log(/^路+$/.test('路路'));
// console.log(/^路+$/.test('路路路'));

③ ? 重复零次或者一次

// const reg=/路飞/;    

// console.log(/^路?$/.test(''));// true
// console.log(/^路?$/.test('路')); // true
// console.log(/^路?$/.test('路路')); // false
// console.log(/^路?$/.test('路路路')); // false

④ {n} 重复n次

// const reg=/路飞/;    

// console.log(/^路{2}$/.test('')); // false
// console.log(/^路{2}$/.test('路')); // false
// console.log(/^路{2}$/.test('路路')); // true
// console.log(/^路{2}$/.test('路路路')); // false

⑤ {n,} 重复n次或者更多次

// const reg=/路飞/;    

// console.log(/^路{2,}$/.test('')); // true
// console.log(/^路{2,}$/.test('路')); // true
// console.log(/^路{2,}$/.test('路路'));// true
// console.log(/^路{2,}$/.test('路路路')); // true

⑥ {n,m} 重复n到m次

// const reg=/路飞/;    

// console.log(/^路{0,2}$/.test("")); // true
// console.log(/^路{0,2}$/.test("路")); // true
// console.log(/^路{0,2}$/.test("路路")); // true
// console.log(/^路{0,2}$/.test("路路路")); // false

(5)字符类

①匹配字符集合[]

后面的字符串只要包含[ ] 中任意一个字符,都返回 true 。

比如:
[a-z]  表示 a 到 z 26个英文字母都可以
[a-zA-Z]   表示大小写都可以
[0-9]  表示 0~9 的数字都可以

②[ ] 里面加上 - 连字符 :使用连字符 - 表示一个范围

③[ ] 里面加上 ^ 取反符号 :匹配除了小写字母以外的字符

④ . 匹配除换行符之外的任何单个字符

⑤预定义:指的是某些常见模式的简写方式

1650133553557.png

    <script>
      //  . 表示除了(换行符之外)任意字符
      // console.log(/路/.test('飞')); // false
      // console.log(/./.test('飞')); // true
      // console.log(/路.飞/.test('路大飞')); // true
      // console.log(/路.飞/.test('路小飞')); // true
      // console.log(/路.飞/.test('路中飞')); // true
      // console.log(/路.飞/.test('路不飞')); // true
      // console.log(/路.飞/.test('路飞')); // false
      // console.log(/路.飞/.test('路 飞')); // false

      // \d 表示数字
      // console.log(/\d/.test("路飞"));// false

      // console.log(/\d/.test("1路飞"));// true
      // console.log(/\d/.test("路3飞"));// true

      // \D 不是数字之外的任意1个字符
      // console.log(/\D/.test("123"));// false
      // console.log(/\D/.test("12a3"));// true
      // console.log(/\D/.test("12a3"));// true

      // \w  字母、数字、下划线
      // console.log(/\w/.test("123"));//  true
      // console.log(/\w/.test("%%"));//  false
      // console.log(/\w/.test("%1%"));//  true
      // console.log(/\w/.test("%a%"));//  true
      // console.log(/\w/.test("%_%"));//  true

      // \W  除去了 字母 、数字、下划线 之外字符
      // console.log(/\W/.test("123"));// false
      // console.log(/\W/.test("1%23"));// true

      // \s  匹配空格
      // console.log(/\s/.test("123"));// false
      // console.log(/\s/.test("1 23"));// true

      // \S 除了空格之外的字符
      // console.log(/\S/.test('123'));// true
      // console.log(/\S/.test(' '));// false
      // console.log(/\S/.test('   '));// false
    </script>

(6)测试正则

<script>
      // 注册账号  填写用户名 规则 必须是字母,范围 3-8
      // console.log(/[a-zA-Z]/);// 一个字母
      // console.log(/[a-zA-Z]/.test("a"));// true
      // 3-8
      // {3,8} 修饰前面[]
      // console.log(/[a-zA-Z]{3,8}/.test("ab"));// false
      // console.log(/[a-zA-Z]{3,8}/.test("abc"));// true
      // console.log(/[a-zA-Z]{3,8}/.test("111222 abc 333444"));// true
      // 边界符
      // console.log(/^[a-zA-Z]{3,8}$/.test("111222 abc 333444"));// false
      // console.log(/^[a-zA-Z]{3,8}$/.test("abc"));// true

      // 手机号码 验证  知道手机号码的验证规则 不懂去百度
      // 规则 以数字1开头 第二位数字可以是 35789  其他9位数字 (11位数组)
      // console.log( /^1[35789]\d{9}$/.test("dd")  );// false
      // console.log( /^1[35789]\d{9}$/.test("12345678901")  );// false
      // console.log( /^1[35789]\d{9}$/.test("13345678901"));// false
      // console.log( /^1[35789]\d{9}$/.test("15345678901"));// false
      // console.log( /^1[35789]\d{9}$/.test("17345678901"));// false
      // console.log( /^1[35789]\d{9}$/.test("18345678901"));// false
      // console.log( /^1[35789]\d{9}$/.test("19345678901"));// false

      // 邮箱  yeah123@dsfdf.com
      //  邮箱名称  yeah123   可以是字母或者数字  最少要有一个 {1,} 或者 +
      // 分隔符  @
      // 字母或者数字
      // 匹配一个.   => \.
      // 规定 com  com

      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+$/.test("yeah123@dsfdf"));// true
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+$/.test("@dsfdf"));// false
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+$/.test("sdfd@"));// false
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+$/.test("sdfd@3"));// true

      // console.log(/./.test('a'));
      // 就想要表示. 本身   加一个反斜杠
      // console.log(/\./.test('a'));// false
      // console.log(/\./.test('.'));// true
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$/.test('sdfd@3')); // false
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$/.test('sdfd@3.com')); // true

      // 感受 代码不多 贼难!
      //
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.c(om|n)$/.test('sdfd@3.com')); // true
      // console.log(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.c(om|n)$/.test('sdfd@3.cn')); // true
      // c om
      // c n
    </script>