Web API(3)

163 阅读3分钟

一、环境变量

环境对象指的是函数内部特殊的变量 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>
    </ul>
    <script>
        //需求:点击每一个li标签被点击会打印出文本内容 
        let liList=document.querySelectorAll('li')
        for (let index = 0; index < liList.length; index++) {
            liList[index].addEventListener('click',function () {
                // 方式1
                // console.log(liList[index].innerText)
                // 方式2
                //this表示我自己
                console.log(this.innerText)
            })
        }
    </script>
</body>

1649255155780.png

二、编程思想(排他思想)

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

  1. 干掉所有人 使用for循环
  2. 复活他自己 通过this或者下标找到自己或者对应的元素

演示

<body>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <script>
      //获取所有的li标签 数组
       let li=document.querySelectorAll('li')
      //遍历
       for (let index = 0; index < li.length; index++) {
      //对所有的li标签 开始绑定点击时间
         li[index].addEventListener('click',function () {
           for (let i = 0; i < li.length; i++) {
            //  设置所有li标签为紫色
             li[i].style.backgroundColor='blueviolet'
             
           }
          //  设置被点击后变红色
           this.style.backgroundColor='red'
         })
       }

    </script>
</body>

三、节点操作

DOM节点

1.节点操作 DOM节点:DOM树里每一个内容都称之为节点 2.节点类型: ①元素节点:所有的标签 比如 body、 div。 html 是根节点 ②属性节点:所有的属性 比如 href、class属性 ③文本节点:所有的文本 比如标签里面的文字

查找节点
1.父节点查找:

parentNode 属性
返回最近一级的父节点 找不到返回为null

  <body>
    <div>
      <button>div的子元素</button>
    </div>
    <script>
        // 获取到父元素  div标签
      console.dir(button.parentNode); 
    </script>
2.子节点查找:

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

  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <script>
      let ul=document.querySelector('ul')
      //获取ul下面的子节点
      console.log(ul.children);
    </script>
  </body>
3.兄弟关系查找

①下一个兄弟节点 nextElementSibling 属性 ②上一个兄弟节点 previousElementSibling 属性

  <body>
      <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
      </ul>
    <script>
      let lis=document.querySelectorAll('li')
     for (let index = 0; index < lis.length; index++) {
       lis[index].addEventListener('click',function () {
         //上一个兄弟背景颜色变红
   this.previousElementSibling.style.backgroundColor='red'
         //下一个兄弟背景颜色变黄
    this.nextElementSibling.style.backgroundColor='yellow'
       })
     }
    </script>
  </body>

1649351580749.png

4.增加节点

一般情况下,我们新增节点,按照如下操作: 创建一个新的节点 把创建的新的节点放入到指定的元素内部 比如,点击发布按钮,可以新增一条信息 ①创建节点 document.createElement('标签名')

  <body>
      <ul></ul>
    <script>
      //创建一个li标签
      let li=document.createElement('li')
      //打印看看
      console.log(li);
    </script>
  </body>>

要想在界面看到,还得插入到某个父元素中

②父元素.appendChild(元素) 插入到父元素的最后
  <body>
      <ul></ul>
    <script>
      //创建一个li标签
      let li=document.createElement('li')
      // ===================
      //还可以设置li的样式
      // li.innerText='我是新增的li标签'
      // li.style.backgroundColor='pink'
      // ===================
      //获取ul
      let ul=document.querySelector('ul')
      //把li标签插入到ul中
      ul.appendChild(li)
        
      另外append可以插入多个标签
    </script>
  </body>
③父元素.insertBefore(要插入的元素,要放在哪个元素前面) 插入到父元素的前面
  <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作用 仅仅 插入
      
       */
      // 左边第3个
      let c = document.querySelector('.left li:nth-child(3)');
      // 右边第二个
      let two = document.querySelector('.right li:nth-child(2)');
      let right = document.querySelector('.right');
      // 把c插入到右边第二个li的上面
      right.insertBefore(c,two);

    //    也可以创建来插入
      // let li = document.createElement('li');
      // li.innerText = '新创建的';
      // right.insertBefore(li, two);

      // 父元素.insertBefore(要插入的元素,哪个元素的上面);
    </script>
  </body>
④appendChild 剪切/移动

有当前元素作剪切/移动 功能 没有当前元素作插入功能

<body>
  <ul class="left">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
  <ul class="right"></ul>

  <script>
    // 获取左边第二个li
    let li=document.querySelector('.left li:nth-child(1)')
    // 获取右边ul
    let right=document.querySelector('.right')
    // 把左边第一个li 剪切/移动到右边ul
    right.appendChild(li)
  </script>
</body>
⑤createTextNode创建文本节点
    <script>
      // 创建元素节点 使用 createElement
      // 创建文本节点
      let text = document.createTextNode('试试就试试不行就百度');
      // 插入到body认证一下
      document.body.appendChild(text);
    </script>
5.克隆节点

cloneNode会克隆出一个跟原标签一样的元素,括号内传入布尔值: ①若为true,则代表克隆时会包含后代节点一起克隆--深拷贝 ②若为false,则代表克隆时不包含后代节点--浅拷贝,默认为false

<body>
  <div class="box">
    <button></button>
  </div>
 <script>
  //  1.克隆这个节点
   let box=document.querySelector('.box')
  //  2.开始克隆
   let newBox=box.cloneNode() //浅克隆 只克隆自己本身
   let newBox=box.cloneNode(true)//true 深克隆 把div的后代节点一起克隆
  //  3.插入到body标签中
   document.body.appendChild(newBox)
     //等于复制了一份插到body
 </script> 
</body>
6.删除节点

语法: 父元素.removeChild(要删除的元素)

<body>
  <button>删除ul中的某一个标签</button>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ul>
  <script>
    let button=document.querySelector('button')
    let ul=document.querySelector('ul')
    给按钮绑定事件
    button.addEventListener('click',function () {
        选中第一个li 
      let li=document.querySelector('li:nth-child(1)')
		点击一次按钮就删掉第一个
      ul.removeChild(li)
    })
      //删除自己
      ul.remove()
  </script>
</body>

在 JavaScript 原生DOM操作中,要删除元素必须通过父元素删除 注意: ①如不存在父子关系则删除不成功 ②删除节点和隐藏节点(display:none) 有区别的: 隐藏节点还是存在的,但是删除,则从html中删除节点