DOM核心知识点 + 节点操作

举报
花花叔叔 发表于 2022/08/12 23:55:59 2022/08/12
【摘要】 关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。 创建 innerHTML createElement 增 appendChild insertBef...

关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。

创建

innerHTML

createElement

appendChild

insertBefore

removeChild

主要修改dom的元素属性,dom元素的内容、属性, 表单的值等

  1. 修改元素属性: src、href、title等 (分时显示不同图片,显示不同问候语)

  2. 修改普通元素内容: innerHTML 、innerText

  3. 修改表单元素: value、type、disabled等 (仿京东显示密码)

  4. 修改元素样式: style、className (淘宝点击关闭二维码 循环精灵图背景 显示隐藏文本框内容)

1. 如果样式修改较多,可以采取操作类名方式更改元素样式。
2. class因为是个保留字,因此使用className来操作元素类名属性
3. className 会直接更改元素的类名,会覆盖原先的类名

  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0lKkWjIf-1631246678902)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910114212413.png)]

  1. 排他思想 (百度换肤效果 表格隔行变色效果)

如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:

  1. 所有元素全部清除样式(干掉其他人)
  2. 给当前元素设置样式 (留下我自己)
  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己

  1. DOM提供的API 方法: getElementById、getElementsByTagName 古老用法 不太推荐
  2. H5提供的新方法: querySelector、querySelectorAll 提倡
  3. 利用节点操作获取元素: 父(parentNode)、子(children)、兄(previousElementSibling、
    nextElementSibling) 提倡
1. document.getElementById('id');

  
2. document.getElementsByTagName('标签名');

  
3. document.getElementsByClassName(‘类名’);// 根据类名返回元素对象集合

  
4. document.querySelector('选择器'); // 根据指定选择器返回第一个元素对象

  
5. document.querySelectorAll('选择器'); // 根据指定选择器返回

  
6. doucumnet.body // 返回body元素对象

  
7. document.documentElement // 返回html元素对象

  

注意:querySelector 和 querySelectorAll里面的选择器需要加符号,比如:document.querySelector(’#nav’);

属性操作

  1. setAttribute:设置dom的属性值
  2. getAttribute:得到dom的属性值
  3. removeAttribute移除属性
<div id="demo" index="1" class="nav"></div>
console.log(div.getAttribute('id'));   //demo
console.log(div.getAttribute('index'));   //1
div.setAttribute('index', 2);  
div.removeAttribute('index');

  

事件操作

① 获取事件源(按钮)
② 注册事件(绑定事件),使用 onclick
③ 编写事件处理程序,写一个函数弹出 alert 警示框

var btn = document.getElementById('btn');
btn.onclick = function() {
alert('你好吗');
};

  

给元素注册事件, 采取 事件源.事件类型 = 事件处理程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLYHJz5D-1631246678903)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910102859841.png)]

案例

1. 分时显示不同图片,显示不同问候语

根据不同时间,页面显示不同图片,同时显示不同的问候语。
如果上午时间打开页面,显示上午好,显示上午的图片。
如果下午时间打开页面,显示下午好,显示下午的图片。
如果晚上时间打开页面,显示晚上好,显示晚上的图片。

分析:

① 根据系统不同时间来判断,所以需要用到日期内置对象
② 利用多分支语句来设置不同的图片
③ 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
④ 需要一个div元素,显示不同问候语,修改元素内容即可

<body>
    <button id="ldh">刘德华</button>
    <button id="zxy">张学友</button>
    <br>
    <img src="./images/zxy.jpg" alt="">
    <script>
        // 1. 获取事件
        var ldh = document.getElementById('ldh');
        var zxy = document.getElementById('zxy');
        var img = document.querySelector('img');
        // 2. 绑定事件 + 实现功能函数
        ldh.onclick = function () {
            // 图片的地址进行修改
            img.src = './images/ldh.jpg' ;
        }
        zxy.onclick = function () {
            img.src = './images/zxy.jpg' ;
        }
    </script>
</body>


  

2. 仿京东显示密码

点击按钮将密码框切换为文本框,并可以查看密码明文。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7fYBbPO-1631246678904)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910104741010.png)]

分析:

① 核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
② 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
③ 算法:利用一个flag变量,来判断flag的值,如果是1 就切换为文本框,flag 设置为0,如
果是0 就切换为密码框,flag设置为1

<body>
    <div class="box">
        <label for="">
            <img src="./images/close.png" alt="" id="eye">
        </label>
        <input type="password" name=""  id="pwd">
    </div>
    <script>
        // 1. 获取元素
        var eye = document.getElementById('eye');
        var pwd = document.getElementById('pwd');
        // 2. 绑定事件 + 函数
        var flag = 0 ;
        eye.onclick = function () {
            if ( flag == 0) {
                pwd.type = 'text' ;
                eye.src = 'images/open.png' ;
                flag = 1;
            } else {
                pwd.type = 'password' ;
                eye.src = 'images/close.png' ;
                flag = 0 ;
            }
        }
    </script>
</body>


  

3. 淘宝点击关闭二维码

当鼠标点击二维码关闭按钮的时候,则关闭整个二维码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOGaJwtg-1631246678906)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910105458465.png)]

分析:

① 核心思路: 利用样式的显示和隐藏完成, display:none 隐藏元素 display:block 显示元素
② 点击按钮,就让这个二维码盒子隐藏起来即可

var btn = document.querySelector('.close-btn');
var box = document.querySelector('.box');
// 2.注册事件 程序处理
btn.onclick = function() {
box.style.display = 'none';

  

4 .循环精灵图背景

可以利用 for 循环设置一组元素的精灵图背景

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JDBzW662-1631246678907)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910105641306.png)]

① 首先精灵图图片排列有规律的
② 核心思路: 利用for循环 修改精灵图片的 背景位置 background-position
③ 剩下的就是考验你的数学功底了
④ 让循环里面的 i 索引号 * 44 就是每个图片的y坐标

var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
// 让索引号 乘以 44 就是每个li 的背景y坐标 index就是我们的y坐标
var index = i * 44;
lis[i].style.backgroundPosition = '0 -' + index + 'px';
}

  

要注意 ‘++’的书写格式

5. 显示隐藏文本框内容

当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iK8DnAVs-1631246678907)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910110023913.png)]

分析:

① 首先表单需要2个新事件,获得焦点 onfocus 失去焦点 onblur
② 如果获得焦点, 判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容
③ 如果失去焦点, 判断表单内容是否为空,如果为空,则表单内容改为默认文字

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        input {
            color: #999;
        }
    </style>
</head>
<body>
    <input type="text" value="手机">
    <script>
        // 获取元素
        var text = document.querySelector('input') ;
        // 注册事件 得到焦点
        text.onfocus = function () {
            // console.log('得到了焦点');
            if (text.value == '手机') {
                this.value = '' ;
            }
            // 获得焦点需要把文本框里面的文字颜色变黑
            this.style.color = '#333' ;
            
        }
        // 注册事件 失去焦点
        text.onblur = function () {
            // console.log('失去了焦点');
            if (text.value == '') {
                this.value = '手机' ;
            }
            this.style.color = '#999' ;
        }
    </script>
</body>
</html>


  

6. 密码框提示错误信息

用户如果离开密码框,里面输入个数不是6~16,则提示错误信息,否则提示输入正确信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KavObbOD-1631246678908)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910114108787.png)]

<!-- 大体就是失去焦点之后,要进行判断密码的value的length是否满足需求,然后更改相应的样式  更改样式的时候使用的是className  -->
<body>
    <div class="register">
        <input type="password" class="ipt">
        <p class="message">请输入6~16位密码</p>
        <script>
            var ipt = document.querySelector('.ipt');
            var message = document.querySelector('.message');
            ipt.onblur = function () {
                if (this.value.length < 6) {
                    message.className = 'message wrong';
                    message.innerHTML = '您输入的位数不对,要求是6~16位';

                } else {
                    message.className = 'message right';
                    message.innerHTML = '您输入的正确';
                }
            }
        </script>
    </div>

</body>

  

① 首先判断的事件是表单失去焦点 onblur
② 如果输入正确则提示正确的信息颜色为绿色小图标变化
③ 如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化
④ 因为里面变化样式较多,我们采取className修改样式

7. 百度换肤效果

① 这个案例练习的是给一组元素注册事件
② 给4个小图片利用循环注册点击事件
③ 当我们点击了这个图片,让我们页面背景改为当前的图片
④ 核心算法: 把当前图片的src 路径取过来,给 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>
        var imgs = document.querySelector('.baidu').querySelectorAll('img') ;
        for ( var j = 0 ; j < imgs.length ; j++ ) {
            imgs[j].onclick = function () {
                // console.log(this.src);
                document.body.style.backgroundImage = 'url('+ this.src +')' ;
                
            }
        }
    </script>
</body>

  

8. 表格隔行变色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5CkyWpR-1631246678908)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910115123458.png)]

① 用到新的鼠标事件 鼠标经过 onmouseover 鼠标离开 onmouseout
② 核心思路:鼠标经过 tr 行,当前的行变背景颜色, 鼠标离开去掉当前的背景颜色
③ 注意: 第一行(thead里面的行)不需要变换颜色,因此我们获取的是 tbody 里面的行

    <script>
        // 获取元素
        var trs = document.querySelector('tbody').querySelectorAll('tr') ;
        for ( var i = 0 ; i < trs.length ; i ++ ) {
            trs[i].onmouseover = function () {
                // console.log('11');
                this.className = 'bg' ;
            }
            trs[i].onmouseout = function () {
                this.className = '' ;
            }
        }
    </script>

  

9. tab 栏切换(重点案例)

当鼠标点击上面相应的选项卡(tab),下面内容跟随变化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RMVu1kO4-1631246678909)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210910120215342.png)]

分析:

① Tab栏切换有2个大的模块
② 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类
名的方式
③ 下面的模块内容,会跟随上面的选项卡变化。所以下面模块变化写到点击事件里面。
④ 规律:下面的模块显示内容和上面的选项卡一一对应,相匹配。
⑤ 核心思路: 给上面的tab_list 里面的所有小li 添加自定义属性,属性值从0开始编号。
⑥ 当我们点击tab_list 里面的某个小li,让tab_con 里面对应序号的 内容显示,其余隐藏(排他
思想)

<!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>
        // 1. 背景色
        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 ++ ) {
            // 开始给五个小li设置索引号,使用自定义属性
            lis[i].setAttribute('index' ,i) ;
            lis[i].onclick = function () {
                // 排他思想 
                for ( var i = 0 ;i < lis.length ; i ++ ) {
                    lis[i].className = '' ;
                }
                this.className  = 'current' ;    //不需要加.
                var index =  this.getAttribute('index') ;
                // console.log(index); 
                for ( var i = 0 ; i < items.length ; i ++ ) {
                    items[i].style.display = 'none' ;
                }
                items[index].style.display = 'block' ;
            }
        }
    </script>
</body>

</html>


  

文章来源: blog.csdn.net,作者:花花叔叔,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_52077949/article/details/120219345

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。