DOM基础

news2024/9/30 13:19:12

一、DOM的概念

文档对象模型(DOM,Document Object Module)是W3C组织推荐的处理可扩展标志语言的标准编程接口,它允许程序和脚本动态的访问和更新文档的内容、结构和样式。

HTML的DOM操作是将文档里所有的内容(包括标签、标签里的内容、标签属性甚至注释等)都当做一个HTML的节点。所有的节点按照组织结构构成一个树形结构,最上层节点就是我们的整个文档(document).

 从上图中可以看出,所有的节点都是从文档开始的,JS里有一个内置对象document,指的就是这个属性结构的根节点。所以,使用JavaScript可以获取和修改这个树形结构的所有节点,这个过程我们就可以称之为DOM操作。

<script>
    window.onload = function () {
        var pic = document.getElementById('pic');
        console.log(pic.height); 
        var one = document.getElementsByClassName('one')[0];
        var btn = document.getElementById('btn');
        btn.onclick = function(){
            one.textContent = '<a href="http://www.baidu.com">hello</a>'
            one.style.color = 'red';
        }      
    }
</script>
</head>
<body>
    <p class="one">我是一个p</p>
    <img id="pic" src="IMG_0120.JPG" alt="" width="200px">
    <button id="btn">点我呀</button>
</body>

上面的一段代码的作用是界面上的一个图片元素,并打印这个图片元素的高度,获取一个按钮和一个p标签,点击按钮时,修改p标签的显示的文字。这段代码需要注意以下问题: 所有的DOM操作代码,都建议写在window.onload事件函数里,当整个浏览器窗口加载完成以后,再执行DOM操作,否则可能会出现找不到元素的情况。

除此之外,上述代码还有几个问题:

  • document.getElementsByClassName这个函数,在老版本的IE浏览器里不支持。
  • one.textcontent属性在老版本的IE浏览器里同样也不支持。

如果要解决上述的问题,需要额外再写很多处理兼容性问题的代码,加大开发难度。

由于原生DOM的局限性,所以在前端开发中,基本上不会使用原生DOM来操作页面上的元素,早期操作页面元素都是使用jQuery这种类型的JS库来实现。随着Angular,React以及Vue的发展,jQuery也正在退出历史舞台。但是无论是jQuery还是Vue,它们在操作页面元素时,底层都是通过原生DOM来实现的。

二、DOM操作

常见的DOM操作主要分为一下几个步骤:

  1. 获取页面的标签元素
  2. 操作页面上的标签
    • 获取和修改标签属性
    • 增加和删除标签
    • 事件处理

1. 查找标签

要操作页面上的元素,首先需要查找到页面上的元素。在JS里有一个内置的顶级对象window,它用来表示当前的显示器窗口,所有的元素都从window对象里开始查找。

window.console.long("hello");  // console其实也是window对象里的一个对象

通常情况下,window.可以省略,例如,将window.console直接写成console,将window.document简写成为document.

在window中还有一个对象属性document,用来表示当前页面上的文档对象。它是整个DOM操作的顶级对象,通过document对象,我们可以操作页面上的所有内容。

document.getElementById(id);  // 根据id从页面上查找到对应的元素
document.getElementsByClassName(className);  // 根据 类名 从页面上查找到所有的标签
document.getElementsByTagName(tagName);  // 根据标签名查找到页面上的所有标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="one"></div>
<div id="two"></div>
<span></span>

<script>
   window.onload = function () {
        window.document.getElementById("two");
        document.getElementsByClassName("one");
        document.getElementsByTagName("span");

        let oneDiv = document.getElementsByClassName("one")[0];
        let spanElement = oneDiv.getElementsByTagName("span")[0];

        /* 
        // getElementById(id) 方法只能由 document 来调用,不能使用其他DOM对象调用!
        oneDiv.getElementById("link");  // 运行报错!!!
        */
    }
</script>
</body>
</html>

注意事项:

  1. getElementById(id)方法只能通过document这个DOM对象调用,不能通过其他DOM对象调用。
  2. getElementsByClassName(className)方法在老版本的IE浏览器里不支持,会有浏览器兼容性问题。

2. 操作页面元素

获取到标签元素以后,可以通过相关的方法获取和修改标签的属性,删除和新增标签以及添加事件处理。

3. 标签的属性

不同的标签元素支持不同的属性,能够调用的方法不同,具体可以通过文档查看每个标签类型具体支持的方法。下面我们只列举出一些常见标签的常见属性和方法。

方法和属性名作用适用范围
innerHTML获取和设置标签上的内容。如果内容里有标签,标签会被解析所有HTML标签
innerText获取和设置标签上的内容。如果内容里有标签,标签不会被解析,以存文本的形式显示所有HTML标签
textContent和innerText的功能一样,为了解决浏览器兼容性问题所有的HTML标签
style获取和设置标签的行内样式所有的HTML标签
src获取和设置img标签的图片源img标签
href获取和设置a标签的链接地址a标签
value表示input输入框里的内容input标签元素
type标签input输入框的类型input标签元素

其他类型标签的属性,都可以通过标签名.属性名的形式来获取和修改。具体哪个标签能够使用哪个属性,可以参考标签属性章节。

4. 添加和删除标签

  • remove()方法: 将当前标签从父标签里移除掉。
  • removeChild(child)方法: 从父标签里移除指定的子标签。
  • document.createElement(tagName)方法: 创建一个标签。
  • appendChild(child)方法: 将子标签添加到父标签里。

5. 事件处理

JS是一个事件驱动型的语言,几乎所有的逻辑都由事件来完成。事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键盘上的某些按键,事件还可能是Web浏览器中发生的事情,比如说某个Web页面加载完成,或者是用户滚动窗口或改变窗口大小。说白了,事件是文档或浏览器中发生的特定交互瞬间!

JS的事件处理方式分为事件冒泡(点击一个元素时,会先触发这个元素的点击事件,然后再逐级调用各个父元素的点击事件)和事件捕获(和时间冒泡调用顺序相反)两种方式,默认的事件处理方式是事件冒泡。

添加事件的方式

  • 直接给DOM对象添加onclick属性,指定一个函数。

document.getElementById("father").onclick = function () {
    console.log("father被点击了");
};
document.getElementById("son").onclick = function () {
    console.log("son被点击了");
};
  • 调用DOM对象的addEventListener(eventName,eventFunction)方法给DOM添加事件。
document.getElementById('father').addEventListener("click", function () {
    console.log("father被点击了");
});
document.getElementById('son').addEventListener("click", function () {
    console.log("son被点击了");
});

6. 事件对象

每次事件产生时,在事件处理函数里都会有创建事件对象。这个事件对象会存储事件发生时的相关信息,例如点击事件时光标的位置,键盘事件是按下的按键等。通过这个事件对象,可以对事件进行相关的处理。

document.getElementById("commit").onclick = function(e) {
    // 获取点击事件时光标的位置信息
    console.log(e.screenX);

    // 阻止事件的默认行为
    e.preventDefault();
};
document.getElementById("input").onkeydown = function (e) {
    if (e.key == 'Enter') { // 获取键盘事件按下的按键
        console.log("hello");
    }
};

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

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

相关文章

51单片机入门 第一篇:LED灯

文章目录前言一、LED原理图二、创建keil5工程三、代码的编写四、程序的烧录总结前言 本篇文章讲正式带大家开始学习51单片机&#xff0c;希望这些文章能够很好的帮助到大家学习51单片机。 一、LED原理图 一般的51单片机上都带有8个LED灯&#xff0c;这里8个LED灯分别接到了板…

JS逆向——工信部ICP、IP、域名信息备案管理平台

问题&#xff1a;&#xff08;1&#xff09;数据列表接口token参数验证&#xff08;2&#xff09;authKey参数加密生成 1、页面中请求接口&#xff0c;观察请求头可发现&#xff0c;校验参数token为加密的字符串&#xff0c;根据该字符串并不能直观得到所用的加密方式是什么。 …

数据库大小写不敏感后,值也不敏感了

现象&#xff1a;我有一个账号admin&#xff0c;结果莫名多了一个ADMIN、Admin、AdMin等一些列账号&#xff1b;细品你的密码就算密文签名&#xff0c;是不是在你不知情的情况下也有很多。 原因&#xff1a;数据库安装的时候设置的大小写不敏感导致 解决&#xff1a;建议第三…

Spark 的学习笔记

Spark 的学习笔记 文章目录Spark 的学习笔记1. 概述Spark 优势及特点优秀的数据模型和丰富计算抽象Spark 生态圈Spark 特点Spark 与 HadoopSpark与MRSpark Streaming与StormSpark SQL与HiveSpark 运行模式2. 快速入门使用 Spark Shell 进行交互式分析基础Dataset 上的更多操作缓…

【机器学习】LDA算法原理

问题 线性判别分析&#xff08;Linear Discriminant Analysis&#xff0c;LDA&#xff09;是机器学习中常用的降维方法之一&#xff0c;本文旨在介绍LDA算法的思想&#xff0c;其数学推导过程可能会稍作简化。 LDA的思想 ● LDA是一种线性的、有监督的降维方法&#xff0c;即…

销售流程标准化重要吗?

各行各业都存在销售&#xff0c;但并不是每个销售都可以成为优秀的销售&#xff0c;优秀的销售往往有一套完整的销售流程&#xff0c;为了保证销售新人销售工作的顺利进行&#xff0c;销售流程标准化很有必要。 前言 各行各业都存在销售&#xff0c;但并不是每个销售都可以成为…

前端面试题之计算机网络篇--WebSocket基本使用

WebSocket 普通的包的请求和响应过程 1. 对 WebSocket 的理解 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。它基于TCP传输协议&#xff0c;并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手&#xff0c;两者之间…

HDLBits练习汇总-13-时序逻辑设计测试--状态机(一)

简单摩尔状态机1&#xff08;Fsm1&#xff09; 是一个摩尔状态机&#xff0c;具有两种状态&#xff0c;一种输入&#xff0c;一种输出。实现此状态机。请注意&#xff0c;重置状态为 B。使用异步复位。 模块声明 module top_module(input clk,input areset, // Asynchrono…

基础数学复习(3)——曲线拟合

文章目录基础概念曲线拟合的流程极小化损失函数线性最小二乘超定方程组的最小二乘解&#xff08;必考&#xff09;例题&#xff08;必考&#xff09;使用法方程计算拟合方程使用最小二乘法求解总结基础概念 曲线拟合的流程 选取函数类选取参数的准则&#xff1a;极小化损失函…

实习-------数据库基础

检索数据 1、如果使用DISTINCT关键字&#xff0c;它必须直接放在列名的前面。不能部分使用DISTINCT&#xff0c;DISTINCT关键字应用于所有列而不仅是前置它的列 例如&#xff1a;SELECT DISTINCT vend_id告诉MySQL只返回不同&#xff08;唯一&#xff09;的vend_id行 2、带一…

(六)devops持续集成开发——jenkins的全局工具配置之node环境安装及配置

前言 本节内容主要是关于jenkins集成node组件&#xff0c;从而实现前端node项目的流水线CICD发布功能。我们需要先安装好前端组件node,并在jenkins中配置好node组件&#xff0c;这样就可以流水线发布一个前端工程了。 正文 安装node组件①上传node安装包 ②解压node安装包 t…

用纯python脚本玩转UU加速器

1. 前言 之前几期内容&#xff0c;我们出过纯py形式的Android自动化脚本。同学们一直让再出一下纯py形式的Windows脚本&#xff0c;今天我们以UU加速器为例&#xff0c;给大家出一个简单的学习demo。 2. UU加速器的自动化demo 今天的练习demo也非常简单&#xff0c;大致内容…

张勇用最严厉的内部信,敲打阿里云,也在提振阿里士气

“「客户第一」的价值观&#xff0c;从来都不是高高挂在公司墙上的标语&#xff0c;而是支撑我们每一天获得成长的基石”。这应该是阿里巴巴董事局主席兼CEO张勇&#xff0c;自2015年来最严厉的一封内部信。信件里&#xff0c;张勇一改往日温情形象&#xff0c;措辞严厉的批评了…

pybind11 | 绑定CGAL几何算法(numpy数据交换)

文章目录一 前言二 numpy数据交换2.1 pybind11对numpy的支持2.2 Numpy VF(py::array_t)与CGAL mesh(Surface Mesh)之间的转换三 绑定CGAL算法示例3.1 示例函数3.2 绑定部分代码3.3 示例完整代码四 编译生成和测试4.1 编译生成pyd文件4.2 Python调用测试五 总结参考和拓展一 前言…

day04 IDEA数组

第一部分 : IDEA开发工具 参见 &#xff1a;IEDA的安装请参考文件夹PPT中的 04_IDEA.ppt 1.数组 1.1 数组介绍 ​ 数组就是存储数据长度固定的容器&#xff0c;存储多个数据的数据类型要一致。 1.2 数组的定义格式 1.2.1 第一种格式 ​ 数据类型[] 数组名 ​ 示例&…

【Linux】进程创建|进程终止|进程等待|进程程序替换

索引1.进程创建fork函数初识&#x1f60a;我们先来看这样的一个程序:写时拷贝fork返回值的三个问题2.进程终止进程退出场景进程常见退出方法进程退出码&#xff1a;3.进程等待进程等待的方法wait方法waitpid方法获取子进程status进程的阻塞等待方式&#xff1a;进程的非阻塞等待…

vue实现导入表格数据【纯前端实现】

一、文章引导 #mermaid-svg-3VJi5rNvrLDOy2MT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3VJi5rNvrLDOy2MT .error-icon{fill:#552222;}#mermaid-svg-3VJi5rNvrLDOy2MT .error-text{fill:#552222;stroke:#55222…

WSL Ubuntu SSH

WSL中的IP wsl中的ubuntu的ip是动态分配的&#xff0c;每次开机都不一样&#xff0c;而且动态分配的ip和windows系统中的ip不在同一网段&#xff0c;但是我发现在windows中能ping通wsl中ubuntu的ip&#xff0c;这说明子系统与虚拟机不同&#xff0c;在查看ubuntu系统ip时&…

第010课 - docker安装mysql

第010课 - docker安装mysql docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ # 这个里面是容器内mysql相关的日志 -v /mydata/mysql/data:/var/lib/mysql \ # 这个里面是msyql数据相关的内容 -v /mydata/mysql/conf:/etc/mysql \ # 这个里面是容…

数据结构进阶 二叉树OJ题

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 二叉树OJ题题目一 根据二叉树创建字符串题目二 二叉树的层序遍历题目三 二叉树的最近公共祖先题目一 根据…