JavaScript DOM

这篇博客详细介绍了DOM(文档对象模型)的概念,包括DOM文档节点、元素节点、属性节点和文本节点的特性与操作。文章探讨了如何使用JavaScript访问和操作HTML元素,如查找、获取和改变HTML值,以及添加、删除和修改元素。此外,还涵盖了DOM事件,包括键盘、鼠标、表单和多媒体事件,以及事件对象的属性和方法。通过对DOM的理解,开发者能够更有效地动态地创建和操纵HTML页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、DOM概述

2、DOM文档节点

2.1、节点概述

2.2、节点属性

2.3、文档节点

2.3.1、Document 对象属性和方法

2.4、元素节点

2.4.1、属性和方法

2.5、属性节点

2.5.1、属性节点的属性/方法

2.6、文本节点

3、DOM文档操作

3.1、查找 HTML 元素

3.1.1、方法介绍

3.2、获取 HTML 的值

3.2.1、方法介绍

3.3、改变 HTML 的值

3.3.1、方法介绍

3.4、修改 HTML 元素

3.4.1、方法介绍

3.5、查找 HTML 父子

3.5.1、方法介绍

4、DOM文档事件

4.1、事件概述

4.2、框架/对象(Frame/Object)事件

4.3、表单事件

 4.4、剪贴板事件

4.5、打印事件

4.6、拖动事件

4.7、键盘事件

4.8、鼠标事件

4.9、多媒体(Media)事件

4.10、动画事件

4.11、过渡事件

4.12、其它事件

5、事件对象

5.1事件对象的常量、属性、方法

5.2、目标事件对象

5.3、事件监听对象

5.4、文档事件对象

5.5、鼠标/键盘事件对象

5.6、Console 对象

5.7、CSS 样式声明对象(CSSStyleDeclaration)

5.8、事件冒泡

5.9、事件委派

5.10、事件绑定

5.11、事件传播


1、DOM概述

当网页被加载时,浏览器会创建页面的文档对象模型Document Object Model)。

HTML DOM 模型被结构化为 对象树

image-20201019104459658

通过这个对象模型,JavaScript 获得创建动态 HTML 的所有力量:

  • JavaScript 能改变页面中的所有 HTML 元素
  • JavaScript 能改变页面中的所有 HTML 属性
  • JavaScript 能改变页面中的所有 CSS 样式
  • JavaScript 能删除已有的 HTML 元素和属性
  • JavaScript 能添加新的 HTML 元素和属性
  • JavaScript 能对页面中所有已有的 HTML 事件作出反应
  • JavaScript 能在页面中创建新的 HTML 事件

换言之:HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准

2、DOM文档节点

2.1、节点概述

节点Node,是构成我们网页的最基本的组成部分,网页中的每一个部分都可以称为是一个节点。

比如:html标签、属性、文本、注释、整个文档等都是一个节点。

虽然都是节点,但是实际上它们的具体类型是不同的。

节点的类型不同,属性和方法也都不尽相同。

节点:Node——构成HTML文档最基本的单元。

常用节点分为四类:

  • 文档节点:整个HTML文档
  • 元素节点:标签
  • 属性节点:标签中的属性
  • 文本节点:HTML标签中的文本内容

image-20201019115515595

2.2、节点属性

nodeNamenodeTypenodeValue
文档节点#document9null
元素节点标签名1null
属性节点属性名2属性值
文本节点#text3文本内容

2.3、文档节点

文档节点(Document)代表的是整个HTML文档,网页中的所有节点都是它的子节点。

document对象作为window对象的属性存在的,我们不用获取可以直接使用。

通过该对象我们可以在整个文档访问内查找节点对象,并可以通过该对象创建各种节点对象。

2.3.1、Document 对象属性和方法

HTML文档中可以使用以下属性和方法:

属性 / 方法描述
document.activeElement返回当前获取焦点元素
document.addEventListener()向文档添加句柄
document.adoptNode(node)从另外一个文档返回 adapded 节点到当前文档。
document.anchors返回对文档中所有 Anchor 对象的引用。
document.applets

返回对文档中所有 Applet 对象的引用。

注意: HTML5 已不支持 <applet> 元素。

document.baseURI返回文档的绝对基础 URI
document.body返回文档的body元素
document.close()关闭用 document.open() 方法打开的输出流,并显示选定的数据。
document.cookie设置或返回与当前文档有关的所有 cookie。
document.createAttribute()创建一个属性节点
document.createComment()createComment() 方法可创建注释节点。
document.createDocumentFragment()创建空的 DocumentFragment 对象,并返回此对象。
document.createElement()创建元素节点。
document.createTextNode()创建文本节点。
document.doctype返回与文档相关的文档类型声明 (DTD)。
document.documentElement返回文档的根节点
document.documentMode返回用于通过浏览器渲染文档的模式
document.documentURI设置或返回文档的位置
document.domain返回当前文档的域名。
document.domConfig已废弃。返回 normalizeDocument() 被调用时所使用的配置。
document.embeds返回文档中所有嵌入的内容(embed)集合
document.forms返回对文档中所有 Form 对象引用。
document.getElementsByClassName()返回文档中所有指定类名的元素集合,作为 NodeList 对象。
document.getElementById()返回对拥有指定 id 的第一个对象的引用。
document.getElementsByName()返回带有指定名称的对象集合。
document.getElementsByTagName()返回带有指定标签名的对象集合。
document.images返回对文档中所有 Image 对象引用。
document.implementation返回处理该文档的 DOMImplementation 对象。
document.importNode()把一个节点从另一个文档复制到该文档以便应用。
document.inputEncoding返回用于文档的编码方式(在解析时)。
document.lastModified返回文档被最后修改的日期和时间。
document.links返回对文档中所有 Area 和 Link 对象引用。
document.normalize()删除空文本节点,并连接相邻节点
document.normalizeDocument()删除空文本节点,并连接相邻节点的
document.open()打开一个流,以收集来自任何 document.write() 或 document.writeln() 方法的输出。
document.querySelector()返回文档中匹配指定的CSS选择器的第一元素
document.querySelectorAll()document.querySelectorAll() 是 HTML5中引入的新方法,返回文档中匹配的CSS选择器的所有元素节点列表
document.readyState返回文档状态 (载入中……)
document.referrer返回载入当前文档的文档的 URL。
document.removeEventListener()移除文档中的事件句柄(由 addEventListener() 方法添加)
document.renameNode()重命名元素或者属性节点。
document.scripts返回页面中所有脚本的集合。
document.strictErrorChecking设置或返回是否强制进行错误检查。
document.title返回当前文档的标题。
document.URL返回文档完整的URL
document.write()向文档写 HTML 表达式 或 JavaScript 代码。
document.writeln()等同于 write() 方法,不同的是在每个表达式之后写一个换行符。

2.4、元素节点

HTML中的各种标签都是元素节点(Element),这也是我们最常用的一个节点。

浏览器会将页面中所有的标签都转换为一个元素节点, 我们可以通过document的方法来获取元素节点。

例如:document.getElementById(),根据id属性值获取一个元素节点对象。

2.4.1、属性和方法

以上属性和方法可适用于所有 HTML 元素:

属性 / 方法描述
element.accessKey设置或返回accesskey一个元素
element.addEventListener()向指定元素添加事件句柄
element.appendChild()为元素添加一个新的子元素
element.attributes返回一个元素的属性数组
element.childNodes返回元素的一个子节点的数组
element.children返回元素的子元素的集合
element.classList返回元素的类名,作为 DOMTokenList 对象。
element.className设置或返回元素的class属性
element.clientTop表示一个元素的顶部边框的宽度,以像素表示。
element.clientLeft 表示一个元素的左边框的宽度,以像素表示。
element.clientHeight在页面上返回内容的可视高度(高度包含内边距(padding),不包含边框(border),外边距(margin)和滚动条)
element.clientWidth在页面上返回内容的可视宽度(宽度包含内边距(padding),不包含边框(border),外边距(margin)和滚动条)
element.cloneNode()克隆某个元素
element.compareDocumentPosition()比较两个元素的文档位置。
element.contentEditable设置或返回元素的内容是否可编辑
element.dir设置或返回一个元素中的文本方向
element.firstElementChild 返回元素的第一个子元素
element.firstChild返回元素的第一个子节点
element.focus()设置文档或元素获取焦点
element.getAttribute()返回指定元素的属性值
element.getAttributeNode()返回指定属性节点
element.getElementsByTagName()返回指定标签名的所有子元素集合。
element. getElementsByClassName()返回文档中所有指定类名的元素集合,作为 NodeList 对象。
element.getFeature()返回指定特征的执行APIs对象。
element.getUserData()返回一个元素中关联键值的对象。
element.hasAttribute()如果元素中存在指定的属性返回 true,否则返回false。
element.hasAttributes()如果元素有任何属性返回true,否则返回false。
element.hasChildNodes()返回一个元素是否具有任何子元素
element.hasFocus()返回布尔值,检测文档或元素是否获取焦点
element.id设置或者返回元素的 id。
element.innerHTML设置或者返回元素的内容。
element.insertBefore()现有的子元素之前插入一个新的子元素
element.isContentEditable如果元素内容可编辑返回 true,否则返回false
element.isDefaultNamespace()如果指定了namespaceURI 返回 true,否则返回 false。
element.isEqualNode()检查两个元素是否相等
element.isSameNode()检查两个元素所有有相同节点。
element.isSupported()如果在元素中支持指定特征返回 true。
element.lang设置或者返回一个元素的语言。
element.lastChild返回最后一个子节点
element.lastElementChild 返回指定元素的最后一个子元素
element.matches() 如果元素匹配指定的 CSS 选择器,matches() 方法就返回 true,否则返回 false。
element.namespaceURI返回命名空间的 URI。
element.nextSibling返回该元素紧跟的一个节点
element.nextElementSibling返回指定元素之后的下一个兄弟元素(相同节点树层中的下一个元素节点)。
element.nodeName返回元素的标记名(大写)
element.nodeType返回元素的节点类型
element.nodeValue返回元素的节点值
element.normalize()使得此成为一个"normal"的形式,其中只有结构(如元素,注释,处理指令,CDATA节和实体引用)隔开Text节点,即元素(包括属性)下面的所有文本节点,既没有相邻的文本节点也没有空的文本节点
element.offsetHeight返回任何一个元素的高度包括边框(border)和内边距(padding),但不包含外边距(margin)
element.offsetWidth返回元素的宽度,包括边框(border)和内边距(padding),但不包含外边距(margin)
element.offsetLeft返回当前元素的相对水平偏移位置的偏移容器
element.offsetParent返回元素的偏移容器
element.offsetTop返回当前元素的相对垂直偏移位置的偏移容器
element.ownerDocument返回元素的根元素(文档对象)
element.parentNode返回元素的父节点
element.previousSibling返回某个元素紧接之前元素
element.previousElementSibling 返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)。
element.querySelector()返回匹配指定 CSS 选择器元素的第一个子元素
document.querySelectorAll()返回匹配指定 CSS 选择器元素的所有子元素节点列表
element.removeAttribute()从元素中删除指定的属性
element.removeAttributeNode()删除指定属性节点并返回移除后的节点。
element.removeChild()删除一个子元素
element.removeEventListener()移除由 addEventListener() 方法添加的事件句柄
element.replaceChild()替换一个子元素
element.scrollHeight返回整个元素的高度(包括带滚动条的隐蔽的地方)
element.scrollLeft返回当前视图中的实际元素的左边缘和左边缘之间的距离
element.scrollTop返回当前视图中的实际元素的顶部边缘和顶部边缘之间的距离
element.scrollWidth返回元素的整个宽度(包括带滚动条的隐蔽的地方)
element.setAttribute()设置或者改变指定属性并指定值。
element.setAttributeNode()设置或者改变指定属性节点。
element.setUserData()在元素中为指定键值关联对象。
element.style设置或返回元素的样式属性
element.tabIndex设置或返回元素的标签顺序。
element.tagName作为一个字符串返回某个元素的标记名(大写)
element.textContent设置或返回一个节点和它的文本内容
element.title设置或返回元素的title属性
element.toString()一个元素转换成字符串
nodelist.item()返回某个元素基于文档树的索引
nodelist.length返回节点列表的节点数目。

2.5、属性节点

属性节点(Attribute)表示的是标签中的一个一个的属 性,这里要注意的是属性节点并非是元素节点的子节点,而是元素节点的一部分。可以通过元素节点来获取指定的属性节点。

例如:元素节点.getAttributeNode("属性名"),根据元素节点的属性名获取一个属性节点对象。

2.5.1、属性节点的属性/方法

属性 / 方法描述
attr.isId如果属性是 ID 类型,则 isId 属性返回 true,否则返回 false。
attr.name返回属性名称
attr.value设置或者返回属性值
attr.specified如果属性被指定返回 true ,否则返回 false
nodemap.getNamedItem()从节点列表中返回的指定属性节点。
nodemap.item()返回节点列表中处于指定索引号的节点。
nodemap.length返回节点列表的节点数目。
nodemap.removeNamedItem()删除指定属性节点
nodemap.setNamedItem()设置指定属性节点(通过名称)

注意:我们一般不使用属性节点。

2.6、文本节点

文本节点(Text)表示的是HTML标签以外的文本内容,任意非HTML的文本都是文本节点,它包括可以字面解释的纯文本内容。文本节点一般是作为元素节点的子节点存在的。获取文本节点时,一般先要获取元素节点,在通过元素节点获取文本节点。

例如:元素节点.firstChild;,获取元素节点的第一个子节点,一般为文本节点。

3、DOM文档操作

文档对象代表您的网页,,如果您希望访问 HTML 页面中的任何元素,那么您总是从访问 document 对象开始。

下面是一些如何使用 document 对象来访问和操作 HTML 的实例。

3.1、查找 HTML 元素

3.1.1、方法介绍

方法描述
document.getElementById()通过元素 id 来查找元素。
document.getElementsByName()返回带有指定名称的对象集合。
document.getElementsByTagName()通过标签名来查找元素。
document.getElementsByClassName()通过类名来查找元素。
document.querySelector()通过CSS选择器选择一个元素。
document.querySelectorAll()通过CSS选择器选择多个元素。

3.2、获取 HTML 的值

3.2.1、方法介绍

方法描述
元素节点.innerText获取 HTML 元素的 inner Text。
element.innerHTML获取 HTML 元素的 inner HTML。
元素节点.属性获取 HTML 元素的属性值。
元素节点.getAttribute(attribute)获取 HTML 元素的属性值。
元素节点.style.样式获取 HTML 元素的行内样式值。

拓展知识1:

通过style属性设置和读取的都是内联样式,无法读取样式表中的样式或者说正在应用的样式,如果想要读取当前正在应用的样式属性我们可以使用元素.currentStyle.样式名来获取元素的当前显示的样式,它可以用来读取当前元素正在显示的样式,如果当前元素没有设置该样式,则获取它的默认值,但是currentStyle只有IE浏览器支持,其它的浏览器都不支持,在其它浏览器中可以使用getComputedStyle()这个方法来获取元素当前的样式,这个方法是window的方法,可以直接使用,但是需要两个参数:

  • 第一个参数:要获取样式的元素
  • 第二个参数:可以传递一个伪元素,一般都传null

该方法会返回一个对象,对象中封装了当前元素对应的样式,可以通过 对象.样式名 来读取样式,如果获取的样式没有设置,则会获取到真实的值,而不是默认值,比如:没有设置width,它不会获取到auto,而是一个长度,但是该方法不支持IE8及以下的浏览器。通过currentStyle和getComputedStyle()读取到的样式都是只读的,不能修改,如果要修改必须通过style属性,因此,我们可以写一个适配各个浏览器的读取元素样式的方法。

3.3、改变 HTML 的值

3.3.1、方法介绍

方法描述
元素节点.innerText = new text content改变元素的 inner Text。
元素节点.innerHTML = new html content改变元素的 inner HTML。
元素节点.属性 = new value改变 HTML 元素的属性值。
元素节点.setAttribute(attribute, value)改变 HTML 元素的属性值。
元素节点.style.样式 = new style改变 HTML 元素的行内样式值。

拓展知识1:

修改节点的内容除了常用的innerHTML和innerText之外,还有insertAdjacentHTML和insertAdjacentText方法,可以在指定的地方插入内容。insertAdjacentText方法与insertAdjacentHTML方法类似,只不过是插入纯文本,参数相同。

语法说明:

object.insertAdjacentHTML(where,html);
object.insertAdjacentText(where,text)

参数说明:

  • where:

    • beforeBegin:插入到开始标签的前面
    • beforeEnd:插入到结束标签的前面
    • afterBegin:插入到开始标签的后面
    • afterEnd:插入到结束标签的后面

    img

  • html:一段html代码

  • text:一段文本值

注意事项:

  1. 这两个方法必须等文档加载好后才能执行,否则会出错。
  2. insertAdjacentText只能插入普通文本,insertAdjacentHTML插入html代码。
  3. 使用insertAdjacentHTML方法插入script脚本文件时,必须在script元素上定义defer属性。
  4. 使用insertAdjacentHTML方法插入html代码后,页面上的元素集合将发生变化。
  5. insertAdjacentHTML方法不适用于单个的空的元素标签(如img,input等)。

3.4、修改 HTML 元素

3.4.1、方法介绍

方法描述
document.createElement()创建 HTML 元素节点。
document.createAttribute()创建 HTML 属性节点。
document.createTextNode()创建 HTML 文本节点。
element.removeChild()删除 HTML 元素。
element.appendChild()添加 HTML 元素。
element.replaceChild()替换 HTML 元素。
element.insertBefore()在指定的子节点前面插入新的子节点。

3.5、查找 HTML 父子

3.5.1、方法介绍

方法描述
元素节点.parentNode返回元素的父节点。
元素节点.parentElement返回元素的父元素。
element.childNodes返回元素的一个子节点的数组(包含空白文本Text节点)。
element.children返回元素的一个子元素的集合(不包含空白文本Text节点)。
element.firstChild返回元素的第一个子节点(包含空白文本Text节点)。
element.firstElementChild 返回元素的第一个子元素(不包含空白文本Text节点)。
element.firstChildelement.lastChildelement.firstChild返回元素的最后一个子节点(包含空白文本Text节点)。
element.lastElementChild 返回元素的最后一个子元素(不包含空白文本Text节点)。
element.previousSibling返回某个元素紧接之前节点(包含空白文本Text节点)。
element.previousElementSibling 返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)。
element.nextSibling返回某个元素紧接之后节点(包含空白文本Text节点)。
element.nextElementSibling返回指定元素的后一个兄弟元素(相同节点树层中的下一个元素节点)。

4、DOM文档事件

4.1、事件概述

HTML事件可以触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript。

4.2、框架/对象(Frame/Object)事件

属性描述DOM
onabort图像的加载被中断。 ( <object>)2
onbeforeunload该事件在即将离开页面(刷新或关闭)时触发2
onerror在加载文档或图像时发生错误。 ( <object>, <body>和 <frameset>)
onhashchange该事件在当前 URL 的锚部分发生修改时触发。
onload一张页面或一幅图像完成加载。2
onpageshow该事件在用户访问页面时触发
onpagehide该事件在用户离开当前网页跳转到另外一个页面时触发
onresize窗口或框架被重新调整大小。2
onscroll当文档被滚动时发生的事件。2
onunload用户退出页面。 ( <body> 和 <frameset>)2

4.3、表单事件

表单事件在HTML表单中触发 (适用于所有 HTML 元素,但该HTML元素需在form表单内):

属性描述
onblur元素失去焦点时触发
onchange该事件在表单元素的内容改变时触发( <input>, <keygen>, <select>, 和 <textarea>)
onfocus元素获取焦点时触发
onfocusin元素即将获取焦点时触发
onfocusout元素即将失去焦点时触发
oninput元素获取用户输入时触发
onreset表单重置时触发
onsearch用户向搜索域输入文本时触发 ( <input="search">)
onselect用户选取文本时触发 ( <input> 和 <textarea>)
onsubmit表单提交时触发

 4.4、剪贴板事件

属性描述DOM
oncopy该事件在用户拷贝元素内容时触发
oncut该事件在用户剪切元素内容时触发
onpaste该事件在用户粘贴元素内容时触发

4.5、打印事件

属性描述DOM
onafterprint该事件在页面已经开始打印,或者打印窗口已经关闭时触发
onbeforeprint该事件在页面即将开始打印时触发

4.6、拖动事件

事件描述DOM
ondrag该事件在元素正在拖动时触发
ondragend该事件在用户完成元素的拖动时触发
ondragenter该事件在拖动的元素进入放置目标时触发
ondragleave该事件在拖动元素离开放置目标时触发
ondragover该事件在拖动元素在放置目标上时触发
ondragstart该事件在用户开始拖动元素时触发
ondrop该事件在拖动元素放置在目标区域时触发

4.7、键盘事件

通过键盘触发事件,类似用户的行为:

属性描述
onkeydown某个键盘按键被按下。
onkeypress某个键盘按键被按下并松开。
onkeyup某个键盘按键被松开。

拓展知识:

当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实参传递进响应函数。

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标的状态。

在IE8中,响应函数被触发时,浏览器不会传递事件对象,在IE8及以下的浏览器中,是将事件对象作为window对象的属性保存的。

解决事件对象的兼容性问题:event = event || window.event;

键鼠属性:

属性描述
ctrlKey返回当事件被触发时,“CTRL” 键是否被按下。
altKey返回当事件被触发时,“ALT” 是否被按下。
shiftKey返回当事件被触发时,“SHIFT” 键是否被按下。
clientX返回当事件被触发时,鼠标指针的水平坐标。
clientY返回当事件被触发时,鼠标指针的垂直坐标。
screenX返回当某个事件被触发时,鼠标指针的水平坐标。
screenY返回当某个事件被触发时,鼠标指针的垂直坐标。

4.8、鼠标事件

通过鼠标触发事件,类似用户的行为:

属性描述
onclick当单击鼠标时运行脚本。
ondblclick当双击鼠标时运行脚本。
onmousedown当按下鼠标按钮时运行脚本。
onmouseup当松开鼠标按钮时运行脚本。
onmousemove当鼠标指针移动时运行脚本。
onmouseover当鼠标指针移至元素之上时运行脚本,不可以阻止冒泡。
onmouseout当鼠标指针移出元素时运行脚本,不可以阻止冒泡。
onmouseenter当鼠标指针移至元素之上时运行脚本,可以阻止冒泡。
onmouseleave当鼠标指针移出元素时运行脚本,可以阻止冒泡。

4.9、多媒体(Media)事件

通过视频(videos),图像(images)或音频(audio) 触发该事件。

事件描述
onabort事件在视频/音频(audio/video)终止加载时触发。
oncanplay事件在用户可以开始播放视频/音频(audio/video)时触发。
oncanplaythrough事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。
ondurationchange事件在视频/音频(audio/video)的时长发生变化时触发。
onemptied当期播放列表为空时触发
onended事件在视频/音频(audio/video)播放结束时触发。
onerror事件在视频/音频(audio/video)数据加载期间发生错误时触发。
onloadeddata事件在浏览器加载视频/音频(audio/video)当前帧时触发触发。
onloadedmetadata事件在指定视频/音频(audio/video)的元数据加载后触发。
onloadstart事件在浏览器开始寻找指定视频/音频(audio/video)触发。
onpause事件在视频/音频(audio/video)暂停时触发。
onplay事件在视频/音频(audio/video)开始播放时触发。
onplaying事件在视频/音频(audio/video)暂停或者在缓冲后准备重新开始播放时触发。
onprogress事件在浏览器下载指定的视频/音频(audio/video)时触发。
onratechange事件在视频/音频(audio/video)的播放速度发送改变时触发。
onseeked事件在用户重新定位视频/音频(audio/video)的播放位置后触发。
onseeking事件在用户开始重新定位视频/音频(audio/video)时触发。
onstalled事件在浏览器获取媒体数据,但媒体数据不可用时触发。
onsuspend事件在浏览器读取媒体数据中止时触发。
ontimeupdate事件在当前的播放位置发送改变时触发。
onvolumechange事件在音量发生改变时触发。
onwaiting事件在视频由于要播放下一帧而需要缓冲时触发。

4.10、动画事件

事件描述
animationend该事件在 CSS 动画结束播放时触发
animationiteration该事件在 CSS 动画重复播放时触发
animationstart该事件在 CSS 动画开始播放时触发

4.11、过渡事件

事件描述
transitionend该事件在 CSS 完成过渡后触发。

4.12、其它事件

事件描述
onmessage该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发
onmousewheel已废弃。 使用 onwheel 事件替代
ononline该事件在浏览器开始在线工作时触发。
onoffline该事件在浏览器开始离线工作时触发。
onpopstate该事件在窗口的浏览历史(history 对象)发生改变时触发。
onshow该事件当 <menu> 元素在上下文菜单显示时触发
onstorage该事件在 Web Storage(HTML 5 Web 存储)更新时触发
ontoggle该事件在用户打开或关闭 <details> 元素时触发
onwheel该事件在鼠标滚轮在元素上下滚动时触发

5、事件对象

在触发DOM上的某个事件的时候,会产生一个事件对象event,而在这个对象当中会包含着所有与事件有关的信息。
事件对象其中有两个信息,我们最为常用,分别是type和target:
type表示的是被触发事件的类型;
target表示的是事件的目标。

5.1事件对象的常量、属性、方法

常量

静态变量描述DOM
CAPTURING-PHASE当前事件阶段为捕获阶段(1)1
AT-TARGET当前事件是目标阶段,在评估目标事件(1)2
BUBBLING-PHASE当前的事件为冒泡阶段 (3)3

属性

属性描述DOM
bubbles返回布尔值,指示事件是否是起泡事件类型。2
cancelable返回布尔值,指示事件是否可拥可取消的默认动作。2
currentTarget返回其事件监听器触发该事件的元素。2
eventPhase返回事件传播的当前阶段。2
target返回触发此事件的元素(事件的目标节点)。2
timeStamp返回事件生成的日期和时间。2
type返回当前 Event 对象表示的事件的名称。2

方法

方法描述DOM
initEvent()初始化新创建的 Event 对象的属性。2
preventDefault()通知浏览器不要执行与事件关联的默认动作。2
stopPropagation()不再派发事件。2

5.2、目标事件对象

方法

方法描述DOM
addEventListener()允许在目标事件中注册监听事件(IE8 = attachEvent())2
dispatchEvent()允许发送事件到监听器上 (IE8 = fireEvent())2
removeEventListener()运行一次注册在事件目标上的监听事件(IE8 = detachEvent())2

5.3、事件监听对象

方法

方法描述DOM
handleEvent()把任意对象注册为事件处理程序2

5.4、文档事件对象

方法

方法描述DOM
createEvent()2

5.5、鼠标/键盘事件对象

属性

属性描述DOM
altKey返回当事件被触发时,"ALT" 是否被按下。2
button返回当事件被触发时,哪个鼠标按钮被点击。2
clientX返回当事件被触发时,鼠标指针的水平坐标。2
clientY返回当事件被触发时,鼠标指针的垂直坐标。2
ctrlKey返回当事件被触发时,"CTRL" 键是否被按下。2
Location返回按键在设备上的位置3
charCode返回onkeypress事件触发键值的字母代码。2
key在按下按键时返回按键的标识符。3
keyCode返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。2
which返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。2
metaKey返回当事件被触发时,"meta" 键是否被按下。2
relatedTarget返回与事件的目标节点相关的节点。2
screenX返回当某个事件被触发时,鼠标指针的水平坐标。2
screenY返回当某个事件被触发时,鼠标指针的垂直坐标。2
shiftKey返回当事件被触发时,"SHIFT" 键是否被按下。2

方法

方法描述W3C
initMouseEvent()初始化鼠标事件对象的值2
initKeyboardEvent()初始化键盘事件对象的值3

5.6、Console 对象

Console 对象提供了访问浏览器调试模式的信息到控制台。

方法描述
assert()如果断言为 false,则在信息到控制台输出错误信息。
clear()清除控制台上的信息。
count()记录 count() 调用次数,一般用于计数。
error()输出错误信息到控制台
group()在控制台创建一个信息分组。 一个完整的信息分组以 console.group() 开始,console.groupEnd() 结束
groupCollapsed()在控制台创建一个信息分组。 类似 console.group() ,但它默认是折叠的。
groupEnd()设置当前信息分组结束
info()控制台输出一条信息
log()控制台输出一条信息
table()以表格形式显示数据
time()计时器,开始计时间,与 timeEnd() 联合使用,用于算出一个操作所花费的准确时间。
timeEnd()计时结束
trace()显示当前执行的代码在堆栈中的调用路径。
warn()输出警告信息,信息最前面加一个黄色三角,表示警告

5.7、CSS 样式声明对象(CSSStyleDeclaration)

CSSStyleDeclaration 对象表示一个 CSS 属性-值(property-value)对的集合。

CSSStyleDeclaration 对象属性

属性描述
cssText设置或返回样式声明文本,cssText 对应的是 HTML 元素的 style 属性。
length返回样式中包含多少条声明。
parentRule返回包含当前规则的规则。

CSSStyleDeclaration 对象方法

方法描述
getPropertyPriority()返回指定的 CSS 属性是否设置了 "important!" 属性。
getPropertyValue()返回指定的 CSS 属性值。
item()通过索引方式返回 CSS 声明中的 CSS 属性名。
removeProperty()移除 CSS 声明中的 CSS 属性。
setProperty()在 CSS 声明块中新建或者修改 CSS 属性。

5.8、事件冒泡

事件的冒泡(Bubble):所谓的冒泡指的就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发,在开发中大部分情况冒泡都是有用的,如果不希望发生事件冒泡可以通过事件对象来取消冒泡。

 案例演示1:创建两个div,叠放在一起,分别绑定单击事件,点击最里边的div,会触发两个div的单击事件

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background: pink;
        }

        #div2 {
            width: 100px;
            height: 100px;
            background: coral;
        }
    </style>
</head>
<body>
<div id="div1">
    我是DIV1
    <div id="div2">
        我是DIV2
    </div>
</div>

<!-- 在这里写JavaScript代码,因为JavaScript是由上到下执行的 -->
<script>
    var div1 = document.getElementById("div1");
    var div2 = document.getElementById("div2");

    // 为div1绑定单击事件
    div1.onclick = function () {
        console.log("div1 的单击事件触发了!");
    };

    // 为div2绑定单击事件
    div2.onclick = function () {
        console.log("div2 的单击事件触发了!");
    };
</script>
</body>
</html>

 

案例演示2:创建两个div,叠放在一起,分别绑定单击事件,点击最里边的div,不会触发两个div的单击事件,只会触发自己的单击事件,这时候我们可以取消事件冒泡

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background: pink;
        }

        #div2 {
            width: 100px;
            height: 100px;
            background: coral;
        }
    </style>
</head>
<body>
<div id="div1">
    我是DIV1
    <div id="div2">
        我是DIV2
    </div>
</div>

<!-- 在这里写JavaScript代码,因为JavaScript是由上到下执行的 -->
<script>
    var div1 = document.getElementById("div1");
    var div2 = document.getElementById("div2");

    // 为div1绑定单击事件
    div1.onclick = function () {
        console.log("div1 的单击事件触发了!");
        stopBubble();
    };

    // 为div2绑定单击事件
    div2.onclick = function () {
        console.log("div2 的单击事件触发了!");
        stopBubble();
    };

    // 取消事件冒泡
    function stopBubble(event) {
        // 如果提供了事件对象,则这是一个非IE浏览器
        if (event && event.stopPropagation) {
            // 因此它支持W3C的stopPropagation()方法
            event.stopPropagation();
        } else {
            // 否则,我们需要使用IE的方式来取消事件冒泡
            window.event.cancelBubble = true;
        }
    }
</script>
</body>
</html>

案例演示3:当点击a标签的时候,阻止a标签的默认跳转事件,采用事件阻止

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background: pink;
        }

        #div2 {
            width: 100px;
            height: 100px;
            background: coral;
        }
    </style>
</head>
<body>
<a href="https://www.baidu.com" id="a">打开百度,你就知道!</a>

<!-- 在这里写JavaScript代码,因为JavaScript是由上到下执行的 -->
<script>
    var a = document.getElementById("a");

    // 为a绑定单击事件
    a.onclick = function () {
        stopDefault();
    };

    // 阻止浏览器的默认行为
    function stopDefault(event) {
        if (event && event.preventDefault) {
            // 阻止默认浏览器动作(W3C)
            event.preventDefault();
        } else {
            // IE中阻止函数器默认动作的方式
            window.event.returnValue = false;
        }
        return false;
    }
</script>
</body>
</html>

image-20201021140928214

5.9、事件委派

我们希望只绑定一次事件即可应用到多个的元素上,即使元素是后添加的,我们可以尝试将其绑定给元素的共同的祖先元素,也就是事件的委派。事件的委派,是指将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件。事件委派是利用了事件冒泡,通过委派可以减少事件绑定的次数,提高程序的性能。

案例演示:为ul列表中的所有a标签都绑定单击事件

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<ul id="u1">
    <li><a href="javascript:;" class="link">超链接一</a></li>
    <li><a href="javascript:;" class="link">超链接二</a></li>
    <li><a href="javascript:;" class="link">超链接三</a></li>
</ul>

<!-- 在这里写JavaScript代码,因为JavaScript是由上到下执行的 -->
<script>
    var u1 = document.getElementById("u1");

    // 为ul绑定一个单击响应函数
    u1.onclick = function (event) {
        event = event || window.event;
        // 如果触发事件的对象是我们期望的元素,则执行,否则不执行
        if (event.target.className == "link") {
            console.log("我是ul的单击响应函数");
        }
    };
</script>
</body>
</html>

image-20201021134924509

5.10、事件绑定

我们以前绑定事件代码只能一个事件绑定一个函数,那我们要是想一个事件对应多个函数,并且不存在兼容性的问题该如何解决呢?

接下来,我会直接提供两个已经编写好的事件绑定和事件解绑的兼容性代码,如下:

/*为元素绑定事件兼容性代码*/
function addEventListener(element, type, fn) {
	if(element.addEventListener) {
		element.addEventListener(type, fn, false);
	} else if(element.attachEvent) {
		element.attachEvent("on" + type, fn);
	} else {
		element["on" + type] = fn;
	}
}

/*为元素解绑事件兼容性代码*/
function removeEventListener(element, type, fnName) {
	if(element.removeEventListener) {
		element.removeEventListener(type, fnName, false);
	} else if(element.detachEvent) {
		element.detachEvent("on" + type, fnName);
	} else {
		element["on" + type] = null;
	}
}

案例演示:为按钮1的单击事件绑定两个函数,然后点击按钮2取消按钮1的单击事件绑定函数f1

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>

<!-- 在这里写JavaScript代码,因为JavaScript是由上到下执行的 -->
<script>
    function f1() {
        console.log("output1 ...");
    };

    function f2() {
        console.log("output2 ...");
    };

    // 为按钮1的单击事件绑定两个函数
    addEventListener(document.getElementById("btn1"), "click", f1);
    addEventListener(document.getElementById("btn1"), "click", f2);

    // 点击按钮2取消按钮1的单机事件绑定函数f1
    document.getElementById("btn2").onclick = function () {
        removeEventListener(document.getElementById("btn1"), "click", f1);
    };

    /*为元素绑定事件兼容性代码*/
    function addEventListener(element, type, fn) {
        if (element.addEventListener) {
            element.addEventListener(type, fn, false);
        } else if (element.attachEvent) {
            element.attachEvent("on" + type, fn);
        } else {
            element["on" + type] = fn;
        }
    }

    /*为元素解绑事件兼容性代码*/
    function removeEventListener(element, type, fnName) {
        if (element.removeEventListener) {
            element.removeEventListener(type, fnName, false);
        } else if (element.detachEvent) {
            element.detachEvent("on" + type, fnName);
        } else {
            element["on" + type] = null;
        }
    }
</script>
</body>
</html>

谷歌浏览器:

image-20201021143905794

火狐浏览器:

image-20201021143929547

IE8-IE11浏览器:

image-20201021144005993

5.11、事件传播

事件的传播:关于事件的传播网景公司和微软公司有不同的理解

  • 微软公司认为事件应该是由内向外传播,也就是当事件触发时,应该先触发当前元素上的事件,然后再向当前元素的祖先元素上传播,也就说事件应该在冒泡阶段执行。
  • 网景公司认为事件应该是由外向内传播的,也就是当前事件触发时,应该先触发当前元素的最外层的祖先元素的事件,然后在向内传播给后代元素。

W3C综合了两个公司的方案,将事件传播分成了三个阶段:

  1. 捕获阶段:在捕获阶段时从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件
  2. 目标阶段:事件捕获到目标元素,捕获结束开始在目标元素上触发事件
  3. 冒泡阶段:事件从目标元素向它的祖先元素传递,依次触发祖先元素上的事件

image-20201021145200137

注意:如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true,一般情况下我们不会希望在捕获阶段触发事件,所以这个参数一般都是false,并且注意,IE8及以下的浏览器中没有捕获阶段,我们可以使用event.stopPropagation();取消事件传播。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平平无奇的CV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值