DOM(二):操作元素---案例,自定义属性,tab栏切换,H5自定义属性

一、几个案例

(1)排他思想:如何实现点击一个按钮亮,其余按钮全灭?

首先排除其他人,然后才设置自己的样式,这种排除其他人的思想我们称为排他思想。

    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button>
    <button>5</button>
    <script>
        // 1.先获取元素
        var btn = document.getElementsByTagName('button');
        for(var i=0;i<btn.length;i++){
            btn[i].onclick=function(){
                // 2.先把所有按钮背景颜色去掉 
                for(i=0;i<btn.length;i++){
                    btn[i].style.backgroundColor='';
                }
                // 3.再让当前元素显示粉色
                this.style.backgroundColor='pink';
            }
        }
    </script>

 

(2)实现浏览器换肤效果

思路:点击某个图片,把该图片的地址赋给body
这里的几个注意点:
1.body元素和html元素的获取方法,要多复习复习
2.给多个相同元素添加事件可以用for循环
3.修改样式,赋值要加引号,如果其中有变量,要单独拿出来,用+拼接就可以

           * {
                box-sizing: border-box;
    }

    body {
                background: url(./images/1.jpg) no-repeat center top;
            }

    .box {
                text-align: center;
                width: 600px;
                height: 112px;
                line-height: 50px;
                margin: 200px auto;
                border: 1px solid #ccc;
            }

    .box img {
                margin: 5px 0;
                padding: 0 5px;
                float: left;
                width: 25%;
                height: 90%;
                border: 1px solid transparent;
            }

    .box img:hover {
                border: 1px solid red;
            }
        <div class="box">
            <img src="/img/1.png" alt="">
            <img src="/img/2.png" alt="">
            <img src="/img/3.png" alt="">
            <img src="/img/4.png" alt="">
        </div>
        <script>
            // 1.获取元素
            var imgs = document.querySelector('.box').querySelectorAll('img');
            // 2.循环注册事件
            for (var i = 0; i < imgs.length; i++) {
                imgs[i].onclick = function () {
                    // 别忘了获取body元素的方法,document.body
                    // 把这个路径this.src给body就好了
                    document.body.style.backgroundImage = 'url(' + this.src + ')';// 属性要用字符串形式
                }
            }
        </script>

(3)表格隔行变色

    <table>
        <thead>
            <tr>
                <th>名字</th>
                <th>性别</th>
                <th>年龄</th>
                <th>身高</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>张三</td>
                <td>女</td>
                <td>21</td>
                <td>185cm</td>
            </tr>
            <tr>
                <td>张三</td>
                <td>男</td>
                <td>21</td>
                <td>185cm</td>
            </tr>
            <tr>
                <td>浩浩</td>
                <td>男</td>
                <td>22</td>
                <td>175cm</td>
            </tr>
        </tbody>
    </table>
    
    <script>
        // 需要改变颜色的是tbody里面的行tr
        var trs = document.querySelector('tbody').querySelectorAll('tr');
            for (var i = 0; i < trs.length; i++) {
                //css的hover效果
                trs[i].onmouseover = function () {
                    this.style.backgroundColor = 'pink';
                }
                trs[i].onmouseout = function () {
                    this.style.backgroundColor = '';
                }
            }
    </script>

 

(4) 全选框和复选框

思路:

先写HTML部分: 

<div class="box">
    <table>
        <thead>
            <tr>
                <th>
                    <input type="checkbox" id="select_all">
                </th>
                <th>名称</th>
                <th>价格</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <input type="checkbox">
                </td>
                <td>手机</td>
                <td>10000</td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox">
                </td>
                <td>手机</td>
                <td>9999</td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox">
                </td>
                <td>手机</td>
                <td>8888</td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox">
                </td>
                <td>手机</td>
                <td>7777</td>
            </tr>
        </tbody>
    </table>
</div>

 老师讲的思路多看两遍是可以理解的:

把flag初始值置为true,然后每点击一次就循环
如果有一个没点的,那么就把flag变成false,最后让全选框=flag的值。

    <script>
        // 1.获取元素
        var select_all = document.getElementById('select_all');//全选按钮
        var td = document.querySelector('tbody').querySelectorAll('input');//下面所有的复选框
        // 2.注册事件
        select_all.onclick = function(){
            for(var i=0;i<td.length;i++){
                // 意思是 全选按钮是true就把true给下面所有的复选框
                td[i].checked=this.checked;
                //this.checked可以得到当前复选按钮的状态,如果是选中就是true,未选中就是false
            }
        }
// 3.下面复选框全部选中上面按钮才能选中做法;给每个复选框绑定事件
        for(var i=0;i<td.length;i++){
            td[i].onclick=function(){
                // flag控制全选按钮是否选中
                var flag = true;
                for(var i=0;i<td.length;i++){
                    // 如果有一个复选框没有被选中,那么全选按钮就false选中
                    if(!td[i].checked){
                        flag=false;
                    }
                }
                // 最后返回全选按钮的状态flag
                select_all.checked=flag;
            }
        }

    </script>

 二、操作元素的自定义属性

 1.获取属性值的方法

 自定义属性只能用第二种方式操作。element.getAttribute

2.修改属性值的方法

3.移除属性用removeAttribute(‘属性’)

div.removeAttribute('index');

三、tab栏切换(重点中的重点)

html:

<div class="box">
    <div class="box_hd" id="box_hd">
        <ul>
            <li class="bhd_first">商品介绍</li>
            <li>规格与包装</li>
            <li>售后保障</li>
            <li>商品评价(5000)</li>
            <li>手机社区</li>
        </ul>
    </div>
    <div class="box_bd" id="box_bd">
        <div class="item" style="display:block">
            商品介绍模块内容
        </div>
        <div class="item">
            规格与包装模块内容
        </div>
        <div class="item">
            售后保障模块内容
        </div>
        <div class="item">
            商品评价(5000)模块内容
        </div>
        <div class="item">
            手机社区模块内容
        </div>
    </div>
</div>

案例分析:


1.这里我们要实现的主要功能就是,点击头部的模块,身子能显示到相对应的内容上,这里要分为两步来做,第一步就是头部区域,点谁谁就变红,这里用到排他思想,比较简单不再赘述。第二步就是点击哪块儿头部,就显示哪块儿身子,其他的身子隐藏
2.第二步也是用到排他思想,但是它的难点在于,我怎么保证身子的索引和头部一样呢?That is a question,用i吗?你会发现实际上这里面两个for循环已经改变了i的值,每次循环结束,i都会变为lis或divs的长度(本例中是5),这样的话,如果我们最后一句直接写divs[i].style.display = ‘block’;肯定会报错,因为divs[5]是不存在的,最后一个是divs[4](本例中)
3.在这种情况下,就用到了上面我们提到的自定义属性,在我们准备给每个li添加点击事件时(也就是for循环的开始),可以使用setAttribute给每个li添加一个自定义属性,名字随便取,这里我叫index,属性值就是i的值
4.后面呢再定义一个变量来接收当前点击事件的index,这样就能够有一个值,和头部的值相对应,就可以操作

	//1.先使用排他思想设置头部的区域
	var box_hd = document.getElementById('box_hd'); //id选择器别对应class!!
	var lis = box_hd.getElementsByTagName('li');
	var box_bd = document.getElementById('box_bd');
	var divs = box_bd.getElementsByTagName('div');
	for (var i = 0; i < lis.length; i++) {
	    //通过下面这行代码,给每个li添加一个index的自定义属性,让index的值和索引号i对应
	    lis[i].setAttribute('index', i);
	    lis[i].onclick = function () {
	        for (var i = 0; i < lis.length; i++) {
	            lis[i].className = '';
	        }
	        //从上面这个循环出来,i的值变成了5(lis的长度)
	        this.className = 'bhd_first';
	
	        //2.设置点击哪个头部显示哪块儿身子,剩下的身子隐藏
	        for (var i = 0; i < divs.length; i++) {
	            divs[i].style.display = 'none';
	        }
	        //从上面这个循环出来,i的值也变成了5(divs的长度)
	        var index = this.getAttribute('index');  //通过自定义属性,得到当前点击事件的index
	        //这样的话,就可以选择到和当前点击相对应的div,把它的display属性改为block显示
	        divs[index].style.display = 'block';
	    }
	}

 总之,挺难的,还需要在自己单独做一遍。

四、H5自定义属性

1.自定义属性的目的

实际上就是把数据保存到页面中而不是保存到数据库中,就像上面这个tab栏切换的例子,一开始其实我是手动给每个li添加了index属性,但是听老师讲后发现,lis[i].setAttribute(‘index’, i);这一句代码就可以直接给每个li添加index属性,而且页面刷新就没了,还是非常不错的

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比较多

<li data-index="1" data-time="20">规格与包装</li>
获取上面这个的data-index:li.dataset.index

如果li.dataset,就是把所有的自定义属性都显示出来(去掉data-),以对象的方式,因为dataset是一个对象。
这里还有个比较恶心的地方就是,如果我属性名叫:data-index-name
那么在获取时就要遵循驼峰命名法,这么写:

li.dataset.indexName

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值