JavaScript中的DOM(二)

本文详细介绍了在HTML5中如何利用排他思想实现按钮背景切换、鼠标悬停效果,并讲解了属性操作,包括获取和设置内置与自定义属性,以及移除属性。此外,还展示了如何在Tab栏切换中运用这些技巧,以及H5中自定义属性的正确使用和获取方法。

DOM(二)



一、排他操作

1、排他思想简介
排他思想,简单理解就是排除掉其他的(包括自己),然后再给自己设置想要实现的效果。总而言之,排他思想的实现步骤就是所有元素全部清除与设置当前元素
案例1演示:在同一组元素中,想要某一个元素实现某种样式,使用循环的排他思想算法来实现
⑤编写HTML结构代码

<body>
  <button>按钮1</button>
  <button>按钮2</button>
  <button>按钮3</button>
  <button>按钮4</button>
  <button>按钮5</button>
</body>

②编写JS代码,单击按钮,改变当前按钮背景色

<script>
  // 1. 获取所有按钮元素, btns得到的是类数组对象
  var btns = document.getElementsByTagName('button');
  for (var i = 0; i < btns.length; i++) { // 里面的每一个元素btns[i]
     btns[i].onclick = function () {
      for (var i = 0; i < btns.length; i++) { // (1) 先把所有的按钮背景颜色去掉
        btns[i].style.backgroundColor = '';
      }
      this.style.backgroundColor = 'pink'; // (2) 然后设置当前的元素背景颜色
    }
  }

案例2:鼠标经过时背景变色

<!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>
<style>
    .bg{
        background-color: blueviolet;
    }
</style>
<body>
    <table border="1" align="center">
        <thead>
            <tr>
                <th width='80'>代码</th>
                <th width='100'>名称</th>
                <th width='100'>最新公布净值</th>
                <th width='100'>累计净值</th>
                <th width='100'>前单位净值</th>
                <th width='100'>净值增长率</th>
            </tr>
        </thead>
        <tbody>
            <tr align="center">
                <td>002143</td>
                <td>定期开放债券</td>
                <td>1.352</td>
                <td>1.962</td>
                <td>1.306</td>
                <td>+0.353%</td>
            </tr>
            <tr align="center">
                <td>002143</td>
                <td>定期开放债券</td>
                <td>1.352</td>
                <td>1.962</td>
                <td>1.306</td>
                <td>+0.353%</td>
            </tr>
            <tr align="center">
                <td>002143</td>
                <td>定期开放债券</td>
                <td>1.352</td>
                <td>1.962</td>
                <td>1.306</td>
                <td>+0.353%</td>
            </tr>
            <tr align="center">
                <td>002143</td>
                <td>定期开放债券</td>
                <td>1.352</td>
                <td>1.962</td>
                <td>1.306</td>
                <td>+0.353%</td>
            </tr>
        </tbody>
    </table>

    <script>
        var trs = document.querySelector('tbody').querySelectorAll('tr')    //获取tbody下的所有行
        for(var i = 0;i < trs.length;i++){
            trs[i].onmouseover = function(){
                this.className = 'bg';
            }
            trs[i].onmouseout = function(){
                this.className = '';
            }
        }
    </script>
</body>
</html>

二、属性操作

1、获取属性值

  • 获取元素的内置属性值:element.属性 或 getAttribute(‘属性’)
  • 获取元素的自定义属性值:getAttribute(‘属性’)
<body>
    <p id="p1" class="ps" value='asda' title="asf">邮电大学</p>
    <script>
        var pt = document.querySelector('p')
        console.log(pt.id)
        console.log(pt.title)
        console.log(pt.getAttribute('value'))
        console.log(pt.getAttribute('class'))
        console.log(pt.getAttribute('id'))
    </script>
</body>

2、设置属性值

  • 设置内置属性的值:element.属性 = 值
  • 设置自定义属性的值:setAttribute(‘属性’,‘值’)
<body>
  <div></div>
  <script>
    var div = document.querySelector('div');
    div.id = 'test';                        // 设置id值为test
    div.className = 'navs';        // 设置class类名为navs
    div.setAttribute('index', 2);  // 设置属性名为index,值为2
  </script>
</body>

另外,也可以使用setAttribute()方式设置元素的类名

div.setAttribute('class', 'footer');//class为类名,footer为属性名

3、移除属性值:element.removeAttribute(‘属性’)

<style>
    .tt{
        width: 100px;
        height: 100px;
        background-color: blue;
        color: chartreuse;
    }
</style>
<body>
    <div class="tt">万里长城</div>
    <button id="btn">移除属性</button>
    <script>
        var dt = document.querySelector('div')
        // dt.id = 'd1'
        // // dt.className = 'df'
        // dt.setAttribute('index','3')
        // dt.setAttribute('class','tt')
        btn.onclick = function(){
            dt.removeAttribute('class')
        }
    </script>
</body>

4、案例:Tab栏切换
标签栏在网站中的使用非常普遍,它的优势在于可以在有限的空间内展示多块的内容,用户可以通过标签在多个内容块之间进行切换

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <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 (var i = 0; i < lis.length; i++) {	// for循环绑定点击事件
        lis[i].setAttribute('index', i);		// 开始给5个小li设置索引号
        lis[i].onclick = function () {
          for (var i = 0; i < lis.length; i++) {
            lis[i].className = '';
          }
          this.className = 'current';
          // 下面的显示内容模块
          var index = this.getAttribute('index');
          for (var i = 0; i < items.length; i++) {
            items[i].style.display = 'none';
          }
          items[index].style.display = 'block';
        };
      }
    </script>
  </body>
</html>

三、H5中自定义属性

HTML5新增了自定义属性的规范,在HTML5中规定通过“data-属性名”的方式设置自定义属性

<div data-index='2'></div> -->H5的写法,'data-'是自定义属性的前缀,便于区分自定义属性和内置属性
<div id="dt" index='2'></div>  -->H5以前版本的写法

1、设置属性值
元素对象名.dataset.属性名 = 值
元素的“data-*”自定义属性有两种设置方式,分别如下
①在HTML中设置自定义属性

// 在div元素上设置data-index属性
<div data-index="2"></div>   //data-表示前缀,index是自己定义的属性名

②在JavaScript中设置自定义属性
在JavaScript代码中,可以通过setAttribute(‘属性’, 值)或者“元素对象.dataset.属性名=‘值’”两种方式设置自定义属性。需要注意的是,通过后者的方式只能设置以“data-”开头的自定义属性

<body>
    <div class="div" data-index="5"></div>
    <div id="pt" getTime="20" data-index="2" data-list-name="andy"></div>
    <script>
        var dt = document.querySelector('.div')
        var pt = document.querySelector('#pt')

        dt.dataset.name = '张三'    //自定义属性data-name
        // dt.setAttribute('data-index','2')      //自定义属性data-index
        console.log(dt.dataset.index)
        console.log(pt.dataset['index'])
    </script> 
</body>

2、获取属性值

  • 对象名.dataset.属性(有兼容性问题)
  • 对象名.dataset[‘属性’](有兼容性问题)
  • getAttribute(‘属性’)
<div getTime="20" data-index="2" data-list-name="andy"></div>
<script>
  var div = document.querySelector('div');
  console.log(div.getAttribute('data-index'));       // 结果为:2
  console.log(div.getAttribute('data-list-name')); // 结果为:andy
  // HTML5新增的获取自定义属性的方法,只能获取“data-”开头的属性
  console.log(div.dataset); // DOMStringMap {index:"2",listName:"andy"}
  console.log(div.dataset.index);           // 结果为:2
  console.log(div.dataset['index']);        // 结果为:2
  console.log(div.dataset.listName);      // 结果为:andy
  console.log(div.dataset['listName']);  // 结果为:andy
</script>

注:dataset是一个集合,里面存放了所有以data开头的自定义属性,如果自定义属性里面包含有多个连字符(-)时,获取的时候采取驼峰命名法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值