DOM(二):属性操作(自定义属性)、tab栏切换(重难点)

一、几个重要案例

1.五个按钮,点击一个按钮亮,其余按钮全灭(排他思想)

点击一个按钮之后,用for循环实现其他的按钮全灭,再设置它自己亮

<style>
   .bianhua{
       /* border: 1px blue solid; */
       background-color: pink;
   }
    .bubian{
        border: '';
        background-color: '';
    }
</style>

<body>
   <button>按钮1</button>
   <button>按钮2</button>
   <button>按钮3</button>
   <button>按钮4</button>
   <button>按钮5</button>
    <script>
        var button=document.getElementsByTagName('button');//得到个伪数组,就可以for循环
        for(var i=0;i<button.length;i++)
        {
            button[i].onclick=function(){
                //正确方法是点了一个之后把所有的都重置,再给它自己加颜色
                for(var j=0;j<button.length;j++)
                {
                    
                        button[j].className='bubian';
                    
                    
                }
                this.className='bianhua';

            }
            //只有这个的话,点了它再点它其他的兄弟,俩人都变化,想要的效果是只有一个人
        }

    </script>

  
</body>

2.百度换肤

<style>
    body{
        background: url(1.jpg);
    }
    .box{
        width: 640px;
        height: 100px;
        margin: 100px auto;
        border: 1px solid;
    }
  .box div{
      width: 160px;
      height: 100px;
      float: left;
  }
  img{
      width: 160px;
      height: 100px;
  }

</style>

<body>
   <div class="box">
       <div><img src="1.jpg" alt=""></div>
       <div><img src="2.jpg" alt=""></div>
       <div><img src="3.jpg" alt=""></div>
       <div><img src="4.jpg" alt=""></div>
   </div>
    <script>
        var img=document.querySelector('.box').querySelectorAll('img');
        for(var i=0;i<img.length;i++)
        {
            img[i].onclick=function(){
                document.body.style.backgroundImage='url('+this.src+')';
            //console.log(this.src);
            }
        }
        
    </script>
  
</body>

注意点:最后body的image不能去等于url(this.img)因为url里面放的是链接,src才是呢

我写的时候把四个盒子的图片写到了css中的bcc,下面也获取的div元素,就出不来效果,而且在后面把小盒子的背景图给body的时候给不进去,主要是看点的最近的那个是什么,div属于img的父亲了,点的是img就得获取img

赋值得加引号(=的后面都是字符串);

this.src需要进行拼接‘++’,引号‘’里面需要字符串,而这里是变量

this.src就是字符串,然后左右两边的东西就得用引号引起来也作为字符串

3.表格隔行变色

鼠标经过onmouseover,鼠标离开onmouseout

<style>
    *{
        padding: 0;
        margin: 0;
    }
    table{
        background-color: aqua;
        margin: 100px auto;
        border-spacing:0;
    }
    thead {
        /* background-color: pink; */
        border-bottom: 1px solid red;
    }
    tbody tr{
        background-color: rgb(248, 242, 233);
        border: none;
        padding: 0;
    }
    th{
        width: 100px;
    }
    

</style>

<body>
    <table>
            <thead>
                <tr>
                    <th>性别</th>
                    <th>年龄</th>
                    <th>姓名</th>
                    <th>身高</th>
                </tr>
             </thead>
       
        <tbody>
            <tr>
                <th>女</th>
                <th>18</th>
                <th>a</th>
                <th>165</th>
            </tr>
            <tr>
                <th>男</th>
                <th>19</th>
                <th>b</th>
                <th>185</th>
            </tr>
            <tr>
                <th>女</th>
                <th>21</th>
                <th>c</th>
                <th>163</th>
            </tr>
            <tr>
                <th>女</th>
                <th>30</th>
                <th>d</th>
                <th>160</th>
            </tr>
    
        </tbody>
    </table>
  
    <script>
        var trs=document.querySelector('tbody').querySelectorAll('tr');
        for(var i=0;i<trs.length;i++)
        {
            trs[i].onmouseover=function(){
                this.style.backgroundColor='yellow';
             }
             trs[i].onmouseout=function(){
                this.style.backgroundColor='';
             }
        }
       
    </script>

4.表单全选框和复选框

<style>
    *{
        padding: 0;
        margin: 0;
    }
    table{
        background-color: aqua;
        margin: 100px auto;
        border-spacing:0;
    }
    thead {
        /* background-color: pink; */
        border-bottom: 1px solid red;
    }
    tbody tr{
        background-color: rgb(248, 242, 233);
        border: none;
        padding: 0;
    }
    th{
        width: 100px;
    }
    

</style>

<body>
    <table>
            <thead>
                <tr>
                    <th>
                        <input type="checkbox" id="j_cbAll">
                    </th>
                    <th>商品</th>
                    <th>价格</th>
                </tr>
             </thead>
       
        <tbody id="j_tb">
            <tr>
                <th>
                    <input type="checkbox">
                </th>
                <th>苹果15</th>
                <th>5999</th>
            </tr>
            <tr>
                <th>
                    <input type="checkbox">
                </th>
                <th>macbook</th>
                <th>10000</th>
            </tr>
            <tr>
                <th>
                    <input type="checkbox">
                </th>
                <th>ipad</th>
                <th>5200</th>
            </tr>
    
        </tbody>
    </table>
  

点一下全选后面全选上,取消之后后面全取消

var inps=document.getElementById('j_tb').querySelectorAll('input');
       var j_cbAll=document.getElementById('j_cbAll');
       var flag=0;
       j_cbAll.onclick=function(){
           for(var i=0;i<inps.length;i++)
           {
               inps[i].checked=this.checked;
           }
       }

点完所有小的之后,全选也会被勾选

我的思路:设置flag=1,如果有一个小的没被选上,flag=0,最后看看flag等于1就把全选框选上

for(var j=0;j<inps.length;j++)
       {
        inps[j].onclick=function(){
            console.log(this.checked)
            if(inps[j].checked!=checked)
           {
             flag=0;
           }
         }
       }
       if(flag==1)
       {
           j_cbAll.checked=true;
           console.log(j_cbAll.checked)
       }

小的选中之后能够打印出来true,三个都点完之后大的就没动静,我把大的打印一下看看选了没也不打印。

我的错误是第一个for循环下面设置的点击事件,我点了一个之后,首先我点的可能不是第一个小的,而且点完之后它可能还得再循环去看看它下面的如何。

正确的应该是,我点完一个小的之后,我就应该去看看其他的那几个小的有没有都被点上,如果都点上了,全选的就被选上,所以需要两个for循环,第一个控制我点第几个,第二个for循环看看其他的小的有没有都被选。

我的flag思路是对的,老师的写法是将flag写成true和false

for(var j=0;j<inps.length;j++)
       {
        inps[j].onclick=function(){
            for(i=0;i<inps.length;i++)
            {
                flag=true;
                //这个flag加在这里了,要不然上一局flase了到这儿还没变呢
                if(!inps[i].checked)
                {
                    flag=false;
                    break;
                    //就是说点完这个小的发现没都被点,就别留这儿了走吧
                }
            }
           j_cbAll.checked=flag;
           //我点完一个小的,点完了就得给我反馈,我点了这个到底能不能把全选的那个选上
          }
       }
       

二、自定义属性

1.获取属性值的方法:

区别:

	<div id="hh" index='1' class='hh'></div>
	var div = document.querySelector('div');
	console.log(div.id); //hh
	console.log(div.getAttribute('id'));  //hh
	console.log(div.getAttribute('index'));  //1,我自己设置的性质
	console.log(div.index);  //undefined

2.修改属性值的方法:

第二种还是只针对于自定义属性

在修改classname的时候(div .class),用第一种方法

<div id="hh"></div>
      <script>
          var div=document.querySelector('div');
          div.className='demo';
      </script>

注意:在用第二种方法的时候,属性那里必须是class,不要Name


     <div id="hh"></div>
      <script>
          var div=document.querySelector('div');
          div.className='demo';
          div.setAttribute('class','qqq');
      </script>

把前面那个覆盖了

3.移除属性

div.removeAttribute('index');

三、tab栏切换!!!

html,css

<style>
* {
    margin: 0;
    padding: 0;
    /* css3新增,padding不会撑大盒子 */
    box-sizing: border-box;
    /*所有元素的内外边距清除*/
}


li {
    list-style: none
        /*去掉列表的圆形点装饰*/
}
.tab{
    width: 1002px;
    height: 300px;
    background-color: pink;
    margin: 0 auto;
}
.tab_list{
    background-color: aliceblue;
    width: 1002px;
    height: 100px;
    border: 1px solid gray;
}
.tab_list ul li{
    float: left;
    width: 200px;
    line-height: 100px;
    text-align: center;
}
.normal{
    background-color: aliceblue;
    color: black;
}
.current{
    background-color: rgb(184, 9, 9);
    color: aliceblue;
}
.item{
    display: none;
}
.item:first-child{
    display: block;
}
</style>
   
  <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">
                商品介绍模块内容
            </div>
            <div class="item">
                规格与包装模块内容
            </div>
            <div class="item">
                售后保障模块内容
            </div>
            <div class="item">
                商品评价模块内容
            </div>
            <div class="item">
                手机社区模块内容
            </div>
          </div>
      </div>
<script>
          var lists=document.querySelectorAll('li');
          var items=document.querySelectorAll('.item');
          for(var i=0;i<lists.length;i++){
            lists[i].setAttribute('index', i);
              lists[i].onclick=function()
              {
                  for(var j=0;j<lists.length;j++)
                  {
                      items[j].style.display='none';
                      lists[j].className='normal'
                  }
                  this.className='current';
                  var index = this.getAttribute('index');
                  items[index].style.display='block';
              }
          }
      </script>

我写的部分没有加index,最后那里就是item[i].style.display='block';

这样的话是可以实现点击list之后的变化,下面盒子里的文字出不来,如果我把this.className的this换成lists[i]的话也是出不来,然后我就在function函数之后加了个打印出来i,发现不管点击哪个打印出来的都是5,在for循环之后打印i的话,打开页面就自动显示0 1 2 3 4 5

然后我们就知道这是怎么进行的了,for循环在我们进入页面的时候就走完了,然后这五个list[0],

list[1],list[2],list[3],list[4],就在那儿等着呢,看谁被点了谁的函数就启动,但是那个时候的i已经成5了,所以要是想获取i就得在function之前,function之后的要不就拿个index当,要不就写this

四、H5自定义属性

1.自定义属性的目的

为了保存和使用数据,有些数据可以保存到页面中不用存数据库中。

有点类似于冒泡排序中的t,你需要的时候直接拿来用用它当替身,页面刷新就没了

2.H5规定,自定义属性以data-开头作为属性名并赋值

<li data-index="1">规格与包装</li>
li.setAttribute('data-time', '20');


//结果
<li data-index="1" data-time="20">规格与包装</li>

3.H5新增使用dataset对象获取自定义属性

除了li.getAttribute(‘data-index’);获取自定义属性外,H5还新增了li.dataset.index或者li.dataset[‘index’]这个要注意点后面是index而不是data-index,就是只写data-index后面的部分,只有ie11及以上才兼容,使用getAttribute比较多

dataset是一个集合的意思

如果li.dataset,就是把所有的自定义属性都以对象的形式显示出来

驼峰命名法:data-list-name改成li.dataset.listName

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值