Web APIs(三)

75 阅读3分钟

Web APIs

一、字符串

1.类似数组的特性

2.属性length当前字符串的长度

3.字符串可以通过下标来访问

let str = 'abc';
str[1]=b

4.字符串可以遍历

二、案例

1.案例-购物车数量改变

(1)思路

①获取标签

      let btn1 = document.querySelector(".btn1");
      let btn2 = document.querySelector(".btn2");
      let box1 = document.querySelector(".box1");

②分别绑定了点击事件

//
btn1.addEventListener("click", function () {

})

btn2.addEventListener("click", function () {

})

③业务 只需要 对 数量做增加即可

num++;
box1.innerText = +num;

num--;
box1.innerText = +num;

④业务 判断 如果数量等于 0 那么就需要禁用 按钮

if (num === 0) {
// disabled  禁用按键 状态 true 或 false
   btn2.disabled = true;
        }
<!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>
      .box {
        display: flex;
      }
      .box1 {
        width: 60px;
        height: 60px;
        border: 1px solid rgb(198, 191, 191);
        text-align: center;
        line-height: 60px;
        font-size: 14px;
      }
      .box2 {
        flex-direction: column;
        justify-content: space-between;
      }
      button {
        display: block;
        width: 30px;
        height: 30px;
      }
      .btn1 {
        margin-bottom: 2px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="box1">0</div>
      <div class="box2">
        <button class="btn1">+</button>
        <button class="btn2">-</button>
      </div>
    </div>
    <script>
      let btn1 = document.querySelector(".btn1");
      let btn2 = document.querySelector(".btn2");
      let box1 = document.querySelector(".box1");

      let num = 0;
      btn1.addEventListener("click", function () {
        num++;
        box1.innerText = +num;
      });
      btn2.addEventListener("click", function () {
        num--;
        //innerText 输出 字符串
        box1.innerText = +num;
        if (num === 0) {
          btn2.disabled = true;
        }
      });
    </script>
  </body>
</html>

2.排他思想

(1)先获取所有同类型的元素

(2)遍历,挨个设置一种样式

(3)单独找到 想要选中的标签 给他设置选中的样式

(4)思路

①先获取到每一个li标签

let list = document.querySelectorAll("li");

②再li标签绑定点击事件

for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
        });
      }

③写处理其他所有的元素 让让他们的背景颜色都变成白色

for (let j = 0; j < list.length; j++) {
            list[j].style.backgroundColor = "#fff";
          }

④事件触发 设置 被点击的li标签 选中的样式

 list[index].addEventListener("click", function () {
          this.style.backgroundColor = "red";
        });
<!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>
      * {
        margin: 0;
        padding: 0;
      }
      ul {
        display: flex;
        list-style: none;
      }
      li {
        width: 100px;
        height: 100px;
        border: 1px solid #000;
        text-align: center;
        line-height: 100px;
        margin-left: 10px;
      }
    </style>
  </head>
  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
    <script>
      let list = document.querySelectorAll("li");
      for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
          for (let j = 0; j < list.length; j++) {
            list[j].style.backgroundColor = "#fff";
          }
          this.style.backgroundColor = "red";
        });
      }
    </script>
  </body>
</html>

3.案例-点击自己输出自己

<!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>
    <h2></h2>
    <ul>
      <li>我是数字1</li>
      <li>我是数字2</li>
      <li>我是数字3</li>
      <li>我是数字4</li>
      <li>我是数字5</li>
      <li>我是数字6</li>
    </ul>
    <script>
      let list = document.querySelectorAll("li");
      let h2 = document.querySelector("h2");

      for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
          console.log(`${list[index].innerHTML}`);
        });
      }
    </script>
  </body>
</html>

4.案例-tab栏

    <script>
      let liList = document.querySelectorAll("li"); // 获取所有的li标签 数组
      for (let index = 0; index < liList.length; index++) {
        // 对所有的li标签  开始绑定点击事件
        liList[index].addEventListener("click", function () {
          // 设置所有的li标签 背景颜色为白色
          setAllLiColor();
          // 设置被点击的li标签 为红色
          this.style.backgroundColor = "red";
        });
      }
      // 设置所有li标签的背景颜色为白色
      function setAllLiColor() {
        for (let j = 0; j < liList.length; j++) {
          liList[j].style.backgroundColor = "#fff";
        }
      }
    </script>

三、节点操作

1.DOM节点:DOM树里每一个内容都称之为节点

2.节点类型:元素、属性、文本

3.查找节点:能够具备根据节点关系查找目标节点的能力

(1)节点关系:父节点、子节点、兄弟节点

①父节点

子元素.parentNode

//返回最近一级的父节点 找不到返回为null

<!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></style>
  </head>
  <body>
    <div class="box">
      <button class="btn">x</button>
      <img src="./imgs/erweima.png" alt="" />
    </div>
    <div class="box">
      <button class="btn">x</button>
      <img src="./imgs/erweima.png" alt="" />
    </div>
    <div class="box">
      <button class="btn">x</button>
      <img src="./imgs/erweima.png" alt="" />
    </div>
    <div class="box">
      <button class="btn">x</button>
      <img src="./imgs/erweima.png" alt="" />
    </div>
    <div class="box">
      <button class="btn">x</button>
      <img src="./imgs/erweima.png" alt="" />
    </div>
    <script>
      let closeBtns = document.querySelectorAll("button");

      // 遍历
      for (let index = 0; index < closeBtns.length; index++) {
        closeBtns[index].addEventListener("click", function () {
          // this 获取到 对应的父元素  隐藏
          // this.parentNode.style.display = 'none';
          // 如果你们写代码的时候也想我一样 没有代码提示
          // 如 像老师一样 手敲每一个字母
          // 真记不住
          // document.parentNode
          // document.body.style.display="none";
          // document.parentNode
          // document.body.style.display="none";
          this.parentNode.style.display = "none";
        });
      }
    </script>
  </body>
</html>

②子节点

父元素.children

// 获得所有子节点、包括文本节点(空格、换行)、注释节点等
// 仅获得所有元素节点
// 返回的还是一个伪数组


  <body>
    <ul>
      <li>a1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <script>
      let ul = document.querySelector("ul");
      let list = document.querySelectorAll("li");

      // 获取ul标签下的 子节点
      // console.log(ul.children);

      //   console.log(ul.childNodes); //
      ul.addEventListener("click", function () {
        for (let index = 0; index < list.length; index++) {
          ul.children[index].style.display = "none";
        }
      });
    </script>
  </body>

③兄弟节点:下一个兄弟节点nextElementSibling、上一个兄弟节点previousElementSibling

  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
      <li>9</li>
      <li>10</li>
    </ul>
    <script>
      let list = document.querySelectorAll("li");
      for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
          list[index].nextElementSibling.style.backgroundColor = "pink";

          list[index].previousElementSibling.style.backgroundColor = "skyblue";
        });
      }
    </script>
  </body>

4.增加节点

(1)创建节点:即创造出一个新的网页元素,再添加到网页内,一般先创建节点,然后插入节点

document.createElement('标签名  如 li div')

(2)追加节点

// 插入到父元素的最后
父元素.appendChild(要插入的元素)

//插入到某个子元素的前面
父元素.insertBefore(插入的元素,在哪个元素前面)

(3)案例

// appendChild案例
<!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;
      }
      ul {
        padding: 20px;
        background-color: yellow;
      }
    </style>
  </head>
  <body>
    <ul>
      <li>1</li>
      <li>2</li>
    </ul>

    <script>
      // 1 创建一个 li标签 节点
      let li = document.createElement("li");

      li.innerText = "这个是新创建的li标签";
      li.style.backgroundColor = "green";

      // 2 把li标签插入到 ul标签中
      let ul = document.querySelector("ul");
      ul.appendChild(li); // 把li标签插入到ul中 父元素的底部 插入子元素
    </script>
  </body>
</html>


//insertBefore案例
<!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>18-insertBefore.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        display: flex;
        justify-content: space-between;
        padding: 100px;
      }
      ul {
        border: 1px solid #000;
        width: 400px;
      }
    </style>
  </head>
  <body>
    <ul class="left">
      <li>a</li>
      <li>b</li>
      <li>c</li>
      <li>d</li>
    </ul>
    <ul class="right">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>

    <script>
      /* 
      insertBefore 也能插入元素 功能也类似 appendChild
      1 如果要插入的元素 是已经存在的  那么insertBefore作用 移动
      2 如果要插入的元素 是新创建的  insertBefore作用 仅仅 插入
      
       */
      let c = document.querySelector(".left li:nth-child(3)");
      let two = document.querySelector(".right li:nth-child(2)");
      let right = document.querySelector(".right");

      //   right.insertBefore(c, two);
      let li = document.createElement("li");
      li.innerText = "新创建的";
      right.insertBefore(li, two);

      // 父元素.insertBefore(要插入的元素,哪个元素的上面);
    </script>
  </body>
</html>

(4)节点的移动和剪切

①实现过程:box1里面的li标签通过点击事假,转移(剪切)到box2里面

②使用到知识点: 父元素.appendChild(换言之 其具备移动 剪切效果)

  <body>
    <div class="box">
      <ul class="box1">
        <li>龙虾</li>
        <li>鲍鱼</li>
        <li>青菜</li>
        <li>火锅</li>
      </ul>
      <ul class="box2"></ul>
    </div>

    <script>
      let list = document.querySelectorAll("li");
      let box2 = document.querySelector(".box2");
      for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
          box2.appendChild(list[index]);
        });
      }
    </script>
  </body>

③优化:左右两边点击 能够 左右移动(知识点:子元素.parentNode),通过确定点击下的li标签在哪个ul(box1/box2)里面,实现左右移动(list[index].parentNode是否box1或box2)

    <script>
      /* 
      问题
      1 移动的方向不确定  
        在判断 点击时候  先判断 哪个ul标签的子元素的长度为 0  就移动到谁哪里
       */

      let list = document.querySelectorAll("li");

      let box1 = document.querySelector(".box1");
      let box2 = document.querySelector(".box2");

      // 准备要插入新元素的  父元素
      let parent;

      for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
          parent = this.parentNode !== box2 ? box2 : box1;

          parent.appendChild(this);
        });
      }
    </script>

四、环境参数this

1.目标:能够分析判断函数运行在不同环境中 this 所指代的对象

2.环境对象指的是函数内部特殊的变量 this ,它代表着当前函数运行时所处的环境 作用:弄清楚this的指向,可以让我们代码更简洁

①函数的调用方式不同,this 指代的对象也不同 ②【谁调用, this 就是谁】 是判断 this 指向的粗略规则 ③直接调用函数,其实相当于是 window.函数,所以 this 指代 window

  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
    <script>
      let list = document.querySelectorAll("li");
      for (let index = 0; index < list.length; index++) {
        list[index].addEventListener("click", function () {
          for (let j = 0; j < list.length; j++) {
            list[j].style.backgroundColor = "#fff";
          }
          this.style.backgroundColor = "red";
        });
      }
    </script>
  </body>

五、统计文本框数字案例、小米搜索框案例

1.数字统计运用到知识点:元素.value.length = num

2.内容替换:元素.innerText/innerHtml

3.隐藏列表:元素.style.display='none'

4.边框样式:元素.style.borderColor = "orangered"