JavaScript学习笔记之DOM篇,带你全面了解什么是DOM
DOM在前面的JavaScript学习笔记(一)–JS基础里简单提到过,它是浏览器厂商提供的用来控制html / css 的代码的文档对象模型,是JavaScript的重要组成部分,现在带大家详细了解一下什么是DOM。
基本概念
DOM的全称是Document Object Model,即文档对象模型,是一套对文档的内容进行抽象和概念化的方法,它允许脚本控制Web页面、窗口和文档。
DOM不是JavaScript语言的一部分,而是内置在浏览器中的一个应用程序接口。 如果没有DOM,JavaScript将是另外一种脚本语言;而有了DOM,它将成为制作动态页面的强有力工具。当然,我们可以简单的理解为一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。
DOM是一组用来描述脚本怎样与结构化文档进行交互和访问的web标准。他的功能是把浏览器支持的文档(包括HTML、XML、XHTML)当作一个对象来解析。DOM实际上是一个操作文档里面所包含内容的一个编程的API,允许开发人员从文档中读取、搜索、修改、增加和删除数据。DOM与平台和语言无关,只要是支持DOM的平台和编程语言,都可以用来编写文档。
DOM定义了一系列对象、方法和属性,用于访问、操作和创建文档中的内容、结构、样式以及行为。每一个网页元素(一个HTML标签)都对应着一个对象。我们可以把DOM认为是页面上数据和结构的一个树形表示,树根是window或document对象,相当于最外层的标签的外围,也就是整个文档。
节点(node)
节点这个词是一个网络用语,代表了网络中的一个连接点,一个网络就是由一些节点构成的集合。在现实世界中,一切事物都由原子构成,原子就是现实世界的节点。原子还可以进一步分解为更细小的亚原子微粒,这些亚原子微粒同样也是节点。
在DOM中,文档是由节点构成的集合,HTML文档中所有内容都被视为节点,DOM被视为节点树的HTML。通过以下代码来认识一下节点的类型。
<!--头部-->
<div title="a gentle reminder">hello world</div>
文档节点(document):当前html文档。
注释节点(comment):< !–头部–>
元素节点(Element):< div>< /div>
属性节点(attribute):title=“a gentle reminder”
文本节点(text):hello world
节点信息相关属性 | 层次结构相关属性 | 方法 |
---|---|---|
nodeType | childNodes | appendChild(child) |
nodeName | firstChild | insertBefore(new,ref) |
nodeValue | lastChild | removeChild(child) |
nextSibling | replaceChild(new,old) | |
parentNode |
cloneNode([boolean]) 参数为true时,表示除了克隆当前对象,还克隆子元素 |
|
parentElement | ||
ownerDocument |
需要注意的是,nodeType 属性返回节点的类型,用数字来表示。如果是元素节点,返回 1;如果是属性节点, 返回 2;如果是文本节点,返回 3;如果是注释节点,返回 8。该属性是只读的。
基本的DOM方法
document.getElementById(): 返回对拥有指定 ID 的第一个对象的引用。
document.getElementsByName() : 返回带有指定名称的对象的集合。
document.getElementsByTagName() : 返回带有指定标签名的对象的集合。
document.getElementsByClassName(): 返回带有指定类名的对象的集合。
document.querySelector() : 返回匹配指定 CSS 选择器的一个对象的引用。
document.querySelectorAll() : 返回匹配指定 CSS 选择器的的对象的集合。
document.body: 提供对 < body> 元素的直接访问。
document.forms: 返回对文档中所有 Form 对象引用。
表单名.控件名.value: 获取表单控件的值。
document.title: 返回当前文档的标题。
createElement(): 创建一个节点。
innerText: 向当前元素内部添加文本节点。
innerHTML: 向当前元素内部添加HTML代码片段。
style: 获取或者设置样式。
getAttribute(key): 返回指定属性名的属性值。
getAttributeNames(): 返回指定对象的属性名。
setAttribute(key,val): 添加指定的属性,并为其赋指定的值。如果这个指定的属性已存在,则仅设置/更改值。
<!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><button>导入</button><button>批量删除</button><a href="" id="btn_export">导出</a><div id="content"></div><script>var btns = document.querySelectorAll("button");var $content = document.querySelector("#content");// 点击添加后,向content中添加一个h2元素btns[0].onclick = function(){var $h2 = document.createElement("h2");$h2.innerText = "这是一个新标题";$content.appendChild($h2)}// 移除$content中所有的孩子节点btns[2].onclick = function(){Array.from(document.querySelectorAll("#content > *")).forEach((item)=>{$content.removeChild(item)})}document.querySelector("#btn_export").onclick = function(event){alert(1);console.log(event);//取消事件的默认动作event.preventDefault();}</script>
</body>
</html>
DOM事件机制
javascript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。
事件三要素
- 事件源:dom对象(元素节点)。
- 事件处理函数:匿名函数。(在未来的某个时刻执行,由浏览器来调用,浏览器在调用的时候会将事件对象传递给我们这个函数)。
- 事件对象:与特定事件相关且包含有关该事件详细信息的对象。
事件类型
- onclick:用户点击时执行。
- onload:用户进入时执行。
- onunload。用户离开时执行。
- onmouseover:鼠标移入时执行。
- onmouseout:鼠标移出时执行。
- onmousedown:鼠标摁下时执行。
- onmouseup:鼠标松开时执行。
事件流(事件冒泡)
- 元素具有嵌套关系。
<style>#outer,#center,#inner {border: 1px solid #ccc;box-sizing: border-box;border-radius: 50%;}#outer {width: 500px;margin: 0 auto;height: 500px;padding: 50px;}#center , #inner{height: 100%;padding: 50px;}
</style>
<div class="outer"><div class="center"><div class="inner"></div></div>
</div>
- 每层元素都绑定事件处理函数。
var $outer = document.querySelector("#outer")
var $center = document.querySelector("#center")
var $inner = document.querySelector("#inner")$outer.onclick = function(event){console.log('outer',event.target);
}
$center.onclick = function(event){console.log('center',event.target);event.stopPropagation();
}
$inner.onclick = function(event){console.log('inner',event.target);event.stopPropagation();
}
- 操作。
比如:当我们点击inner的时候,实际上也点击center、outer。
事件捕获: outer -> center -> inner
事件冒泡: inner -> center -> outer
需要注意的是,事件处理函数的调用默认是按照事件冒泡的顺序来调用。
事件绑定
事件源 . on事件类型 = 事件处理函数(事件对象){ }
dom.onClick = function(event){addEventListener(); //事件绑定//attachEvent() removeEventListener(); //事件移除//detachEvent();
}
事件对象
在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件相关的信息,包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。兼容DOM的浏览器默认会将event对象传入到事件处理函数中。
dom.onclick=function(event){console.log(event);
}
dom.addEventListener("click",function(event){console.log(event);
},false);
对象属性 | 说明 |
---|---|
event.target | 事件的目标元素(操作的元素) |
event.clientX、event.clientY | 事件触发时候的坐标 |
event.preventDefault() | 取消事件的默认行为 |
event.stopPropagation() | 取消事件冒泡 |
事件代理
将事件绑定在父元素上而非子元素上。
添加业务: 点击添加按钮 -> 弹模态框 -> 输入数据 -> 保存 -> ajax -> 后台服务器 -> 关闭模态框 ->刷新页面 -> 通知保存成功。
Javascript dom与jQuery的对比
业务 | javascript dom | jQuery |
---|---|---|
选择元素 | querySelector() | 选择器 $("") |
dom操作 | 无法进行批量操作 | 可以实现批量操作 |
事件绑定 | 兼容性较差 | 兼容性,高效,批量 ,方法简洁 |
dom.onClick = function(event){} | $(’.btn_del’).click | |
dom层级关系 | 操作繁杂 | 操作简练 |
jQuery 实际上是对于dom api封装,让用户使用dom方法变得更加简洁,下一篇文章将对jQuery展开详细说明~
JavaScript学习笔记之DOM篇,带你全面了解什么是DOM相关推荐
- JavaScript学习笔记之入门篇
JavaScript学习笔记之入门篇 JavaScript引入 1. 页面级 js: 2. 外部js文件: JavaScript变量 1. 变量的作用: 2. 声明变量: 3. 变量赋值: 4. 单一 ...
- JavaScript学习笔记之BOM篇,认识几种常见的浏览器对象
BOM(Browser Object Document)即浏览器对象模型,顾名思义就是为了控制浏览器的行为而出现的接口.浏览器可以做什么呢?比如跳转到另一个页面.前进.后退等等,程序还可能需要获取屏幕 ...
- JavaScript学习笔记:创建、添加与删除节点
JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...
- 前端获取div里面的标签_web前端教程JavaScript学习笔记DOM
web前端教程JavaScript学习笔记 DOM一DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 ...
- JavaScript学习笔记05【高级——DOM对象】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- JavaScript学习笔记(四)(DOM)
JavaScript学习笔记(四) DOM 一.DOM概述 二.元素对象 2.1 获取方式 (1).通过ID获取一个元素对象,如果没有返回null (2).通过`标签名`获取一组元素对象,,如果没有返 ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- JavaScript学习笔记(一)-Learning Advanced JavaScript
JavaScript学习笔记 (一)- Learning Advanced JavaScript Learning Advanced JavaScript #2: Goal: To be able t ...
最新文章
- drf2 FBV和CBV
- 约三分之二的 DDoS 攻击指向通信服务提供商
- Linux 正则表达式基础
- java 直播_一对一直播源码开发过程中区分Java和PHP的重要性
- 对修饰器的实验支持功能在将来的版本中可能更改。在 “tsconfig“ 或 “jsconfig“ 中设置 “experimentalDecorators“ 选项以删除此警告。ts(1219)
- AVPlayerViewController支持横屏设置
- web页面官网右侧悬浮固定在线客服代码
- 用C语言实现:输入某年某月某日,判断这一天是这一年的第几天
- wordpress插件_顶级WordPress反垃圾邮件插件
- 【一句日历】2019年4月
- python是由荷兰人谁创造的_Python简介(1)诞生和本质
- (三)拜占庭将军问题
- 02-pandas数据分析库
- 世界观和方法论——青山行客
- MySQL~数据库表中数据的增删查改(基础篇)
- Docker(狂神)
- JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库
- 未能加载文件或程序集xxxx,系统找不到指定的文件
- Cisco IP 电话 将它的voice mail 发送到手机
- 电影院竟然暗藏这么多“玄机”!
热门文章
- python tclerror_Python Tk _tkinter.TclError:无效的命令名称“.42818376”
- YAML 学习笔记 .yml
- QT5+ROS程序开发
- 板式橡胶支座弹性模量怎样计算_Midas Civil支座模拟的详细解决方法
- 【Android】命令行jarsigner签字和解决找不到证书链错误
- MySQL 备份与恢复
- ASP.NET MVC 相关的社群与讨论区
- Flutter TextButton 详细使用配置、Flutter ButtonStyle样式概述实践
- Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信
- 五、Spring中的@Import注解