JavaScript学习4:DOM(获取元素、事件基础、操作元素、节点操作

1.所有元素全部清除样式(排除其他人)
2.给当前元素设置样式
例子
在这里插入图片描述

<body>
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button>
    <button>5</button>
    <script>
        //1. 获取所有按钮元素 伪数组
        var btns = document.getElementsByTagName('button');
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function () {
                //所有元素颜色初始化
                for (var j = 0; j < btns.length; j++) {
                    btns[j].style.backgroundColor = '';
                }
                //修改当前元素
                this.style.backgroundColor = 'pink';
            }
        }
    </script>
</body>

例子:表单全选取消全选(常用)
在这里插入图片描述

<body>
    <!-- 例子: 全选与取消全选 -->
    <div>
        <table>
            <thead>
                <tr>
                    <th>
                        <input type="checkbox" name="" id="j\_cbAll">
                    </th>
                    <th>商品</th>
                    <th>价钱</th>
                </tr>
            </thead>
            <tbody id="j\_tb">
                <tr>
                    <th>
                        <input type="checkbox" name="" id="">
                    </th>
                    <th>iphone8</th>
                    <th>8000</th>
                </tr>
                <tr>
                    <th>
                        <input type="checkbox" name="" id="">
                    </th>
                    <th>iphone8</th>
                    <th>8000</th>
                </tr>
                <tr>
                    <th>
                        <input type="checkbox" name="" id="">
                    </th>
                    <th>iphone8</th>
                    <th>8000</th>
                </tr>
                <tr>
                    <th>
                        <input type="checkbox" name="" id="">
                    </th>
                    <th>iphone8</th>
                    <th>8000</th>
                </tr>
            </tbody>
        </table>
    </div>

    <script>
        //全选和取消全选
        var j_cbAll = document.getElementById('j\_cbAll');
        var j_tbs = document.getElementById('j\_tb').getElementsByTagName('input');
        j_cbAll.onclick = function () {
            console.log(this.checked);
            for (var i = 0; i < j_tbs.length; i++) {
                j_tbs[i].checked = this.checked;
            }
        }
        //设置下面的复选按钮
        for (var i = 0; i < j_tbs.length; i++) {
            j_tbs[i].onclick = function () {
                //检查是否全选
                var flag = true;
                for (var i = 0; i < j_tbs.length; i++) {
                    if (!j_tbs[i].checked) { //存在没有选上的
                        flag = false;
                        break; //提高执行效率
                    }
                }
                j_cbAll.checked = flag;
            }
        }
    </script>
</body>

⑥自定义属性的操作

获取属性值
1.element.属性:获取内置属性值
2.element.getAttribute(‘属性’):获取自定义/内置属性值

设置属性值
1.element.属性 = ‘值’:设置内置属性
2.element.setAttribute(‘属性’ , ‘值’):设置自定义属性
注意:element.className = ‘值’;element.setAttribute(‘class’,‘值’)

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

例子:tab栏切换(必备知识)

在这里插入图片描述

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

⑦H5自定义属性(兼容性问题)

在这里插入图片描述
在这里插入图片描述

五、节点操作

在这里插入图片描述
在这里插入图片描述

①父节点

node.parentNode:得到离元素最近的父级节点,如果没有就返回null

②子节点

node.childNodes:得到所有子节点(集合) 包含元素节点、文本节点等等,因此想要单独获得元素节点需要筛选出nodeType为1的节点,很麻烦,一般不使用。
node.children:单独获得元素节点,实际开发常用,虽然是非标准,但没有兼容性问题

node.firstChild:第一个子节点,大多情况不是返回元素节点
node.firstElementChild:第一个子元素节点,有兼容性问题,ie9以上才支持
node.childen[0]:最常用写法,没有兼容性问题
node.lastChild:最后一个节点,大多情况不是返回元素节点
node.lastElementChild:最后一个元素节点,有兼容性问题,ie9以上才支持
node.children[node.children.length - 1]:最常用写法,没有兼容性问题

③兄弟节点(少用)

node.nextSibling:下一个兄弟节点
node.nextElementSibling:下一个兄弟元素节点,兼容性问题
node.previousSibling:上一个兄弟节点
node.previousElementSibling:上一个一个兄弟元素节点,兼容性问题
没有更好的方法:一般自己封装函数:
在这里插入图片描述

④创建元素节点并添加节点

创建
document.createElement(‘元素’)
添加
node.appendChild(child)
node.insertBefore(child,指定元素)

var ul = document.querySelector(‘ul’);
var li = document.createElement(‘li’);
ul.appendChild(li); //追加元素

ul.insertBefore(li,指定元素); //在指定元素前面加

⑤删除节点

node.removeChild(child)

链接不跳转:
< a href = ‘javascript:;’>< /a>

⑥复制节点

node.cloneNode()
注意:
1.如果括号为空或者false,浅拷贝,即只克隆节点本身,不克隆里面的子节点、内容。
2.如果括号参数为true,深拷贝,会克隆节点本身以及里面所有子节点
克隆完还要添加(insertBefore/appendChild)才会显示

案例:动态生成表格(重要)

在这里插入图片描述

<!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>
    <style>
        table {
            width: 500px;
            margin: 100px auto;
            border-collapse: collapse;
            text-align: center;
        }

        td,
        th {
            border: 1px solid #333;
        }

        thead tr {
            height: 40px;
            background-color: #ccc;
        }
    </style>
</head>

<body>
    <table cellspacing="0">
        <thead>
            <tr>
                <th>姓名</th>
                <th>科目</th>
                <th>成绩</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>

    <script>
        //1. 准备数据 (模拟)
        var datas = [{
            name: 'vivian',
            subject: 'js',
            score: 100
        }, {
            name: 'summer',
            subject: 'js',
            score: 98
        }, {
            name: 'carrie',
            subject: 'js',
            score: 96
        }, {
            name: 'apple',
            subject: 'js',
            score: 94
        }];

        //2. 往tbody里创建行(数组长度)
        var tbody = document.querySelector('tbody');
        for (var i = 0; i < datas.length; i++) { //管tr
            //创建tr行
            var tr = document.createElement('tr');
            tbody.appendChild(tr);
            //行里面创建单元格(属性个数 k为属性名 datas[i][k]为属性值)
            for (var k in datas[i]) { //管td 
                //创建单元格 
                var td = document.createElement('td');
                td.innerHTML = datas[i][k];
                tr.appendChild(td);
            }

            //创建删除单元格
            var td = document.createElement('td');
            td.innerHTML = '<a href="javascript:;">删除</a>';
            tr.appendChild(td);
        }

        //删除操作
        var as = document.querySelectorAll('a');
        for (var i = 0; i < as.length; i++) {
            as[i].onclick = function () {
                //点击a 删除a当前所在行 a的父节点是td td的父节点是tr
                tbody.removeChild(this.parentNode.parentNode);
            }
        }
    </script>
</body>

</html>

三种动态创建元素区别
  1. document.write():如果页面文档流加载完毕,再调用这句话会导致页面重绘,原来的页面内容都没了,很少使用
  2. element.innerHTML:创建多个标签时,拼接字符串,非常耗时,但使用数组形式拼接效率很高
  3. document.createElement()
    在这里插入图片描述
        // 三种创建元素方式区别 
        // 1. document.write() 创建元素 如果页面文档流加载完毕,再调用这句话会导致页面重绘
        // var btn = document.querySelector('button');
        // btn.onclick = function() {
        // document.write('<div>123</div>');
        // }

        // 2. innerHTML 创建元素
        var inner = document.querySelector('.inner');
        // for (var i = 0; i <= 100; i++) {
        // inner.innerHTML += '<a href="#">百度</a>'
        // }
        var arr = [];
        for (var i = 0; i <= 100; i++) {
            arr.push('<a href="#">百度</a>');
        }
        inner.innerHTML = arr.join('');
        // 3. document.createElement() 创建元素
        var create = document.querySelector('.create');
        for (var i = 0; i <= 100; i++) {
            var a = document.createElement('a');
            create.appendChild(a);
        }

### 总结

**前端资料汇总**

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

![](https://img-blog.csdnimg.cn/img_convert/6e0ba223f65e063db5b1b4b6aa26129a.png)

*   框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。

*   算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯



*   在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

*   要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
    喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值