5 操作元素

5.1 改变元素内容

  • 从起始位置到终止位置的内容, 但它去除 html 标签, 同时空格和换行也会去掉
      element.innerText
    
  • 起始位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行

      element.innerHTML
    
  • innerText 和 innerHTML的区别

      <div></div>
      <p>
          我是文字
          <span>123</span>
      </p>
      <script>
          <!-- innerText 和 innerHTML的区别  -->
          // 1. innerText 不识别html标签 非标准  去除空格和换行
          var div = document.querySelector('div');
          // div.innerText = '<strong>今天是:</strong> 2019';
          // 2. innerHTML 识别html标签 W3C标准 保留空格和换行的
          div.innerHTML = '<strong>今天是:</strong> 2019';
          // 这两个属性是可读写的  可以获取元素里面的内容
          var p = document.querySelector('p');
          console.log(p.innerText);
          console.log(p.innerHTML);
      </script>
    
  • 显示系统时间

      <button>显示当前系统时间</button>
      <div>某个时间</div>
      <p>1123</p>
      <script>
          // 当我们点击了按钮,  div里面的文字会发生变化
          // 1. 获取元素 
          var btn = document.querySelector('button');
          var div = document.querySelector('div');
          // 2.注册事件
          btn.onclick = function() {
              // div.innerText = '2019-6-6';
              div.innerHTML = getDate();
          }
    
          function getDate() {
              var date = new Date();
              // 我们写一个 2019年 5月 1日 星期三
              var year = date.getFullYear();
              var month = date.getMonth() + 1;
              var dates = date.getDate();
              var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
              var day = date.getDay();
              return '今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day];
          }
          // 我们元素可以不用添加事件
          var p = document.querySelector('p');
          p.innerHTML = getDate();
      </script>
    

5.2 常用元素的属性操作

  • innerText、innerHTML 改变元素内容
  • src、href
  • id、alt、title
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button> <br>
<img src="images/ldh.jpg" alt="" title="刘德华">

<script>
    // 修改元素属性  src
    // 1. 获取元素
    var ldh = document.getElementById('ldh');
    var zxy = document.getElementById('zxy');
    var img = document.querySelector('img');
    // 2. 注册事件  处理程序
    zxy.onclick = function() {
        img.src = 'images/zxy.jpg';
        img.title = '张学友思密达';
    }
    ldh.onclick = function() {
        img.src = 'images/ldh.jpg';
        img.title = '刘德华';
    }
</script>

5.3 表单元素的属性操作

  • 利用 DOM 可以操作如下表单元素的属性:
    • type、value、checked、selected、disabled
<button>按钮</button>
<input type="text" value="输入内容">
<script>
    // 1. 获取元素
    var btn = document.querySelector('button');
    var input = document.querySelector('input');
    // 2. 注册事件 处理程序
    btn.onclick = function() {
        // input.innerHTML = '点击了';  这个是 普通盒子 比如 div 标签里面的内容
        // 表单里面的值 文字内容是通过 value 来修改的
        input.value = '被点击了';
        // 如果想要某个表单被禁用 不能再点击 disabled  我们想要这个按钮 button禁用
        // btn.disabled = true;
        this.disabled = true;
        // this 指向的是事件函数的调用者 btn
    }
</script>

5.4 样式属性操作

  • 我们可以通过 JS 修改元素的大小、颜色、位置等样式
      1. element.style 行内样式操作
      2. element.className 类名样式操作
    
  • JS 里面的样式采取驼峰命名法 比如 fontSize、 backgroundColor
  • JS 修改 style 样式操作,产生的是行内样式,CSS 权重比较高
<!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>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div></div>
    <script>
        // 1. 获取元素
        var div = document.querySelector('div');
        // 2. 注册事件 处理程序
        div.onclick = function() {
            // div.style里面的属性 采取驼峰命名法 
            this.style.backgroundColor = 'purple';
            this.style.width = '250px';
        }
    </script>
</body>

</html>
  • 注意:
    • 如果样式修改较多,可以采取操作类名方式更改元素样式。
    • class因为是个保留字,因此使用className来操作元素类名属性
    • className 会直接更改元素的类名,会覆盖原先的类名
<!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>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
        }

        .change {
            background-color: purple;
            color: #fff;
            font-size: 25px;
            margin-top: 100px;
        }
    </style>
</head>


<body>
    <div class="first">文本</div>
    <script>
        // 1. 使用 element.style 获得修改元素样式  如果样式比较少 或者 功能简单的情况下使用
        var test = document.querySelector('div');
        test.onclick = function() {
            // this.style.backgroundColor = 'purple';
            // this.style.color = '#fff';
            // this.style.fontSize = '25px';
            // this.style.marginTop = '100px';
            // 让我们当前元素的类名改为了 change

            // 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况
            // 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器
            // this.className = 'change';
            this.className = 'first change';
        }
    </script>
</body>

</html>

5.5 排他思想

  • 如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
    1. 所有元素全部清除样式(干掉其他人)
    2. 给当前元素设置样式 (留下我自己)
    3. 注意顺序不能颠倒,首先干掉其他人,再设置自己
<!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>
</head>

<body>
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
    <script>
        // 1. 获取所有按钮元素
        var btns = document.getElementsByTagName('button');
        // btns得到的是伪数组  里面的每一个元素 btns[i]
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                // (1) 我们先把所有的按钮背景颜色去掉  干掉所有人
                for (var i = 0; i < btns.length; i++) {
                    btns[i].style.backgroundColor = '';
                }
                // (2) 然后才让当前的元素背景颜色为pink 留下我自己
                this.style.backgroundColor = 'pink';

            }
        }
        //2. 首先先排除其他人,然后才设置自己的样式 这种排除其他人的思想我们成为排他思想
    </script>
</body>

</html>

5.6 自定义属性的操作

  • 获取属性值
    • element.属性 获取属性值。
    • element.getAttribute('属性');
  • 区别:
    • element.属性 获取内置属性值(元素本身自带的属性)
    • element.getAttribute(‘属性’); 主要获得自定义的属性 (标准) 我们程序员自定义的属性
  • 设置属性值
    • element.属性 = ‘值’ 设置内置属性值。
    • element.setAttribute('属性', '值');
  • 区别:
    • element.属性 设置内置属性值
    • element.setAttribute(‘属性’); 主要设置自定义的属性 (标准)
  • 移除属性
    • element.removeAttribute('属性');
<!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>
</head>

<body>
    <div id="demo" index="1" class="nav"></div>
    <script>
        var div = document.querySelector('div');
        // 1. 获取元素的属性值
        // (1) element.属性
        console.log(div.id);
        //(2) element.getAttribute('属性')  get得到获取 attribute 属性的意思 我们程序员自己添加的属性我们称为自定义属性 index
        console.log(div.getAttribute('id'));
        console.log(div.getAttribute('index'));
        // 2. 设置元素属性值
        // (1) element.属性= '值'
        div.id = 'test';
        div.className = 'navs';
        // (2) element.setAttribute('属性', '值');  主要针对于自定义属性
        div.setAttribute('index', 2);
        div.setAttribute('class', 'footer'); // class 特殊  这里面写的就是class 不是className
        // 3 移除属性 removeAttribute(属性)    
        div.removeAttribute('index');
    </script>
</body>

</html>

5.7 综合案例

5.7.1 分时显示不同图片,显示不同问候语

  • 需求:
    • 根据不同时间,页面显示不同图片,同时显示不同的问候语
    • 如果上午时间打开页面,显示上午好,显示上午的图片
    • 如果下午时间打开页面,显示下午好,显示下午的图片
    • 如果晚上时间打开页面,显示晚上好,显示晚上的图片
  • 分析:
    • 根据系统不同时间来判断,所以需要用到日期内置对象
    • 利用多分支语句来设置不同的图片
    • 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
    • 需要一个div元素,显示不同问候语,修改元素内容即可
  • 实现代码:

      <!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>
          <style>
              img {
                  width: 300px;
              }
          </style>
      </head>
    
      <body>
          <img src="images/s.gif" alt="">
          <div>上午好</div>
          <script>
              // 根据系统不同时间来判断,所以需要用到日期内置对象
              // 利用多分支语句来设置不同的图片
              // 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
              // 需要一个div元素,显示不同问候语,修改元素内容即可
              // 1.获取元素
              var img = document.querySelector('img');
              var div = document.querySelector('div');
              // 2. 得到当前的小时数
              var date = new Date();
              var h = date.getHours();
              // 3. 判断小时数改变图片和文字信息
              if (h < 12) {
                  img.src = 'images/s.gif';
                  div.innerHTML = '亲,上午好,好好写代码';
              } else if (h < 18) {
                  img.src = 'images/x.gif';
                  div.innerHTML = '亲,下午好,好好写代码';
              } else {
                  img.src = 'images/w.gif';
                  div.innerHTML = '亲,晚上好,好好写代码';
    
              }
          </script>
      </body>
    
      </html>
    

5.7.2 仿京东显示密码

  • 需求:
    • 点击按钮将密码框切换为文本框,并可以查看密码明文
  • 分析:
    • 核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
    • 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
    • 算法:利用一个flag变量,来判断flag的值,如果是1 就切换为文本框,flag 设置为0,如果是0 就切换为密码框,flag设置为1
  • 实现代码:

      <!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>
          <style>
              .box {
                  position: relative;
                  width: 400px;
                  border-bottom: 1px solid #ccc;
                  margin: 100px auto;
              }
    
              .box input {
                  width: 370px;
                  height: 30px;
                  border: 0;
                  outline: none;
              }
    
              .box img {
                  position: absolute;
                  top: 2px;
                  right: 2px;
                  width: 24px;
              }
          </style>
      </head>
    
      <body>
          <div class="box">
              <label for="">
                  <img src="images/close.png" alt="" id="eye">
              </label>
              <input type="password" name="" id="pwd">
          </div>
          <script>
              // 1. 获取元素
              var eye = document.getElementById('eye');
              var pwd = document.getElementById('pwd');
              // 2. 注册事件 处理程序
              var flag = 0;
              eye.onclick = function() {
                  // 点击一次之后, flag 一定要变化
                  if (flag == 0) {
                      pwd.type = 'text';
                      eye.src = 'images/open.png';
                      flag = 1; // 赋值操作
                  } else {
                      pwd.type = 'password';
                      eye.src = 'images/close.png';
                      flag = 0;
                  }
    
              }
          </script>
      </body>
    
      </html>
    

5.7.3 淘宝点击关闭二维码

  • 需求:
    • 当鼠标点击二维码关闭按钮的时候,则关闭整个二维码
  • 分析:
    • 核心思路: 利用样式的显示和隐藏完成, display:none 隐藏元素 display:block 显示元素
    • 点击按钮,就让这个二维码盒子隐藏起来即可
  • 实现代码:

      <!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>
          <style>
              .box {
                  position: relative;
                  width: 74px;
                  height: 88px;
                  border: 1px solid #ccc;
                  margin: 100px auto;
                  font-size: 12px;
                  text-align: center;
                  color: #f40;
                  /* display: block; */
              }
    
              .box img {
                  width: 60px;
                  margin-top: 5px;
              }
    
              .close-btn {
                  position: absolute;
                  top: -1px;
                  left: -16px;
                  width: 14px;
                  height: 14px;
                  border: 1px solid #ccc;
                  line-height: 14px;
                  font-family: Arial, Helvetica, sans-serif;
                  cursor: pointer;
              }
          </style>
      </head>
    
      <body>
          <div class="box">
              淘宝二维码
              <img src="images/tao.png" alt="">
              <i class="close-btn">×</i>
          </div>
          <script>
              // 1. 获取元素 
              var btn = document.querySelector('.close-btn');
              var box = document.querySelector('.box');
              // 2.注册事件 程序处理
              btn.onclick = function() {
                  box.style.display = 'none';
              }
          </script>
      </body>
    
      </html>
    

5.7.4 循环精灵图背景

  • 需求:
    • 可以利用 for 循环设置一组元素的精灵图背景
  • 分析:
    • 首先精灵图图片排列有规律的
    • 核心思路: 利用for循环 修改精灵图片的 背景位置 background-position
    • 剩下的就是考验你的数学功底了
    • 让循环里面的 i 索引号 * 44 就是每个图片的y坐标
  • 实现代码:

      <!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>
          <style>
              * {
                  margin: 0;
                  padding: 0;
              }
    
              li {
                  list-style-type: none;
              }
    
              .box {
                  width: 250px;
                  margin: 100px auto;
              }
    
              .box li {
                  float: left;
                  width: 24px;
                  height: 24px;
                  background-color: pink;
                  margin: 15px;
                  background: url(images/sprite.png) no-repeat;
              }
          </style>
      </head>
    
      <body>
          <div class="box">
              <ul>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
                  <li></li>
              </ul>
          </div>
          <script>
              // 1. 获取元素 所有的小li 
              var lis = document.querySelectorAll('li');
              for (var i = 0; i < lis.length; i++) {
                  // 让索引号 乘以 44 就是每个li 的背景y坐标  index就是我们的y坐标
                  var index = i * 44;
                  lis[i].style.backgroundPosition = '0 -' + index + 'px';
              }
          </script>
      </body>
    
      </html>
    

5.7.5 显示隐藏文本框内容

  • 需求:
    • 当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示
  • 分析:
    • 首先表单需要2个新事件,获得焦点 onfocus 失去焦点 onblur
    • 如果获得焦点, 判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容
    • 如果失去焦点, 判断表单内容是否为空,如果为空,则表单内容改为默认文字
  • 实现代码:

      <!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>
          <style>
              input {
                  color: #999;
              }
          </style>
      </head>
    
      <body>
          <input type="text" value="手机">
          <script>
              // 1.获取元素
              var text = document.querySelector('input');
              // 2.注册事件 获得焦点事件 onfocus 
              text.onfocus = function() {
                      // console.log('得到了焦点');
                      if (this.value === '手机') {
                          this.value = '';
                      }
                      // 获得焦点需要把文本框里面的文字颜色变黑
                      this.style.color = '#333';
                  }
                  // 3. 注册事件 失去焦点事件 onblur
              text.onblur = function() {
                  // console.log('失去了焦点');
                  if (this.value === '') {
                      this.value = '手机';
                  }
                  // 失去焦点需要把文本框里面的文字颜色变浅色
                  this.style.color = '#999';
              }
          </script>
    
      </body>
    
      </html>
    

5.7.6 百度换肤

  • 需求:
    • 百度换肤
  • 分析:
    • 这个案例练习的是给一组元素注册事件
    • 给4个小图片利用循环注册点击事件
    • 当我们点击了这个图片,让我们页面背景改为当前的图片
    • 核心算法: 把当前图片的src 路径取过来,给 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>
          <style>
              * {
                  margin: 0;
                  padding: 0;
              }
    
              body {
                  background: url(images/1.jpg) no-repeat center top;
              }
    
              li {
                  list-style: none;
              }
    
              .baidu {
                  overflow: hidden;
                  margin: 100px auto;
                  background-color: #fff;
                  width: 410px;
                  padding-top: 3px;
              }
    
              .baidu li {
                  float: left;
                  margin: 0 1px;
                  cursor: pointer;
              }
    
              .baidu img {
                  width: 100px;
              }
          </style>
      </head>
    
      <body>
          <ul class="baidu">
              <li><img src="images/1.jpg"></li>
              <li><img src="images/2.jpg"></li>
              <li><img src="images/3.jpg"></li>
              <li><img src="images/4.jpg"></li>
          </ul>
          <script>
              // 1. 获取元素 
              var imgs = document.querySelector('.baidu').querySelectorAll('img');
              // console.log(imgs);
              // 2. 循环注册事件 
              for (var i = 0; i < imgs.length; i++) {
                  imgs[i].onclick = function() {
                      // this.src 就是我们点击图片的路径   images/2.jpg
                      // console.log(this.src);
                      // 把这个路径 this.src 给body 就可以了
                      document.body.style.backgroundImage = 'url(' + this.src + ')';
                  }
              }
          </script>
      </body>
    
      </html>
    

5.7.7 表格隔行变色

  • 需求:
    • 表格隔行变色
  • 分析:
    • 用到新的鼠标事件 鼠标经过 onmouseover 鼠标离开 onmouseout
    • 核心思路:鼠标经过 tr 行,当前的行变背景颜色, 鼠标离开去掉当前的背景颜色
    • 注意: 第一行(thead里面的行)不需要变换颜色,因此我们获取的是 tbody 里面的行
  • 实现代码:

      <!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>
          <style>
              table {
                  width: 800px;
                  margin: 100px auto;
                  text-align: center;
                  border-collapse: collapse;
                  font-size: 14px;
              }
    
              thead tr {
                  height: 30px;
                  background-color: skyblue;
              }
    
              tbody tr {
                  height: 30px;
              }
    
              tbody td {
                  border-bottom: 1px solid #d7d7d7;
                  font-size: 12px;
                  color: blue;
              }
    
              .bg {
                  background-color: pink;
              }
          </style>
      </head>
    
      <body>
          <table>
              <thead>
                  <tr>
                      <th>代码</th>
                      <th>名称</th>
                      <th>最新公布净值</th>
                      <th>累计净值</th>
                      <th>前单位净值</th>
                      <th>净值增长率</th>
                  </tr>
              </thead>
              <tbody>
                  <tr>
                      <td>003526</td>
                      <td>农银金穗3个月定期开放债券</td>
                      <td>1.075</td>
                      <td>1.079</td>
                      <td>1.074</td>
                      <td>+0.047%</td>
                  </tr>
                  <tr>
                      <td>003526</td>
                      <td>农银金穗3个月定期开放债券</td>
                      <td>1.075</td>
                      <td>1.079</td>
                      <td>1.074</td>
                      <td>+0.047%</td>
                  </tr>
                  <tr>
                      <td>003526</td>
                      <td>农银金穗3个月定期开放债券</td>
                      <td>1.075</td>
                      <td>1.079</td>
                      <td>1.074</td>
                      <td>+0.047%</td>
                  </tr>
                  <tr>
                      <td>003526</td>
                      <td>农银金穗3个月定期开放债券</td>
                      <td>1.075</td>
                      <td>1.079</td>
                      <td>1.074</td>
                      <td>+0.047%</td>
                  </tr>
                  <tr>
                      <td>003526</td>
                      <td>农银金穗3个月定期开放债券</td>
                      <td>1.075</td>
                      <td>1.079</td>
                      <td>1.074</td>
                      <td>+0.047%</td>
                  </tr>
                  <tr>
                      <td>003526</td>
                      <td>农银金穗3个月定期开放债券</td>
                      <td>1.075</td>
                      <td>1.079</td>
                      <td>1.074</td>
                      <td>+0.047%</td>
                  </tr>
              </tbody>
          </table>
          <script>
              // 1.获取元素 获取的是 tbody 里面所有的行
              var trs = document.querySelector('tbody').querySelectorAll('tr');
              // 2. 利用循环绑定注册事件
              for (var i = 0; i < trs.length; i++) {
                  // 3. 鼠标经过事件 onmouseover
                  trs[i].onmouseover = function() {
                          // console.log(11);
                          this.className = 'bg';
                      }
                      // 4. 鼠标离开事件 onmouseout
                  trs[i].onmouseout = function() {
                      this.className = '';
                  }
              }
          </script>
      </body>
    
      </html>
    

5.7.8 表单全选取消全选案例

  • 需求:
    1. 点击上面全选复选框,下面所有的复选框都选中(全选)
    2. 再次点击全选复选框,下面所有的复选框都不中选(取消全选)
    3. 如果下面复选框全部选中,上面全选按钮就自动选中
    4. 如果下面复选框有一个没有选中,上面全选按钮就不选中
    5. 所有复选框一开始默认都没选中状态
  • 分析:
    • 全选和取消全选做法: 让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可
    • 下面复选框需要全部选中, 上面全选才能选中做法: 给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的, 上面全选就不选中
    • 可以设置一个变量,来控制全选是否选中
  • 实现代码:

      <!DOCTYPE html>
      <html>
    
      <head lang="en">
          <meta charset="UTF-8">
          <title></title>
          <style>
              * {
                  padding: 0;
                  margin: 0;
              }
    
              .wrap {
                  width: 300px;
                  margin: 100px auto 0;
              }
    
              table {
                  border-collapse: collapse;
                  border-spacing: 0;
                  border: 1px solid #c0c0c0;
                  width: 300px;
              }
    
              th,
              td {
                  border: 1px solid #d0d0d0;
                  color: #404060;
                  padding: 10px;
              }
    
              th {
                  background-color: #09c;
                  font: bold 16px "微软雅黑";
                  color: #fff;
              }
    
              td {
                  font: 14px "微软雅黑";
              }
    
              tbody tr {
                  background-color: #f0f0f0;
              }
    
              tbody tr:hover {
                  cursor: pointer;
                  background-color: #fafafa;
              }
          </style>
    
      </head>
    
      <body>
          <div class="wrap">
              <table>
                  <thead>
                      <tr>
                          <th>
                              <input type="checkbox" id="j_cbAll" />
                          </th>
                          <th>商品</th>
                          <th>价钱</th>
                      </tr>
                  </thead>
                  <tbody id="j_tb">
                      <tr>
                          <td>
                              <input type="checkbox" />
                          </td>
                          <td>iPhone8</td>
                          <td>8000</td>
                      </tr>
                      <tr>
                          <td>
                              <input type="checkbox" />
                          </td>
                          <td>iPad Pro</td>
                          <td>5000</td>
                      </tr>
                      <tr>
                          <td>
                              <input type="checkbox" />
                          </td>
                          <td>iPad Air</td>
                          <td>2000</td>
                      </tr>
                      <tr>
                          <td>
                              <input type="checkbox" />
                          </td>
                          <td>Apple Watch</td>
                          <td>2000</td>
                      </tr>
    
                  </tbody>
              </table>
          </div>
          <script>
              // 1. 全选和取消全选做法:  让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可
              // 获取元素
              var j_cbAll = document.getElementById('j_cbAll'); // 全选按钮
              var j_tbs = document.getElementById('j_tb').getElementsByTagName('input'); // 下面所有的复选框
              // 注册事件
              j_cbAll.onclick = function() {
                      // this.checked 它可以得到当前复选框的选中状态如果是true 就是选中,如果是false 就是未选中
                      console.log(this.checked);
                      for (var i = 0; i < j_tbs.length; i++) {
                          j_tbs[i].checked = this.checked;
                      }
                  }
                  // 2. 下面复选框需要全部选中, 上面全选才能选中做法: 给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的, 上面全选就不选中。
              for (var i = 0; i < j_tbs.length; i++) {
                  j_tbs[i].onclick = function() {
                      // flag 控制全选按钮是否选中
                      var flag = true;
                      // 每次点击下面的复选框都要循环检查者4个小按钮是否全被选中
                      for (var i = 0; i < j_tbs.length; i++) {
                          if (!j_tbs[i].checked) {
                              flag = false;
                              break; // 退出for循环 这样可以提高执行效率 因为只要有一个没有选中,剩下的就无需循环判断了
                          }
                      }
                      j_cbAll.checked = flag;
                  }
              }
          </script>
      </body>
    
      </html>
    

5.7.9 tab 栏切换

  • 需求:
    • 当鼠标点击上面相应的选项卡(tab),下面内容跟随变化
  • 分析:
    • Tab栏切换有2个大的模块
    • 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类 名的方式
    • 下面的模块内容,会跟随上面的选项卡变化。所以下面模块变化写到点击事件里面。
    • 规律:下面的模块显示内容和上面的选项卡一一对应,相匹配。
    • 核心思路: 给上面的tab_list 里面的所有小li 添加自定义属性,属性值从0开始编号
    • 当我们点击tab_list 里面的某个小li,让tab_con 里面对应序号的 内容显示,其余隐藏(排他思想)
  • 实现代码:

      <!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>
          <style>
              * {
                  margin: 0;
                  padding: 0;
              }
    
              li {
                  list-style-type: none;
              }
    
              .tab {
                  width: 978px;
                  margin: 100px auto;
              }
    
              .tab_list {
                  height: 39px;
                  border: 1px solid #ccc;
                  background-color: #f1f1f1;
              }
    
              .tab_list li {
                  float: left;
                  height: 39px;
                  line-height: 39px;
                  padding: 0 20px;
                  text-align: center;
                  cursor: pointer;
              }
    
              .tab_list .current {
                  background-color: #c81623;
                  color: #fff;
              }
    
              .item_info {
                  padding: 20px 0 0 20px;
              }
    
              .item {
                  display: none;
              }
          </style>
      </head>
    
      <body>
          <div class="tab">
              <div class="tab_list">
                  <ul>
                      <li class="current">商品介绍</li>
                      <li>规格与包装</li>
                      <li>售后保障</li>
                      <li>商品评价(50000)</li>
                      <li>手机社区</li>
                  </ul>
              </div>
              <div class="tab_con">
                  <div class="item" style="display: block;">
                      商品介绍模块内容
                  </div>
                  <div class="item">
                      规格与包装模块内容
                  </div>
                  <div class="item">
                      售后保障模块内容
                  </div>
                  <div class="item">
                      商品评价(50000)模块内容
                  </div>
                  <div class="item">
                      手机社区模块内容
                  </div>
    
              </div>
          </div>
          <script>
              // 获取元素
              var tab_list = document.querySelector('.tab_list');
              var lis = tab_list.querySelectorAll('li');
              var items = document.querySelectorAll('.item');
              // for循环绑定点击事件
              for (var i = 0; i < lis.length; i++) {
                  // 开始给5个小li 设置索引号 
                  lis[i].setAttribute('index', i);
                  lis[i].onclick = function() {
                      // 1. 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类名的方式
    
                      // 干掉所有人 其余的li清除 class 这个类
                      for (var i = 0; i < lis.length; i++) {
                          lis[i].className = '';
                      }
                      // 留下我自己 
                      this.className = 'current';
                      // 2. 下面的显示内容模块
                      var index = this.getAttribute('index');
                      console.log(index);
                      // 干掉所有人 让其余的item 这些div 隐藏
                      for (var i = 0; i < items.length; i++) {
                          items[i].style.display = 'none';
                      }
                      // 留下我自己 让对应的item 显示出来
                      items[index].style.display = 'block';
                  }
              }
          </script>
      </body>
    
      </html>
    

results matching ""

    No results matching ""