DOM核心知识点 + 节点操作

简介: DOM核心知识点 + 节点操作

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


创建


innerHTML


createElement



appendChild


insertBefore



removeChild



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


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


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


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


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


1. 如果样式修改较多,可以采取操作类名方式更改元素样式。

2. class因为是个保留字,因此使用className来操作元素类名属性

3. className 会直接更改元素的类名,会覆盖原先的类名


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


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


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



DOM提供的API 方法: getElementById、getElementsByTagName 古老用法 不太推荐

H5提供的新方法: querySelector、querySelectorAll 提倡

利用节点操作获取元素: 父(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’);


属性操作


setAttribute:设置dom的属性值

getAttribute:得到dom的属性值

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('你好吗');
};


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


案例


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. 仿京东显示密码


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



分析:


① 核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码

② 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框

③ 算法:利用一个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. 淘宝点击关闭二维码


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


分析:


① 核心思路: 利用样式的显示和隐藏完成, 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 循环设置一组元素的精灵图背景


① 首先精灵图图片排列有规律的

② 核心思路: 利用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. 显示隐藏文本框内容


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



分析:


① 首先表单需要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,则提示错误信息,否则提示输入正确信息

<!-- 大体就是失去焦点之后,要进行判断密码的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. 表格隔行变色


① 用到新的鼠标事件 鼠标经过 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>


相关文章
|
2月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
XML DOM 遍历节点树
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
JavaScript
HTML DOM 节点树
HTML DOM 节点是指在 HTML 文档对象模型中,文档中的所有内容都被视为节点。整个文档是一个文档节点,每个 HTML 元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。DOM 将文档表示为节点树,节点之间有父子和同胞关系。
|
2月前
|
JavaScript
HTML DOM 节点
HTML DOM(文档对象模型)将HTML文档视为节点树,其中每个部分都是节点:文档本身是文档节点,HTML元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。节点间存在父子及同胞关系,形成层次结构。
|
2月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
XML DOM 遍历节点树
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
XML DOM 遍历节点树