Web APIs---3. DOM(2)

4.5 案例

排他思想(算法)

<body>
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
    <script>
        //1. 获取所有按钮元素
        btns = document.getElementsByTagName('button');
        //2. 绑定事件
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                //(1)将所有按钮背景颜色去掉
                for (var j = 0; j < btns.length; j++) {
                    btns[j].style.backgroundColor = '';
                }
                //(2)将当前按钮的背景颜色设置为粉红色
                this.style.backgroundColor = 'pink';

            }
        }
    </script>
</body>
百度换肤效果(样式省略)
  • 错误写法
<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. 获取所有li元素
        var pics = document.getElementsByTagName('li');
        for (var i = 0; i < pics.length; i++) {
            console.log(i); //0 1 2 3
            pics[i].onclick = function() {
                document.body.style.background = 'url(images/' + i + '.jpg)';
            }
        }
    </script>
</body>
  • 正确写法
<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');
        //2. 注册事件
        for (var i = 0; i < imgs.length; i++) {
            imgs[i].onclick = function() {
                document.body.style.backgroundImage = 'url(' + this.src + ')';
            }
        }
    </script>
</body>
鼠标经过表格行,该行高亮

  • 用到鼠标经过onmouseover 鼠标离开onmouseout
<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. 获取元素
        var tr = document.querySelector('tbody').querySelectorAll('tr'); //注意:一定要是:单个元素.单个元素or 单个元素.集合 not 集合.单个元素 not 集合.集合

        //2. 绑定事件   若改成鼠标点击click变成高亮,那么就要用排他思想了
        for (var i = 0; i < tr.length; i++) {
            tr[i].onmouseover = function() {
                this.className = 'bg';
            }
            tr[i].onmouseout = function() {
                this.className = '';

            }
        }
    </script>
</body>

添加了一个样式

/* 比较友好的写法是在css里面写一个类 */

.bg {
    background-color: pink;
}
表单全选以及取消全选案例


样式省略

<body>
    <div class="wrap">
        <table>
            <thead>
                <tr>
                    <th>
                        <input type="checkbox" id="j_cbAll" />
                        <!-- 对于复选框,有一个属性checked,若写成checked='checked'则默认被选中,若不写该属性(如上) 则默认未被选中-->
                    </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>
        //全选和取消全选做法
        //获取事件
        all = document.querySelector('thead').querySelector('input');
        inputs = document.querySelector('tbody').querySelectorAll('input');
        //注册事件
        all.onclick = function() {
            // console.log(this.checked);
            //this.checked可以得到当前复选框的选中状态,如果是true就是选中,如果是false就是未选中
            for (var i = 0; i < inputs.length; i++) {
                inputs[i].checked = this.checked;
            }
        }

        //2 下面复选框需要全选中,最上面的按钮才会被选中
        for (var i = 0; i < inputs.length; i++) {
            inputs[i].onclick = function() {
                //flag 控制全选按钮是否选中
                var flag = true;
                //每次点击下面的复选框都要检查4个小按钮是否全被选中
                for (var i = 0; i < inputs.length; i++) {
                    //如果下面某一个复选框没有被选中
                    if (!inputs[i].checked) {
                        flag = false;
                    }
                }
                all.checked = flag;
            }
        }
    </script>
</body>

4.6 自定义属性操作

获取属性值的方法:element.属性、element.getAttribute('属性')

<body>
    <!-- id是元素本身的属性,index是自定义属性(程序员自己添加的属性) -->
    <div id="demo" index="1"></div>
    <script>
        var div = document.querySelector('div');
        
        //1. 获取元素的属性值
        // (1)element.属性   该方法常常用于获取元素本身的属性
        console.log(div.id); //demo

        //(2)element.getAttribute('属性')   该方法常常用于获取元素自定义的属性
        console.log(div.getAttribute('id')); //demo
        console.log(div.getAttribute('index')); //1
    </script>
</body>

自定义属性值---->element.属性 = '值'、element.setAttribute('属性','值')

  • 说明:
    setAttribute('属性','值')不仅可以修改已经有的自定义属性值,还可以创建目前没有的属性并设置值
<body>
    <!-- id是元素本身的属性,index是自定义属性(程序员自己添加的属性) -->
    <div id="demo" index="1" class="nav"></div>
    <script>
        var div = document.querySelector('div');
        //2. 设置元素属性值
        // (1)element.属性 = '值'   该方法常常针对元素本身的属性
        div.id = 'test'
        div.className = 'navs'; //这个特殊用的是className而不是class 
        //(2)element.setAttribute('属性','值')  该方法常常针对元素自定义的属性
        div.setAttribute('index', '2');
        div.setAttribute('class', 'footer');//该方法既可以修改自定义属性又可以修改原先自带的属性
    </script>
</body>

移除属性---->removeAttribute()

  • 语法
element.removeAttribute("属性");
<body>
    <!-- id是元素本身的属性,index是自定义属性(程序员自己添加的属性) -->
    <div id="demo" index="1" class="nav"></div>
    <script>
        var div = document.querySelector('div');
        //3 移除属性
        div.removeAttribute('index');
    </script>
</body>
案例tab栏切换(重点案例)
  • tab栏切换有两个大的模块
  • 上面的模块选项卡,点击某一个,当前这个底色会是红色,其余不变(排他思想)
  • 下面的模块内容,会随着上面选项卡变化。所以下面的模块变化写到点击事件里面
  • 规律:下面模块显示内容和上面的选项卡一一对应,相匹配
  • 问题是怎么知道点击的是哪一个li呢
  • 解决思路:给上面的tab_lis里面所有的小li添加自定义属性,属性值从0开始编号
    样式
<style>
    * {
        margin: 0;
        padding: 0;
    }
    
    li {
        list-style-type: none;
    }
    
    .tab {
         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>

结构

<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>

js脚本之上面的模块

<script>
    //1. 上面的模块选项卡,点击某一个,当前这个底色会是红色,其余不变(排他思想)
    //获取元素
    var tab_list = document.querySelector('.tab_list');
    var lis = tab_list.querySelectorAll('li');

    //for循环绑定点击事件
    for (var i = 0; i < lis.length; i++) {
        lis[i].onclick = function() {
            //干掉所有人 其余的li清除 class="current"这个类
            for (var i = 0; i < lis.length; i++) {
                lis[i].className = '';
            }
            //留下我自己
            this.className = 'current';
        }
    }
</script>

js脚本之在上面的基础上添加下面的模块

<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() {
            for (var i = 0; i < lis.length; i++) {
                lis[i].className = '';
            }
            this.className = 'current';

            //2. 下面的显示内容模块
            //获取当前小li的索引号
            var index = this.getAttribute('index');
            //干掉所有人 让其余的item这些div隐藏
            for (var i = 0; i < items.length; i++) {
                items[i].style.display = 'none';
            }
            //留下我自己
            items[index].style.display = 'block';
        }
    }
</script>

4.7 H5自定义属性


<body>
    <div getTime='20' data-index="2" data-time="30" data-list-name="andy"></div>
    <script>
        var div = document.querySelector('div');
        console.log(div.getTime); //undefined  该方式无法获取自定义属性
        console.log(div.getAttribute('getTime')); //20
        console.log(div.getAttribute('data-index')); //2
        console.log(div.getAttribute('data-list-name')); //andy

        // H5新增获取自定义属性的方法  它只能获取data-开头的
        //dataset是一个集合,里面存放了所有以data开头的自定义属性
        console.log(div.dataset); //DOMStringMap {index: "2", time: "30", 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>
</body>

getAttribute较为常用,因为兼容性较好

原文地址:https://www.cnblogs.com/deer-cen/p/12230282.html