02-JS-web API-表单属性-文本域-事件监听-排他思想

183 阅读5分钟

02-JS-web API-表单属性-文本域-事件监听-排他思想

1 设置/修改 表单元素 属性

表单很多情况,也需要修改属性,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框

表单属性中添加就有效果,移除就没有效果,一律使用布尔值表示

如果为true 代表添加了该属性

如果是false 代 表移除了该属性

1 设置普通的输入框

//属性名  . 属性值   
input.value ="文本内容"

2 设置 按钮的禁用

//属性名  . 属性值
button.disabled=true  禁用

 button.disabled=false  启用

3 设置单选框或者复选框

//属性名  . 属性值
radio.checked=true  选中

checkbox.checked=false  取消选中

4 设置下拉列表 select

//属性名  . 属性值
option.selected=true  选中

5 文本域标签 属于表单元素 又是双标签

​ value 与 innerHTML 有区别 ​ 设置 textarea 里面文本的内容的时候 ​ 想要获取 内容 ​ .value 原样获取内容 ​ .innerHTML 获取的内容如果包含html 会转移

    <textarea>1</textarea>
    <script>
      //  获取 文本域标签
      // 属于表单元素 又是双标签
      let textarea = document.querySelector('textarea');

      // 在html想要设置  文本域的内容 直接在标签内写即可
      // <textarea>  你好 </textarea>

      // 获取文本域中的值

      // console.log(textarea.value); // 获取 OK <h1>你好</h1>
      // console.log(textarea.innerText); // 获取  不OK
      // console.log(textarea.innerHTML); // 获取   OK  &lt;h1&gt;你好&lt;/h1&gt;

      // value   有区别  innerHTML
      // 设置 textarea 里面文本的内容的时候
      // 可以选择 在标签内写文本即可
      // 想要获取 内容
      // .value  原样获取内容
      // .innerHTML 获取的内容如果包含html 会转译

      // 通过js的方式来设置内容
      // textarea.value=`<h1>标题</h1>`;  //  ok
      // textarea.innerText=`<h1>标题</h1>`; //  ok
      // textarea.innerHTML=`<h1>标题</h1>`;  //  ok
    </script>

1~5综合HTML

<!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>04-表单属性设置.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <input type="text" class="username" />
    是否同意协定
    <input type="checkbox" class="isarg" />

    <button class="code" disabled>发送验证码</button>

    <select class="sel">
      <option>去泰国</option>
      <option>去非洲</option>
      <option>去印度</option>
      <option>去啊富汗</option>
    </select>

    <!-- <textarea>  你好 </textarea> -->
    <textarea class="d1"> </textarea>
    <textarea class="d2"> </textarea>
    <textarea class="d3"> </textarea>
    <script>
      function init() {
        /*
      innerText innerHTML 主要是用来设置 双标签的文本内容的

       */
        // 获取一下表单 dom元素
        let username = document.querySelector('.username');
        // 复选框
        let isarg = document.querySelector('.isarg');
        // 按钮
        let code = document.querySelector('.code');

        // 设置文本内容
        // username.innerText = '我的用户名';

        // 设置输入框的文本内容
        username.value = '我的用户名';

        // 设置勾选上
        // isarg.checked = true;
        // 不勾选
        // isarg.checked = false;

        // 设置按钮 可以启用 可以点击
        // disabled 禁用
        // code.disabled = true;// 禁用
        code.disabled = false; // 启用

        // select 选中
        let option = document.querySelector('option:nth-child(4)');
        // option.select = true; // 错误的单词
        option.selected = true; // 正确的单词

        // checked  disabled  selected

        /*
      表单属性的总结

      1 设置普通的输入框  input.value ="表单的值"
      2 设置 按钮的禁用
        button.disabled=true   禁用
        button.disabled=false  启用
      3 设置单选框或者复选框
        radio.checked=true   选中
        checkbox.checked=false  取消选中

      4 设置下拉列表 select
        option.selected=true  选中

      5 文本域标签 有点点特殊 !  下一节课再来讲解

       */
      }

      //  获取 文本域标签
      // 属于表单元素 又是双标签
      // let textarea = document.querySelector('textarea');
      // let textarea1 = document.querySelector('.d1');
      // let textarea2= document.querySelector('.d2');
      // let textarea3 = document.querySelector('.d3');
     

      // 在html想要设置  文本域的内容 直接在标签内写即可
      // <textarea>  你好 </textarea>

      // 获取文本域中的值


      // console.log(textarea.value); // 获取 OK <h1>你好</h1>
      // console.log(textarea.innerText); // 获取  不OK
      // console.log(textarea.innerHTML); // 获取   OK  &lt;h1&gt;你好&lt;/h1&gt;


      // value   有区别  innerHTML
      // 设置 textarea 里面文本的内容的时候
      // 可以选择 在标签内写文本即可
      // 想要获取 内容
      // .value  原样获取内容
      // .innerHTML 获取的内容如果包含html 会转移

      // 通过js的方式来设置内容
      textarea1.value=`<h1>标题</h1>`;  //  ok
      textarea2.innerText=`<h1>标题</h1>`; //  ok
      textarea3.innerHTML=`<h1>标题</h1>`;  //  ok
    </script>
  </body>
</html>

2 事件监听-三要素-事件类型

1 事件三要素

1 什么是事件?
 事件是在编程时系统内发生的动作或者发生的事情  

 比如用户在网页上单击一个按钮 
2 什么是事件监听?
就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 注册事件
3 事件监听三要素:

1 事件源: 那个dom元素被事件触发了,要获取dom元素

注意: 获取元素的 ( ' ' ) 要加引号

① 标签类的  就用标签 如:  div

② 类名的  就要在前面加 点  如: .box 

③ ID类的  就要在前面加  #  如:  #box
// 1  获取 元素
let  btn=document.querySelector('button')

2 事件: 用什么方式触发,比如鼠标单击 click、鼠标经过 mouseover 等

注意:

1. 事件类型要加引号
2. 函数是点击之后再去执行,每次
点击都会执行一次
// 2 事件监听(注册事件)   事件类型   函数 
btn.addEventListener( 'click',function(){
})

3 事件调用的函数: 要做什么事 ,执行什么程序

// 2 事件监听(注册事件)   事件类型   函数 
btn.addEventListener( 'click',function(){
        //执行程序
    console.log('我被点击了');
})

2 事件类型-绑定不同的事件

1.常见的鼠标事件

1 鼠标类-点击 ( "click")

	//鼠标点击
	  div.addEventListener("click",function () {
        console.log("click 鼠标点击事件");
      })

2 鼠标类-鼠标经过元素 ( "mouseenter" )

    //   鼠标经过元素
      div.addEventListener("mouseenter",function () {
      console.log("mouseenter 鼠标经过");
      })

3 鼠标类- 鼠标离开元素 ( "mouseleave" )

    //   鼠标离开元素
      div.addEventListener("mouseleave",function () {
      console.log("mouseleave 鼠标离开");
      })

4 鼠标类-鼠标经过 ( "mouseover" )

    //   鼠标经过
      div.addEventListener("mouseover",function () {
        console.log("mouseover 鼠标经过");
      })

5 鼠标类-鼠标离开 ( "mouseout" )

    //   鼠标离开
      div.addEventListener("mouseout",function () {
        console.log("mouseout 离开");
      })
鼠标触发触发条件
click鼠标点击左键触发
mouseover (有冒泡效果) , mouseenter (没有冒泡效果,推荐)鼠标经过触发
mouseout (有冒泡效果) , mouseleave (没有冒泡效果,推荐)鼠标离开触发
focusr获得鼠标焦点触发
blu失去鼠标焦点触发
mousemove鼠标移动触发
mouseup鼠标弹起触发
mousedown鼠标按下触发
2 焦点事件

注意: 只有表单 元素 有获得焦点 失去焦点事件

1 表单标签-获得焦点 ( "focus" )

    //   获得焦点
      input.addEventListener("focus",function () {
        console.log("输入框 获得焦点 ");
        document.body.style.backgroundColor='#000'
      })

2 表单标签-失去焦点 ( "blur" )

      // 失去焦点 
      input.addEventListener("blur",function () {
        console.log("输入框 失去焦点");
        document.body.style.backgroundColor='#fff'
      })
3 键盘事件

注意: 键盘按下事件 div不行 表单标签可以 给body标签添加比较多

1 键盘按下-给body标签添加比较多 ( "keydown" )

    //   给body标签添加比较多
      document.body.addEventListener("keydown",function () {
        console.log("keydown 按下");
      })

2 键盘抬起 ( "keyup" )

    //   键盘抬起
      document.body.addEventListener("keyup",function () {
        console.log("keyup 抬起");
      })
4 文本事件-表单输入触发

在输入框 输入时触发

    //   输入事件 输入框
      input.addEventListener("input",function () {
        console.log("只要你在我的输入框输入了内容,我就触发");
      })

3 拓展-不同的绑定事件 - L0 (on )

使用旧方式 L0 第一个版本的方式绑定点击事件 on+事件类型 = 匿名函数

新版本与旧版本的区别

但是新版本会对就浏览器有些不兼容

1 addEventListener 对一个事件类型 绑定多个处理函数 (新版本-L2)

2 on+事件 对一个事件类型 只能绑定一个处理函数 (旧版本-L0)

    <!-- 以下两种方式都不推荐 了解即可-->
    <!-- <button onclick="console.log(123)" >点击</button> -->
    <!-- <button onclick="show()">点击</button> -->

    <button>点击</button>
    <script>
      // 1 获取dom元素
      let btn = document.querySelector('button');

      // 使用旧方式 L0 第一个版本的方式绑定点击事件  on+事件类型 = 匿名函数
      // on也可以是在 行内 绝对不推荐
      btn.onclick = function () {
        console.log('事件触发啦');
      };
      btn.onclick = function () {
        console.log('事件触发啦');
      };
      btn.onclick = function () {
        console.log('事件触发啦');
      };
      btn.onclick = function () {
        console.log('事件触发啦');
      };
      

      // addEventListener 对一个事件类型 绑定多个处理函数 
      // on+事件 对一个事件类型 只能绑定一个处理函数
      

      // btn.onclick = show;
      // function show() {
      //   console.log('show');
      // }

      // btn.addEventListener("click",function () {
      //   console.log("show");
      // });
      // btn.addEventListener("click",function () {
      //   console.log("show");
      // });
      // btn.addEventListener("click",function () {
      //   console.log("show");
      // });
      // btn.addEventListener("click",function () {
      //   console.log("show");
      // });
    </script>

4 字符串-(补充)也能和数组一样

1 类似数组的特性

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

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

4 字符串也可以遍历

      // 字符串有 数组的长度length
       let str="你们好呀"; 
        str[0]=你 
        str[1]=们
      // 字符串也可以循环
	      for (let index = 0; index < str.length; index++) {
          console.log(str[index]);
     	 }

5 环境对象 ( this)

this = 表示 我自己 this整体的知识

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

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

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

2 【谁调用, this 就是谁】 是判断 this 指向的粗略规则

3 哪个元素绑定点击事件,哪个元素就是this

4 直接调用函数,其实相当于是 window.函数,所以 this 指代 window

      // 需求: 点击每一个 li标签 都可能 打印出 被点击的li标签的文本内容即可
      let liList=document.querySelectorAll("li");

      for (let index = 0; index < liList.length; index++) {
        liList[index].addEventListener("click",function () {
          // console.log(liList[index].innerText);
          console.log(this.innerText); // this = 表示 我自己   this整体的知识
        })
      }

6 排他思想

先用循环把所有标签都 格式化 (大家都一样)

然后再通过 this 或 下标 找到自己或者对应的元素 (再添加样式或类)

      // 先获取到每一个li标签
      // 再li标签绑定点击事件

      // 写处理其他所有的元素 让让他们的背景颜色都变成白色
      // 事件触发 设置 被点击的li标签 选中的样式

      let liList = document.querySelectorAll('li');
      for (let index = 0; index < liList.length; index++) {
        liList[index].addEventListener('click', function () {
          // 给被点击的li标签加上选中样式
          // liList[index].style.backgroundColor = 'red';
          // 先设置每一个li标签的背景颜色 成 白色
          for (let j = 0; j < liList.length; j++) {
            liList[j].style.backgroundColor = '#fff';
          }
          // 再单独设置 被点击的li标签  变成红色
          this.style.backgroundColor = 'red';
        });
      }

7 高阶函数

高阶函数可以被简单理解为函数的高级应用,JavaScript 中函数可以被当成【值】来对待,基于这个特性实现函数的高 级应用。

值 就是 JavaScript 中的数据,如数值 字符串 布尔 对象等

1 函数表达式

函数表达式和普通函数并无本质上的区别

​ 普通函数的声明与调用无顺序限制,推荐做法先声明再调用

​ 函数表达式必须要先声明再调用

函数也是【数据】  

​ 把函数赋值给变量

2 回调函数

如果将函数 A 做为参数传递给函数 B 时,我们称函数 A 为回调函数

简单理解: 当一个函数当做参数来传递给另外一个函数的时候,这个函数就是回调函数

​ 把函数当做另外一个函数的参数传递,这个函数就叫回调函数

​ 回调函数本质还是函数,只不过把它当成参数使用

​ 使用匿名函数做为回调函数比较常见

代码示例:

<!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>14-高阶函数.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <button>按钮</button>
    <script>
      /* 
      在培训阶段, 高阶函数的应用 在react阶段(培训过程最后一个阶段) 大量的应用 
      1 现在讲  会忘记 (必然)
      2 先讲 老师会再复习
      3 有什么用 
        现在的我们的水平太低  还没有到封装代码的程度 所以没有用 

      高阶函数
      把一个函数 看成是个普通数据,应用在 参数 或者返回值  技术  
       */

       function f1(callback) {
         callback();
       }

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

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

      setInterval(f2,1000);// 把f2 当成是一个普通参数  传递给别人使用

       const btn=document.querySelector("button");
       btn.addEventListener("click",f2);// f2 也是高阶函数


      // function getIndex() {
      //   let index=0;
      //   return function () {
      //       index++;
      //       console.log(index);
      //   }
      // }

      // const ff=getIndex();
      // ff();

    </script>
  </body>
</html>

8 案列示范

1 点击按钮-数字-1
  <body>
    <button class="btn1">1000</button>
    <script>


      let btn1 = document.querySelector('.btn1');
      let i=999

      // click 鼠标单击
      btn1.addEventListener('click', function () {
        console.log(i);
        btn1.innerText=i
        --i
      });

        // 1 获取一下 按钮中的文本
        // console.log(button.innerText);

        // let num = button.innerText;// 数据类型是字符串 比较注意 做 +  运算
        // console.log(num + 1);// 字符串拼接
        // console.log(num - 1);// 隐式转换 转成成数字

        // button.innerText = button.innerText - 1;// 不用担心变成字符串
        // button.innerText = button.innerText + 1;// + 变成字符串

        // num = num -1 //  num-=1 //  --num
        // button.innerText -= 1;

        // 字符串 ++  或者 -- 也会做隐式转换!! 
        
        
        // --button.innerText;
        // ++button.innerText
        // button.innerText += 1; // 不会做隐式转换 

      //  button.innerText--;

    </script>
  </body>
2 点击按钮-隐藏
    <button>点我就消失</button>
    <script>


      let button = document.querySelector('button');

      // 注册 绑定点击事件
      button.addEventListener('click', function () {
        // 直接给元素加样式 标签隐藏  ,也可以给其他标签加
        button.style.display='none'
      });
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>
    <h1></h1>
    <button class="btn1">开始随机点名</button>
    <button class="btn2">结束点名</button>

    <script>
      /* 
      优化
      1 把数组的定义 提取到外面 
      2 如果定时器中业务比较繁琐 也可以提取出去到单独函数中 不是必须
      3 bug 点击多次 开始抽奖 ,后面无法停止定时器
        在我们行业中 有专业的术语 节流!! 
        让我们的顺序 一一个的执行 一次一次的执行 不要同时执行多个 

        在一个定时器没有执行结束的时候 不让开启另外一个定时器 

        一个班级的人 都想去上厕所 !! 
        你想要去上厕所的时候 
        1 先看一下里面有没有人
        2 有人了 我就不去  

        3 没有人 我进去了 会把门关上 
        4 解决完毕了 出去同时把门打开 
      
      4 如何解决 点击多次按钮 后面停止定时器的bug n种解法
        1 在开启定时器的时候 我直接禁用了button 不让它再次点击 
          在清除定时器  重新启用按钮即可

        2 在每一次开启定时器的之前,都停止一次定时器
*/

      let btn1 = document.querySelector('.btn1');
      let btn2 = document.querySelector('.btn2');
      let h1 = document.querySelector('h1');
      let arr = ['张飞', '赵云', '刘备', '吕布', '刘婵'];
      let timeId;

      // 定时器要执行的业务逻辑
      function intervalDo() {
        let index = Math.round(Math.random() * (arr.length - 1));
        h1.innerText = arr[index];
        // return undefined
      }

      btn1.addEventListener('click', function () {
        // 先停止定时器 第一次清除 定时器的时候  timeId 是undefined
        // if (timeId) {
        if (timeId !== undefined) {
          // timeId = 是 undefined => bool 是false
          // 当timeId = undefined =false    不满足条件 不会执行 清除了
          clearInterval(timeId);
        }

        // 禁用按钮 不让再次点击
        // btn1.disabled = true;
        timeId = setInterval(intervalDo, 100);
        console.log('开启定时器', timeId);
      });

      btn2.addEventListener('click', function () {
        // 重新启用 开始按钮
        // btn1.disabled = false;
        clearInterval(timeId);
      });
    </script>
  </body>
</html>

4 商品,单选与全选综合使用
<!DOCTYPE html>

<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title>10-商品全选</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      table {
        border-collapse: collapse;
        border-spacing: 0;
        border: 1px solid #c0c0c0;
        width: 500px;
        margin: 100px auto;
        text-align: center;
      }

      th {
        background-color: #09c;
        font: bold 16px '微软雅黑';
        color: #fff;
        height: 24px;
      }

      td {
        border: 1px solid #d0d0d0;
        color: #404060;
        padding: 10px;
      }

      .allCheck {
        width: 80px;
      }
    </style>
  </head>

  <body>
    <table>
      <tr>
        <th class="allCheck">
          <input type="checkbox" name="" id="checkAll" />
          <span class="all">全选</span>
        </th>
        <th>商品</th>
        <th>商家</th>
        <th>价格</th>
      </tr>
      <tr>
        <td>
          <input type="checkbox" name="check" class="ck" />
        </td>
        <td>小米手机</td>
        <td>小米</td>
        <td>¥1999</td>
      </tr>
      <tr>
        <td>
          <input type="checkbox" name="check" class="ck" />
        </td>
        <td>小米净水器</td>
        <td>小米</td>
        <td>¥4999</td>
      </tr>
      <tr>
        <td>
          <input type="checkbox" name="check" class="ck" />
        </td>
        <td>小米电视</td>
        <td>小米</td>
        <td>¥5999</td>
      </tr>
    </table>

    <script>
      /* 
      1 获取 全选标签 绑定点击事件
        checkAll

      2 点击事件触发后 获取 复选框的选中属性  checkAll.checked

      3 把全选按钮的选中状态 设置到每一个 其他复选框中 

      4 数组和循环思想  解决重复工作的
        
       */

      let checkAll = document.querySelector('#checkAll');

      // 获取符合选择器要求的数组
      let checkboxList = document.querySelectorAll('.ck');
      // console.log(checkboxList);

      //  监听点击 绑定点击 注册点击 订阅点击
      checkAll.addEventListener('click', function () {
        // console.log('全选');
        // console.log(checkAll.checked); // 获取当前全选按钮的选中状态
        // 设置复选框 选中状态等于 全选框的选中状态

        for (let index = 0; index < checkboxList.length; index++) {
          // checkboxList[index] // 每一个复选框
          checkboxList[index].checked = checkAll.checked;
        }
      });


          // 一组商品的 点击功能
    // 给每一个商品绑定点击事件
    for (let index = 0; index < checkboxList.length; index++) {
      checkboxList[index].addEventListener('click', function () {
        // 判断是否达到了全选 条件
        let checked = isAllChecked();
        // 设置全选按钮即可
        checkAll.checked = checked;
      });
    }

      /* 
      1 获取商品数组 
      2 遍历他们绑定点击事件
      3 事件触发了 判断当前的是否达到了全选的状态
      4 把 状态也设置到 全选按钮中
       */

      // 给每一个商品绑定点击事件
      for (let index = 0; index < checkboxList.length; index++) {
        checkboxList[index].addEventListener('click', function () {
          // 判断是否达到了全选 条件
          let checked = isAllChecked();
          // 设置全选按钮即可
          checkAll.checked=checked;
        });
      }

      // 函数来判断
      function isAllChecked() {
        // 1 存放选中的商品的数量
        let checkedNum = 0;
        // 2 商品数组做循环
        for (let index = 0; index < checkboxList.length; index++) {
          // 3  判断每一商品的选中状态
          if (checkboxList[index].checked) {
            checkedNum++;
          }
        }
        // 4 循环结束了 判断 选中商品的数量和 商品总数量之间的关系
        if (checkedNum === checkboxList.length) {
          // console.log('全选');
          return true;
        } else {
          // console.log('不全选');
          return false;
        }
      }
    </script>
  </body>
</html>
5 购物车加减按钮(数字加减)
<body>
    <h1>1</h1>
    <button class="d1">+</button>
    <button disabled class="d2">-</button>



    <script>
        let h1=document.querySelector('h1')
        let btn1=document.querySelector('.d1')
        let btn2=document.querySelector('.d2')

        // 增加
        btn1.addEventListener('click',function(){
            // H1的文字也是字符串类型,给他++就是数字增加
            h1.innerText++;
            btn2.disabled='false'
        })
        // 减少
        btn2.addEventListener('click',function(){
        
            h1.innerText--;

             if(h1.innerText==1){
                btn2.disabled='true' //禁用  按钮
             }  
        })
    </script>
</body>
6 排他思想-点谁,谁变色,其他人不变
    <title>06-怕他思想的应用.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      ul {
        list-style: none;
        width: 600px;
        height: 100px;
        display: flex;

        margin: 100px auto;
        border: 1px solid #ccc;
      }
      li {
        display: flex;
        flex: 1;
        align-items: center;
        justify-content: center;
        font-size: 30px;
      }
    </style>
  </head>
  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
    </ul>

    <script>
      // 先获取到每一个li标签
      // 再li标签绑定点击事件

      // 写处理其他所有的元素 让让他们的背景颜色都变成白色
      // 事件触发 设置 被点击的li标签 选中的样式

      let liList = document.querySelectorAll('li');
      for (let index = 0; index < liList.length; index++) {
        liList[index].addEventListener('click', function () {
          // 给被点击的li标签加上选中样式
          // liList[index].style.backgroundColor = 'red';
          // 先设置每一个li标签的背景颜色 成 白色
          for (let j = 0; j < liList.length; j++) {
            liList[j].style.backgroundColor = '#fff';
          }
          // 再单独设置 被点击的li标签  变成红色
          this.style.backgroundColor = 'red';
        });
      }

    </script>
  </body>
</html
7 Tab栏切换案例
<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }

      ul {
        list-style: none;
      }

      .wrapper {
        width: 1000px;
        height: 475px;
        margin: 0 auto;
        margin-top: 100px;
      }

      .tab {
        border: 1px solid #ddd;
        border-bottom: 0;
        height: 36px;
        width: 320px;
      }

      .tab li {
        position: relative;
        float: left;
        width: 80px;
        height: 34px;
        line-height: 34px;
        text-align: center;
        cursor: pointer;
        border-top: 4px solid #fff;
      }

      .tab span {
        position: absolute;
        right: 0;
        top: 10px;
        background: #ddd;
        width: 1px;
        height: 14px;
        overflow: hidden;
      }

      .products {
        width: 1002px;
        border: 1px solid #ddd;
        height: 476px;
      }

      .products .main {
        float: left;
        display: none;
      }

      .products .main.active {
        display: block;
      }

      .tab li.active {
        border-color: red;
        border-bottom: 0;
      }
    </style>
  </head>

  <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">1
          <a href="###"><img src="imgs/guojidapai.jpg" alt="" /></a>
        </div>
        <div class="main">2
          <a href="###"><img src="imgs/guozhuangmingpin.jpg" alt="" /></a>
        </div>
        <div class="main">3
          <a href="###"><img src="imgs/qingjieyongpin.jpg" alt="" /></a>
        </div>
        <div class="main">4
          <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 liList = document.querySelectorAll('li');
      let mainList = document.querySelectorAll('.main');

      for (let index = 0; index < liList.length; index++) {
        liList[index].addEventListener('click', function () {
          // 遍历li标签 移除他们身上的类 active
          for (let j = 0; j < liList.length; j++) {
            liList[j].classList.remove('active');
          }
          // 单独对我自己 添加一个类
          this.classList.add('active'); // this = li标签 

          // 处理图片显示部分

          // 先遍历所有的main标签 让他们移除掉 active
          for (let j = 0; j < mainList.length; j++) {
            mainList[j].classList.remove('active');
          }

          // 设置给对应的标签 添加上 active
          // 单独对我自己 添加一个类
          // mainList[index] // index 就是和被点击li标签的下标 
          mainList[index].classList.add('active');
        });
      }
    </script>
  </body>
</html>