webApi第三天

107 阅读3分钟

webApi第三天

字符串

1.类似数组的特性

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

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

4.字符串也可以遍历

购物车数量加减案例
<body>
    <div>
        <input type="text" value="1">
        <button class="add"> + </button>
        <button disabled class="sub"> - </button>
    </div>

    <script>
        let inputDom = document.querySelector('input')
        let addDom = document.querySelector('.add')
        let subDom = document.querySelector('.sub')
        let num = 1

        addDom.addEventListener('click',function () {
            inputDom.value = ++num
            //点击+按钮后启用-按钮
            subDom.disabled=false;
        })
        subDom.addEventListener('click',function () {
            inputDom.value = --num
            if (num === 1 ){
                subDom.disabled=true;  //禁用 - 按钮
            }
        })
    </script>
</body>

环境对象

环境对象指的是函数内部特殊的变量 this ,它代表着当前函数运行时所处的环境

作用:弄清楚this的指向,可以让我们代码更简洁

函数的调用方式不同,this 指代的对象也不同

【谁调用, this 就是谁】 是判断 this 指向的粗略规则 直接调用函数,其实相当于是 window.函数,所以 this 指代 window

window是js中一个大大的全局变量,内置就有的,不需要我们创建,平时为了编写代码方便,允许我们使用window的一些属性或者方法的时候,省略了window(其他对象无法做到)

全局函数 全局变量 都是window的一个属性

排他思想

当前元素为A状态,其他元素为B状态

1.使用for循环--干点所有人

2.通过this或者下标找到自己或者对应的元素--复活自己

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>

    <script>
        //获取li标签数组
        let lisDom =document.querySelectorAll('li')
        //循环li标签数组
        for (let index = 0; index < lisDom.length; index++) {
            // 给每一个li标签绑定点击事件
            lisDom[index].addEventListener('click',function () {
                //移出每一个li标签的bgc类名
               for (let i = 0; i < lisDom.length; i++) {
               lisDom[i].classList.remove ('bgc')    
               }  
            //单独给要点击的li标签添加bgc类名
            this.classList.add('bgc')      
            })
        }
    </script>
</body>
tab栏案例
 <body>
    <div class="wrapper">
      <ul class="tab">
        <li class="tab-item active">国际大牌<span></span></li>
        <li class="tab-item">国妆名牌<span></span></li>
        <li class="tab-item">清洁用品<span></span></li>
        <li class="tab-item">男士精品</li>
      </ul>
      <div class="products">
        <div class="main active">
          <a href="###"><img src="imgs/guojidapai.jpg" alt=""/></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/guozhuangmingpin.jpg" alt=""/></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/qingjieyongpin.jpg" alt=""/></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/nanshijingpin.jpg" alt=""/></a>
        </div>
      </div>
    </div>

    <script>
      /* 
      1 给标题标签 给他们绑定点击事件
      2 事件触发 开始使用排他思想
        1 获取所有的要设置标题样式的标签  遍历他们,移除掉 上边框 红色效果
        2 通过 this  给自己单独添加上 上边框红色的效果 

        3 获取到所有的main标签(决定图片显示)  遍历他们 移除掉 一个class active
        4 再获取到要设置的 main标签 让它 添加上一个class active
       */
      let lisDom =document.querySelectorAll('li')
      let mainsDom = document.querySelectorAll('.main')

      for (let index = 0; index < lisDom.length; index++) {
        lisDom[index].addEventListener('click',function () {
          //遍历li标签  移出所有li标签active类名
          for (let i = 0; i < lisDom.length; i++) { 
            lisDom[i].classList.remove('active')           
          }
          //单独给点击的li标签添加active类名
        this.classList.add('active')  
        
        //-------图片div数组-------

        //遍历所有的图片div数组   移出所有图片div标签active类名
        for (let j = 0; j < mainsDom.length; j++) {
          mainsDom[j].classList.remove('active')
        }
        //单独给被点击的li标签对应的图片div标签添加active类名
          mainsDom[index].classList.add('active')
        })
      }
    </script>
  </body>

节点操作

Dom节点

Dom树里面的每一个内容称为节点

节点类型

1.元素节点(重点!!!)

所有的标签 如 body,div.....

html是根节点

2.属性节点

所有的属性 如herf

3.文本节点

所有的文本

4.注释节点

查找节点

父节点查找
parentNode

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

语法:子元素.parentNode

关闭二维码案例
<body>
    <div>
        <img src="./关闭二维码/img/2.png"  class="close">
        <img src="./关闭二维码/img/1.png">
    </div>

    <script>
        //获取 close 标签
        let closeDom = document.querySelector('.close')
        //添加点击事件
        closeDom.addEventListener('click',function () {
            //this.parentNode找到当前点击元素的父元素
            this.parentNode.style.display="none";
        })
    </script>
</body>
子节点查找:
childNodes ()用的较少

获得所有子节点,包括文本节点(空格,换行),注释节点

children(重点)

仅获得所有元素节点 返回的还是一个伪数组

语法:父元素.children

  <body>
    <ul>
      <li>a1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <ul>
      <li>b1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <ul>
      <li>c1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <script>
      /* 
          //获取ul
          let ulDom=document.querySelector("ul");
          //给ul绑定点击事件
          ulDom.addEventListener("click",function(){
            //获取的ul的所有li子元素是个数组,所以需要遍历让所有子元素都隐藏
            for (let index = 0; index < ul.children.length; index++) {
                 ulDom.children[index].style.display="none"
            }
        })*/

      //获取ul标签数组
      let ulsDom=document.querySelectorAll("ul");

      ////遍历ul数组  并挨个绑定点击事件
      for (let index = 0; index < ulsDom.length; index++) {
          ulsDom[index].addEventListener('click',function () {
            //   this.children.style.display='none'
            for (let i = 0; i < this.children.length; i++) {
                this.children[i].style.display='none'
            }
          })          
      }
      
    </script>
  </body>
兄弟节点查找

1.下一个兄弟节点:nextElementSibling

2.上一个兄弟节点: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 lisDom = document.querySelectorAll('li')
        for (let index = 0; index < lisDom.length; index++) {
            lisDom[index].addEventListener('click',function () {
                //下一个兄弟元素
                this.nextElementSibling.style.backgroundColor='orange'
                //上一个兄弟元素
                this.previousElementSibling.style.backgroundColor='greenyellow'
            })
        }
    </script>
</body>

增加节点

1.创建节点

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

**语法: document.createElement('标签名') **:

2.追加节点

插入到父元素的最后一个子元素:

**语法: 父元素.appendChild(要插入的元素) **

appendChild

追加到最后一个子元素。

如果要插入的元素 是已经存在的,那他的作用是移动,剪切过去。

如果插入的元素 是新创建的,那他的作用 仅仅是 插入。

<body>
    <ul>
        <li>1</li>
        <li>2</li>
    </ul>

    <script>
        // 1 创建一个 li标签 节点
        let li = document.createElement('li');
        li.innerText='六一'
        li.style.backgroundColor='orange'

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

插入到父元素中某个子元素的前面:

语法:父元素.insertBefore(要插入的元素,在哪个元素前面)

     <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);

      </script>
</body>
作业 微博发布案例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <link rel="stylesheet" href="./weubo.css" />
</head>

<body>
    <div class="w">
        <div class="controls">
            <img src="./tip.png" alt="" /><br />
            <textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="200"></textarea>
            <div>
                <span class="useCount">0</span>
                <span>/</span>
                <span>200</span>
                <button id="send">发布</button>
            </div>
        </div>
        <div class="contentList">
            <ul></ul>
        </div>
    </div>
    <script>
        let textareaDom = document.querySelector('#area')
        let useCountDom = document.querySelector('.useCount')
        let btnDom = document.querySelector('button')
        let ulDom = document.querySelector('ul')

        textareaDom.addEventListener('input',function () {
            // textareaDom.value.length
            /* let a = textareaDom.value.length;
            console.log(a);
            useCountDom.innerHTML = a ; */
            useCountDom.innerHTML = textareaDom.value.length;
        })

        // button添加点击事件
        // 输入的内容等于li里面的内容 并插入到ul
        //所有要点击button后发生的变化都加在button点击后的函数里面  
        btnDom.addEventListener('click',function () {
            let li = document.createElement('li');
            li.innerText=textareaDom.value;
            ulDom.appendChild(li);
            textareaDom.value = ''
            useCountDom.innerHTML= 0
        })

    </script>
</body>

</html>