DOM树(下) -- 第八课

news2024/11/28 2:30:03

文章目录

  • 前言
  • 一、DOM属性操作
    • 1. 获取属性值
    • 2. 设置属性值
    • 3. 移除属性值
  • 二、节点
    • 1.什么是节点?
    • 2. 节点层级
      • 1. 获取父级节点
      • 2. 获取兄弟节点
      • 3. 获取子节点
    • 3. 节点操作
      • 1. 创建节点
      • 2. 添加和删除节点
  • 三、事件进阶
    • 1. 注册事件
      • 1. 传统方式
      • 2. 监听方式
    • 2. 删除事件
    • 3. 事件流
  • 四、事件对象
    • 1. 什么是事件对象?
    • 2. 事件对象的使用
    • 3. 事件对象的常见属性和方法
      • 1. 对比e.target和this的区别
      • 2. 阻止默认行为
      • 3. 阻止事件冒泡
      • 4. 事件委托
    • 4. 鼠标事件
      • 1. 鼠标事件对象
      • 2. 禁止鼠标右键
      • 3. 禁止选中
  • 总结


前言

紧接上一节DOM的讲解,让我们继续来深究DOM的奥秘


一、DOM属性操作

1. 获取属性值

在DOM对象中可以使用“element.属性”的方式来获取内置的属性值,但是DOM对象并不能直接使用点语法获取到自定义属性的值,那么如何获取自定义属性值呢?

在DOM中,可以使用getAttribute(‘属性’')方法来返回指定元素的属性值。接下来通过案例来演示如何获取属性值。

2. 设置属性值

在DOM对象中可以使用"element.属性-,值,"的方式来设置内置的属性值,并且针对于自定义属性,提供了"element.setAttribute(“属性”,"值)"的方式进行获取。

值得一提的是,设置了自定义属性的标签,在浏览器中的HTML结构中可以看到该属性。接下来通过案例来演示如何设置属性值。

3. 移除属性值

DOM对象可以使用removeAttribute()方法来移除属性值。该方法接受一个参数,即要移除的属性名。例如,下面的代码将从DOM对象中移除id属性的值:

let element = document.querySelector('div');

// 方法一
element.removeAttribute('id');

// 方法二
element .className = ' '

// 方法三
element .setAttribute('id',' ')

二、节点

1.什么是节点?

HTML文档可以看作是一个节点树,网页中的所有内容都是节点,一般来说,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这3个基本属性。下面列举常见的节点类型:

  1. 元素节点,nodeType为1
  2. 属性节点,nodeType为2
  3. 文本节点,nodeType为3,文本节点包含文字、空格、换行等
<!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>
        .box1{
            width: 200px;
            height: 200px;
            background-color: antiquewhite;
        }
        .box2{
            width: 400px;
            height: 400px;
            background-color:aqua;
        }
    </style>
</head>
<body>
    <div class="box1" id="nav" a="1"></div>
    <script>
        // 使用getAttribute获取属性
        var box = document.querySelector('.box1');
        console.log(box.getAttribute('class'));

        // 直接获取id属性
        console.log(box.id);
        console.log(box.className);

        // 修改class的值
        box.className = 'box2'
        box.setAttribute('class','box2');

        // 自定义属性的操作,
        // console.log(box.a) // 自定义属性值不能直接通过上面的第二种方式来获取
        console.log(box.getAttribute('a'));
        console.log(box.setAttribute('a','11'));

        // 默认属性值可以通过两种方式进行获取
    </script>
</body>
</html>

2. 节点层级

1. 获取父级节点

在JavaScript中,可以使用parentNode属性来获得离当前元素的最近的一个父节I点,如果找不到父节点就返回为 null,语法格式为:obj.parentNode,obj是一个DOM对象

2. 获取兄弟节点

可以使用nextElementSibling返回当前元素的下一个兄弟元素节点,previo usElementSibling属性返回当前元素的上一个兄弟元素节点,如果找不到则返回null。

3. 获取子节点

在JavaScript中,可以使用childNodes属性或者children属性两种方式来获得当前元素的所有子节点的集合,接下来我们就分别介绍这两种方式的用法。

方式1:childNodes属性获得的是当前元素的所有子节点的集合,该集合为即时更新的集合。下面通过案例的形式演示如何获取当前元素子节点。

方式2:children属性获得的是当前元素的所有子节点的集合,不会获取到文本

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <ul>
        <li class="1" ></li>
        <li></li>
        <li></li>
    </ul>
    <ol>
        <li></li>
        <li></li>
        <li></li>
    </ol>
    <div class="box">
        <div class="demo">
            <a href="#" class="" id=""></a>
            <div>
                <img src="" alt="">
            </div>
        </div>
    </div>
    <script>
        var ul = document.querySelector('ul');
        var li = document.querySelector('li');
        var demo = document.querySelector('.demo');

        console.log(ul.innerHTML);
        
        var a = document.querySelector('a');
        // 获取父节点
        console.log(a.parentElement);
        console.log(a.parentNode);

        // 兄弟节点
        console.log(a.previousElementSibling);
        console.log(a.nextElementSibling);

        // 子节点
        // childNodes -- 可以获取到标签下面的所有东西,包括文本的标签,包括换行
        console.log(demo.childNodes);

        // 获取子标签,不包括换行
        console.log(demo.children);

    </script>
</body>
</html>

3. 节点操作

1. 创建节点

在DOM中,使用document.createElement(‘tagName’)方法创建由tagName指定I的HTML元素,也称为动态创建元素节点。

2. 添加和删除节点

DOM中,提供了node.appendChild()和node.insertBefore()方法用于添加节点,node.removeChild(child)用于删除节点。下面讲解这3种方法的使用。

  1. appendChild()方法,将一个节点添加到指定父节点的子节点列表末尾
  2. insertBefore(child,指定元素)方法,将一个节点添加到父节点的指定子节点前面
  3. removeChild(child)用于删除节点,该方法从DOM中删除一个子节点,返回删除的节点

三、事件进阶

1. 注册事件

在JavaScript中,注册事件(绑定事件)有两种方式,即传统方式注册事件和事件监听方式注册事件。下面分别针对这两种方式进行讲解。

1. 传统方式

元素对象.事件 = 事件的处理程序;
//示例
oBtn.onclick = function(){}

注意:该方式注册事件的特点在于注册事件的唯一性,即同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数。

2. 监听方式

使用addEventListener创建并添加新节点到DOM树中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button>点击</button>
    <script>
        var btn = document.querySelector('button');
        function fn(){
            console.log(1);
            btn.removeEventListener('click',fn);
        }
        btn.addEventListener('click',fn);
    </script>
</body>
</html>

2. 删除事件

DOM对象.onclick = null;传统方式删除事件
DOM对象.removeEventListener(type,callback);//标准浏览器

3. 事件流

事件流是指当事件发生时,会在发生事件的元素节点与DOM树根节点之间按照特定的顺序进行传播,这个过程称之为事件流。

网景(Netscape)公司团队的事件流采用事件捕获方式,而微软(Microsoft)公司的事件流采用事件冒泡方式,W3C对网景公司和微软公
司提出的方案进行了中和处理,规定了事件发生后,首先实现事件捕获,但不会对事件进行处理;然后进行到目标阶段,执行当前元素对象的事件处理程序,但它会被看成是冒泡阶段的一部分;最后实现事件的冒泡,逐级对事件进行处理。

W3C规定的事件流的具体过程对比如下图所示:
请添加图片描述

四、事件对象

1. 什么是事件对象?

当一个事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是event。只有有了事件event才会存在,它是系统自动创建的,不需要传递参数。

2. 事件对象的使用

在IE11的开发人员工具中,在Chrome浏览器中的效果如右图所示:
请添加图片描述

3. 事件对象的常见属性和方法

在事件发生后,事件对象event中会包含一些所有事件都有的属性和方法。所有事件基本上都包括的常用的属性和方法如下表所示。
请添加图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
    </ul>
    <script>
        var ul = document.querySelector('ul');
        var li = document.querySelector('li');
        var body = document.querySelector('body');
        ul.addEventListener('click',function(){console.log(ul);});
        li.addEventListener('click',function(){console.log(li);});
        body.addEventListener('click',function(){console.log(body);});

        // 事件流的三个阶段
        // 1.js代码中只能执行捕获或冒泡其中的一个阶段
        // 2.onclick只能捕获到冒泡阶段
        // 3.addEventListener可以得到捕获阶段,第三个参数协程true
        ul.addEventListener('click',function(){console.log(ul);},true);
        li.addEventListener('click',function(){console.log(li);},true);
        body.addEventListener('click',function(){console.log(body);},true);

    </script>
</body>
</html>

1. 对比e.target和this的区别

在事件处理函数中,e.target返回的是触发事件的对象,而this返回的是绑定事件的对象。

div.onclick = function(e) {
	var target = e. target; 
    console. log(target);
}

2. 阻止默认行为

在实际开发中,为了使程序更加严谨,想要确定含有默认行为的标签符合要求后,才能执行默认行为时,可利用事件对象的preventDefault()方法,禁止所有浏览器执行元素的默认行为。需要注意的是,只有事件对象的cancelable属性设置为true,才可以使用preventDefault()方法取消其默认行为。

3. 阻止事件冒泡

可以利用事件对象调用stopPropagation(),实现禁止所有浏览器的事件冒泡行为。

e.stopPropagation();

4. 事件委托

事件委托的原理是,不给每个子节点单独设置事件监听器,而是把事件监听器设置在其父节点上,让其利用事件冒泡的原理影响到每个子节点。

简而言之,就是不给子元素注册事件,给父元素注册事件,让处理代码在父元素的事件中执行。

这样做的的优点在于,只操作了一次DOM,提高了程序的性能。

4. 鼠标事件

鼠标是计算机的一种输入设备,也是计算机显示系统纵横坐标定位的指示器,所以鼠标事件是Web开发中最常用的一类事件。常见的鼠标事件如下表所示:
请添加图片描述

1. 鼠标事件对象

鼠标事件对象MouseEvent,是跟鼠标事件相关的一系列信息的集合,可以用来获取当前鼠标的位置信息,鼠标事件位置属性如下表所示。请添加图片描述
鼠标移动案例

<!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>
        img{
            position: absolute;
            left: 0px;
            top: 0px;
        }
    </style>
</head>
<body>
    <img src="./images/angel.gif" alt="">
    <script>
        var img = document.querySelector('img');
        document.addEventListener('mousemove',function(e){
            var x = e.pageX;
            var y = e.pageY;
            console.log(x,y);

            img.style.left = x - 30 +'px';
            img.style.top = y - 40 + 'px';
        })
    </script>
</body>
</html>

2. 禁止鼠标右键

contextmenu主要控制应该何时显示上下文菜单,主要应用于程序员取消默认的上下文菜单,示例代码如下。

document.addEventListener(' contextmenu', function (e) {
	e. preventDefault();
})

3. 禁止选中

selectstart事件是鼠标开始选择文字时就会触发,如果禁止鼠标选中,需要禁止该事件的默认行为,示例代码如下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    禁止选中
    <script>
        document.addEventListener('contextmenu',function(e){
            e.preventDefault();
        })
        document.addEventListener('selectstart',function(e){
            e.preventDefault();
        })
    </script>
</body>
</html>

总结

关于DOM的讲解到这里就结束了,希望大家都有所收获!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第4篇:MSSQL日志分析----应急响应之日志分析篇

常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析&#xff0c;可以发现攻击行为&#xff0c;进一步还原攻击场景及追溯攻击源。 0x01 MSSQL日志分析 首先&#xff0c;MSSQL数据库应启用日志记录功能&#xff0c;默认配置仅限失败的登录&…

Veritus netbackup 管理控制台无法连接:未知错误

节假日停电&#xff0c;netbackup服务器意外停机后重新开机&#xff0c;使用netbackup管理控制台无法连接&#xff0c;提示未知错误。 ssh连接到服务器&#xff0c;操作系统正常&#xff0c;那应该是应用有问题&#xff0c;先试一下重启服务器看看。重新正常关机&#xff0c;重…

【Ubuntu】使用阿里云apt源来更新apt源

1.前言 我在京东云买了一个云服务器&#xff0c;但是我第一次使用apt的时候&#xff0c;发现遇到了下面这些情况 后面听老师讲&#xff0c;还需要执行下面这个 但是我再次使用apt下载软件的时候&#xff0c;还是出现了下面这个情况 后面问了老师才知道是apt源的问题&#x…

解决Github打不开或速度慢的问题

一、原因 我们先分析一下Github在国内访问慢或有时候登陆不上去的问题原因&#xff1a;其实这都是因为我们访问github官网时是直接访问域名即github.com&#xff0c;那么中间有个域名通过DNS解析的过程&#xff0c;将域名解析为对应的ip地址&#xff0c;其实主要时间都是花在了…

【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;寻找one piece的刷题之路 什么是双指针算法 双指针算法是一种常用的编程技巧&#xff0c;尤其在处理数组和字符串问题时非常有效。这种方法的核心思想是使用两个指针来遍历数据结构&#xff0c;这两…

学习记录:js算法(五十二):验证二叉搜索树

文章目录 验证二叉搜索树我的思路网上思路 总结 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的 左子树 只包含 小于 当前节点的数。 节点的 右子树 只包含 大于 当前节点的数。 所有…

【Python】AudioLazy:基于 Python 的数字信号处理库详解

AudioLazy 是一个用于 Python 的开源数字信号处理&#xff08;DSP&#xff09;库&#xff0c;设计目的是简化信号处理任务并提供更直观的操作方式。它不仅支持基础的滤波、频谱分析等功能&#xff0c;还包含了滤波器、信号生成、线性预测编码&#xff08;LPC&#xff09;等高级…

Mybatis框架梳理

Mybatis框架梳理 前言1.ORM2.模块划分2.1 ORM的实现2.2 SQL的映射2.3 插件机制2.4 缓存机制2.5 其他 3. 愿景 前言 如果让我聊一聊mybatis&#xff0c;我该怎么说呢&#xff1f;开发中时时刻刻都在用它&#xff0c;此时此刻&#xff0c;脑海中却只浮现ORM框架这几个字&#xff…

Linux --入门学习笔记

文章目录 Linux概述基础篇Linux 的安装教程 ⇒ 太简单了&#xff0c;百度一搜一大堆。此处略……Linux 的目录结构常用的连接 linux 的开源软件vi 和 vim 编辑器Linux 的关机、开机、重启用户登录和注销用户管理添加用户 ⇒ ( useradd 用户名 ) &#xff08; useradd -d 制定目…

【AIGC】内容创作——AI文字、图像、音频和视频的创作流程

我的主页&#xff1a;2的n次方_ 近年来&#xff0c;生成式人工智能&#xff08;AIGC&#xff0c;Artificial Intelligence Generated Content&#xff09;技术迅速发展&#xff0c;彻底改变了内容创作的各个领域。无论是文字、图像、音频&#xff0c;还是视频&#xff0c;A…

SPARK调优:AQE特性(含脑图总结)

学完AQE需要能够回答如下的几个问题&#xff1a; 什么是AQE&#xff1f;AQE的实现原理是什么&#xff1f;AQE的特性有哪些&#xff1f;使用什么参数实现&#xff1f;AQE每个特性可以解决什么问题&#xff1f;什么问题是AQE不能解决的 HL&#xff1a;学习脑图如下 SparkAQE是spa…

MES系统适用于哪些行业?MES系统对于企业的作用和价值

MES系统&#xff08;制造执行系统&#xff09;广泛应用于多个行业&#xff0c;并在这些行业中发挥着重要作用&#xff0c;为企业带来了显著的价值。以下是对MES系统适用行业及其对企业作用和价值的详细分析&#xff1a; 一、MES系统适用的行业 电子信息行业&#xff1a; 随着市…

大功率LED模块(5V STM32)

目录 一、介绍 二、模块原理 1.尺寸介绍 2.模块原理图 3.引脚描述 三、程序设计 main.c文件 timer.h文件 timer.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 大功率LED模块是一种照明设备&#xff0c;它将大功率高亮度发光二极管(LED)集成在铝基板上&…

Linux学习笔记(二):深入理解用户管理、运行级别与命令行操作

Linux学习笔记&#xff08;二&#xff09;&#xff1a;深入理解用户管理、运行级别与命令行操作 Linux学习笔记&#xff08;一&#xff09;&#xff1a;Linux学习环境的安装及远程连接工具的使用 1. 用户管理 1.1 用户密码管理 创建用户密码 使用 passwd 命令可以为指定用户…

封装了一个iOS水平方向动态宽度layout

我们有时候会遇到这样的情形&#xff0c;就是需要展示一些动态的标签&#xff0c;宽度是动态的&#xff0c; 水平方向是一行&#xff0c;其实这种情况还是比较容易处理的&#xff0c;只是一下子想不起来&#xff0c; 这里做了一个相关的需求&#xff0c;将思路和代码记录下来&a…

第5章 总线与微命令实验

第5章 总线与微命令实验 5.1实验目的 &#xff08;1&#xff09;理解总线的概念和作用。 &#xff08;2&#xff09;连接运算器与存储器&#xff0c;熟悉计算机的数据通路。 &#xff08;3&#xff09;理解微命令与微操作的概念。 5.2实验要求 &#xff08;1&#xff09;做…

69 BERT预训练_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录NLP里的迁移学习Bert的动机Bert架构对输入的修改五、预训练任务1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 NLP里的迁移学习 之前是使用预训练好的模型来抽取词、句子的特征&#xff0c;例如 word2vec 或语言模型这种非深度学习…

香酥胡麻饼 一口沦陷的传统美食

&#x1f96f;美食发现 | 胡麻饼&#xff0c;一口咬出的千年韵味&#x1f96f;&#x1f60b;宝子们&#xff0c;今天我要给大家分享一款超级有历史底蕴的美食 —— 食家巷胡麻饼。 ✨食家巷胡麻饼&#xff0c;那可是有着悠久历史的传统美食。在古代&#xff0c;它就备受人们喜…

【算法】链表:160.相交链表(easy)+双指针

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法&#xff08;双指针&#xff09; 返回结果 算法正确性 时间复杂度 4、代码 1、题目链接 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 ​ 3、解法&#xff08;…

MISC -第十天(音符加解密、敲击码、NtfsStreamsEditor工具)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解MISC的相关知识 [MRCTF2020]你能看懂音符吗 附件信息: rar文件无法打开&#xff0c;显示损坏&#xff0c;先放到hxd查看 头标识错误&#xff0c;尝试修复 rar标识头(52 61 72 21) 压缩包里有一个d…