06-JavaScript DOM对象

1. 从ECMA到W3C

我们知道,ECMA定义的是js的变量语法等基础的标准规范,而W3C是针对浏览器API提出的规范, 所以我们要工作不可能只了解语法,我们的代码要在浏览器上跑起来就需要我们去了解W3C的标准。

那么W3C规定了哪一系列的的API呢,DOM、BOM、AJAX、事件、存储等等。window.document,这个就是W3C提出的浏览器内置更多的对象之一。

1.1 API的概念

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组程序的能力,而又无需访问源码,无需理解其内部工作机制细节,只需直接调用使用即可。

总之API就是为我们程序员提供了一个接口,帮助我们实现某种功能。

1.2 Web API的概念

Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。

现阶段我们主要针对于浏览器讲解常用的 API , 主要针对浏览器做交互效果。

MDN 详细 API : Web API 接口参考 | MDN

2. 什么是DOM?

HTML DOM 是W3C (万维网联盟)制订的一套标准,标准中定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

注意:DOM 是 Document Object Model(文档对象模型)的缩写。

3. DOM 节点

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点

  • 每个 HTML 元素是元素节点

  • HTML 元素内的文本是文本节点

  • 每个 HTML 属性是属性节点

  • 注释是注释节点

4. DOM 节点树

我们在了解DOM的时候,首先需要了解到一个DOM树的结构,这是一种树形的数据结构。下图就是DOM文档渲染出来的DOM树。DOM 将 HTML 文档视为树形结构。这种结构被称为节点树:

DOM树 又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面。

  • 文档:一个页面就是一个文档,DOM中使用document表示

  • 节点:网页中的所有内容,在文档树中都是节点(标签、属性、文本、注释等),使用node表示

  • 标签节点:网页中的所有标签,通常称为元素节点,又简称为“元素”,使用element表示

  • DOM把以上内容都看做对象。(对象可以有属性和方法)

  • 通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML元素(节点)均可被修改,也可以创建或删除节点。

5. 节点之间的关系

节点树中的节点彼此拥有层级关系,我们可以使用父(parent)、子(child)和同胞(sibling)等术语来描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)

  • 每个节点都有父节点、除了根(它没有父节点)

  • 一个节点可拥有任意数量的子节点

  • 同胞是拥有相同父节点的节点

6. 获取元素节点

为什么要获取页面元素?

例如:我们想要操作页面上的某部分(显示/隐藏,动画),需要先获取到该部分对应的元素,再对其进行操作。

假设页面中包含如下代码,我们怎样使用 DOM 提供的方法获取这些节点呢?

<div id="main"> 
    <div class="box"> <p>段落内容</p> </div> 
    <div class="box"> <p>段落内容</p> </div> 
    <div class="box"> <p>段落内容</p> </div> 
</div>

6.1 根据 id 获取元素

document.getElementById('main'); // 获取 id 属性值为 main 的元素

6.2 根据标签名获取元素

document.getElementsByTagName('p');  // 获取标签名为 p 的元素

6.3 根据 class 获取元素

document.getElementsByClassName('box');  // 获取 class 属性值包含 box 类名的元素

6.4 获取特殊元素

//1、获取整个文档元素HTML
document.documentElement     
​
//2、获取body
document.body
​
//3.获取title
document.title
​

7. 修改节点

<p class="box">段落内容</p> 
<p class="box">段落内容</p> 
<p class="box">段落内容</p>

7.1 改变 HTML 内容

  • 改变元素内容的最简答的方法是使用 innerHTML和innerText 属性。

    var boxes = document.getElementsByClassName('box')[0];
    boxes.innerHTML = 'Hello DOM'; // 修改段落中文本
    boxes.innerText = 'Hello DOMText' // 修改段落中文本

  • 除了修改文本以外,还可以将文本变成 HTML 标签

    boxes.innerHTML = '<a href="#">链接</a>'; // 将段落中的文本修改成<a>元素

    innerText和innerHTML的区别

  • 获取内容时的区别:

    innerText会去除空格和换行,而innerHTML会保留空格和换行

  • 设置内容时的区别:

    innerText不会识别html,而innerHTML会识别。

7.2 改变 CSS 样式

  • 通过 HTML DOM,我们能够访问 HTML 元素的样式对象。

    boxes.style.color = '#f00'; // 字体颜色修改成红色
    ​
    boxes.style.fontSize = '12px'; // 字体大小修改成 12px

7.3 改变 HTML 属性

方法一:

获取属性的值

元素对象.属性名

设置属性的值

元素对象.属性名 = 值

表单元素中有一些属性如:disabled、checked、selected,元素对象的这些属性的值是布尔型。

方法二:

  • 获取元素的属性值

    boxes.getAttribute('class'); // 获取 class 属性的值
  • 给元素添加/修改/删除属性

    boxes.setAttribute('title', '段落的title属性内容'); // 设置 title 属性
    // 移除属性 removeAttribute(属性)    
     div.removeAttribute('class');

8. 操作HTML元素

<div id="main"> 
    <p id="box1">段落内容</p> 
    <p id="box2">段落内容</p> 
    <p id="box3">段落内容</p> 
</div>

8.1 输出到文档

方法:document.write(exp1,exp2,exp3,....)

作用:可以将任意字符串插入在文档中。

document.write("Hello World!");
​
document.write("<h1>Main title</h1>");

8.2 新建节点

方法:document.createElement(tagName);

作用:根据标签名(tagName)创建新的 DOM 对象。

这个方法只接受一个参数,要创建元素的标签名。例如,下面的代码创建了一个<p>元素:

var newElement = document.createElement('p'); // 创建新元素 p

8.3 新建文本节点

方法:document.createTextNode("文本");

作用:创建一个文本节点。

var newElement=document.createElement("p");
var textCon=document.createTextNode("Hello World");
newElement.appendChild(textCon);
document.body.appendChild(newElement);

8.4 追加节点

方法:parentElement.appendChild(newElement);

作用:追加到父元素内容的后面。

var parentElement = document.getElementById('main'); // 获取父元素
​
parentElement.appendChild(newElement); // 将新元素追加到父元素内容之后

8.5 插入节点

方法:parentElement.insertBefore(newElement, targetElement)

作用:将新创建的元素(newElement)添加到目标元素(targetElement)前面

var parentElement = document.getElementById('main'); // 获取父元素
​
var targetElement = document.getElementById('box2'); // 获取目标元素
​
var newElement = document.createElement('p'); // 创建新元素
//将新元素插入到目标元素之前
parentElement.insertBefore(newElement, targetElement);

注意:没有inertAfter这个方法。

8.6 替换节点

方法:parentElement.replaceChild(newElement, targetElement)

作用:使用新元素替换目标元素

被替换的节点将从文档树种移除,同时要插入的节点占据其位置。

var parentElement = document.getElementById('main'); // 获取父元素
​
var targetElement = document.getElementById('box2'); // 获取目标元素
​
var newElement = document.createElement('p'); // 创建新元素
​
parentElement.replaceChild(newElement, targetElement); // 使用新元素替换目标元素

8.7 删除节点

方法:parentElement.removeChild(childElement);

作用:从父元素(parentElement)中删除一个子元素(childElement)

var parentElement = document.getElementById('main'); // 获取父元素
var childElement = document.getElementById('box2'); // 获取子元素
parentElement.removeChild(childElement); // 将子元素从父元素中删除

注意:以上4个方法操作的都是某个节点的子节点,也就是说,要使用这几个方法必须先取得父节点。另外,并不是所有节点都有子节点,如果在没有子节点的节点上调用这些方法,将会出错。

8.8 删除本身节点remove()

var targetElement = document.getElementById('box');
//删除节点
targetElement.remove()

8.9 克隆节点

方法:currentElement.cloneNode(true/false);

作用:复制 DOM 元素。

该方法只接受一个布尔值的参数,true代表深度拷贝,false代表浅拷贝,不传参的话,默认为false。

var currentElement = document.getElementById('main'); // 获取需要复制的元素
​
currentElement.cloneNode(); // 只复制元素本身,忽略其子元素-false默认
​
currentElement.cloneNode(true); // 复制元素本身,及其子元素

注意:这个方法是所有节点都有的。如果不传递任何参数,默认只拷贝当前元素节点,如果传递的参数为true,就会进行深度拷贝,也就是被拷贝元素内的所有后代元素都会被复制。

9. 根据DOM节点层次关系获取元素

// 访问父节点(亲爸爸)
console.log(div.parentNode);
​
// 访问下一个兄弟节点
//包括空白节点(幽灵节点) 
console.log(div.nextSibling);
//IE9以上才支持
console.log(div.nextElementSibling);
​
// 访问上一个兄弟节点
//包括空白节点(幽灵节点) 
console.log(div.previousSibling);
//IE9以上才支持
console.log(div.previousElementSibling);
​
// 访问第一个孩子节点
//包括空白节点(幽灵节点) 
console.log(div.firstChild);
//IE9以上才支持
console.log(div.firstElementChild);
​
// 访问最后一个孩子节点
//包括空白节点(幽灵节点) 
console.log(div.lastChild);
//IE9以上才支持
console.log(div.lastElementChild);
​
// 访问孩子节点
//包括空白节点(幽灵节点) 
console.log(div.childNodes);
​
console.log(div.children[1]);

9.1节点的类型名称及值

  • nodeType 属性返回节点类型。

如果节点是一个元素节点,nodeType 属性返回 1。

如果节点是属性节点, nodeType 属性返回 2。

如果节点是一个文本节点,nodeType 属性返回 3。

如果节点是一个注释节点,nodeType 属性返回 8。

  • nodeName 属性指定节点的节点名称。

如果节点是元素节点,则 nodeName 属性返回标签名。

如果节点是属性节点,则 nodeName 属性返回属性的名称。

对于其他节点类型,nodeName 属性返回不同节点类型的不同名称。

  • nodeValue 属性设置或返回指定节点的节点值。

9.2 获取属性节点方法

总结

每天一总结,今天又有什么新的收获呢?你做好为明天奋战的准备了吗?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入PostgreSQL中的pg_global表空间

pg_global表空间的位置 在PG当中&#xff0c;一个实例(cluster)初始化完以后&#xff0c;你会看到有下边两个与表空间相关的目录生成&#xff1a; $PGDATA/base $PGDATA/global 我们再用元命令\db以及相关视图看看相应的表空间信息&#xff1a; postgres# \db …

28. UE5 RPG同步面板属性(四)

在前面几篇中&#xff0c;我们实现了以下步骤&#xff1a; 首先我们需要通过c去实现创建GameplayTag&#xff0c;这样可以在c和UE里同时获取到Tag创建一个DataAsset类&#xff0c;用于设置tag对应的属性和显示内容创建AttributeMenuWidgetController实现对应逻辑 上面几步在前…

MySQL数据库下,使页面传入的数据与保存的数据编码一致

一、查询当前MySQL数据库的编码 &#xff08;1&#xff09;登录MySQL数据库&#xff08;Windows系统&#xff09;&#xff1a;winR打开命令终端&#xff0c;cd到MySQL的bin目录&#xff0c;输入mysql -u root -p&#xff0c;回车后输入登录密码 &#xff08;2&#xff09;查看…

【C++】C++入门第一课(c++关键字 | 命名空间 | c++输入输出 | 缺省参数)

目录 前言 C关键字 命名空间 1.命名空间的定义 A.标准命名空间定义 B.命名空间允许嵌套定义 C.同名命名空间的合并 2.命名空间的使用 加命名空间名称及作用限定符 使用using将命名空间中某个成员引入 使用using namespace命名空间名称引入 C的输入和输出 缺省参数…

C++类基础5——拷贝构造函数,拷贝赋值运算符(复制构造函数,复制赋值运算符)

拷贝控制操作 当定义一个类时&#xff0c;我们显式地或隐式地指定在此类望的对象拷贝&#xff0c;移动、赋值和销毁时做什么。 一个类通定义五种特殊的成员函数来控制这些操作&#xff0c;包括&#xff1a;拷贝构造函数(copy consinuctor)、拷贝赋值运算符(copy-assignment op…

如何修复开机但不显示任何内容的计算机?这里提供详细步骤

前言​ 计算机“无法开机”的最常见方式是PC实际开机但在显示器上不显示任何内容。你看到电脑机箱上的灯,可能看到里面的风扇在转,甚至可能听到声音,但屏幕上什么也没有显示,请按照我们提供的顺序尝试以下常见修复方法。 测试显示器 在对计算机的其余部分进行更复杂和耗时…

Mac 下安装maven教程

note&#xff1a;网上已经有很多该类型教程了&#xff0c;这边自身保留一份&#xff0c;方便后面使用&#xff1b; 一、安装地址&#xff1a;官网 二、安装步骤 $ tar -xvf apache-maven-3.3.9-bin.tar.gz //mac支持手动点击解压 $ sudo mv -f apache-maven-3.3.9 /usr…

C语言函数递归调用

在C语言中&#xff0c;函数可以直接或间接地调用自身&#xff0c;这种函数调用自身的过程称为递归调用。递归是一种强大的编程技巧&#xff0c;能够简化程序结构、提高代码的可读性和可维护性。本文将介绍C语言函数递归调用的原理、应用场景以及注意事项。 以下是我整理的关于…

HANA中的内存及磁盘使用统计

1. 引言 在实际使用中&#xff0c;通过HANA的admin控制台&#xff0c;确实可以得到很多重要的信息。但有的时候不如人愿&#xff0c;你需要提供相应的SQL语句得到具体的信息。 比如&#xff0c;我要得到所有的行表的内存及磁盘占用信息&#xff1b;我需要得到所有列表的内存及…

[WebGL] 实例化绘制性能测试

实例化绘制&#xff08; Instanced Drawing &#xff09;是 OpenGL / WebGL 等图形 API 中常用的性能优化技术&#xff0c;它适用于同样的模型绘制次数非常多的场景&#xff0c;能够有效的降低显存占用和图形 API 接口调用的次数&#xff0c;达到性能提升的效果。以前我只知道怎…

蓝桥杯 java 承压计算

题目: 思路&#xff1a; 1&#xff1a;其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2&#xff1a;假设每块原料的重量都十分精确地平均落在下方的两个金属块上&#xff0c;最后&#xff0c;所有的金属块的重量都严格精确地平分落在最底层的电子…

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点 功能介绍头文件C文件运行过程 功能介绍 上面的代码实现了一个简单的 Qt 应用程序&#xff0c;其功能包括&#xff1a; 创建一个 MainWindow 类&#xff0c;继承自 QMainWindow&#xff0c;作为应用程序的…

物联网学习1、什么是 MQTT?

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备之间的高效通…

FLASH的读取与写入

FLASH的写入 结合HAL库所给参数&#xff1a; 查阅具体使用芯片的参考手册。 就不在详细解释&#xff0c;英文自行翻译。具体代码如下&#xff1a; /*FLASH写入程序*/ void WriteFlashTest(uint32_t L, uint32_t addr, uint32_t *Data,int Page) {int i0;/* 1/4解锁FLASH*/HAL…

揭秘五力模型:轻松掌控企业竞争命脉,决策不再迷茫!

五力分析模型又成为波特五力模型是由著名的管理学者迈克尔波特(Michael Porter)在20世纪80年代初提出的一种理论框架&#xff0c;它对企业营销中的战略制定产生了全球性的深远影响。这一模型被广泛应用于企业竞争战略的分析&#xff0c;可以帮助企业有效地分析企业在营销环境中…

python-pytorch获取FashionMNIST实际图片标签数据集

在查看pytorch官方文档的时候&#xff0c;在这里链接中https://pytorch.org/tutorials/beginner/basics/data_tutorial.html的Creating a Custom Dataset for your files章节&#xff0c;有提到要自定义数据集&#xff0c;需要用到实际的图片和标签。 在网上找了半天没找到&a…

蓝海项目!黑科技引爆全网流量小红书拉新,单日暴力收益7000+,小白也能轻松上手【揭秘】

众所周知&#xff0c;自去年以来&#xff0c;图文作品在各大平台如快手和抖音的流量大增&#xff0c;这得益于这些平台与小红书的竞争。目前&#xff0c;小红书也在积极推广&#xff0c;成功推荐新用户下载应用的奖励高达15元&#xff0c;这一数字几乎是其他平台的几倍。此外&a…

【TypeScript】解决字面量类型推断错误的四种方式

解决字面量类型推断错误的四种方式 方式一&#xff1a;对象属性使用类型断言方式二&#xff1a;传参使用类型断言方式三&#xff1a;对象使用类型断言方式四&#xff1a;对象属性使用变量&#xff0c;变量使用字面量类型参考 declare function handleRequest(url: string, meth…

深入理解HDFS工作原理:大数据存储和容错性机制解析

** 引言&#xff1a; ** 在当今数据爆炸的时代&#xff0c;存储和管理大规模数据成为了许多组织面临的重要挑战。为了解决这一挑战&#xff0c;分布式文件系统应运而生。Hadoop分布式文件系统&#xff08;HDFS&#xff09;作为Apache Hadoop生态系统的核心组件之一&#xff…

Java | Leetcode Java题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head null, tail null;int carry 0;while (l1 ! null || l2 ! null) {int n1 l1 ! null ? l1.val : 0;int n2 l2 ! null ? l2.val : 0;int sum…