摘要:定义是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器。重点分割线只有通过上面的继承关系,我们得到的元素才是一个完整的对象,我们才能为它设置获取属性绑定事件添加样式类等操作。
写在前面,本文将同步发布于Blog、掘金、segmentfault、知乎等处,如果本文对你有帮助,记得为我得到我的个人技术博客项目给个star哦。
为何写这篇文章?你可能做Web开发已经有一段时间,你是否有想过下列问题呢?
为什么div元素甚至是所有的html元素都可以使用addEventListener来添加事件呢?
为什么每个DOM节点都有parentNode、firstChild、nodeType等属性呢?
为什么每个DOM元素都有className、classList、innerHTML等属性呢?
为什么有些DOM元素有accessKey、contentEditable、isContentEditable等属性呢?
为什么每个DOM元素都有onclick、ondblclick、ondrag等属性?
本文就是来解答这些简单而又不“简单”的问题。
EventTarget 是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器。
作用Element,document 和 window 是最常见的事件目标,但是其他对象也可以是事件目标,比如XMLHttpRequest,AudioNode,AudioContext 等等。
许多事件目标(包括元素,文档和 window)还支持通过 onXXX(如onclick) 属性和属性设置事件处理程序。
在EventTarget上注册特定事件类型的事件处理程序。
EventTarget.removeEventListener()EventTarget中删除事件侦听器。
EventTarget.dispatchEvent()将事件分派到此EventTarget。
我们自己实现EventTargetvar EventTarget = function() { this.listeners = {}; }; EventTarget.prototype.listeners = null; EventTarget.prototype.addEventListener = function(type, callback) { if (!(type in this.listeners)) { this.listeners[type] = []; } this.listeners[type].push(callback); }; EventTarget.prototype.removeEventListener = function(type, callback) { if (!(type in this.listeners)) { return; } var stack = this.listeners[type]; for (var i = 0, l = stack.length; i < l; i++) { if (stack[i] === callback){ stack.splice(i, 1); return; } } }; EventTarget.prototype.dispatchEvent = function(event) { if (!(event.type in this.listeners)) { return true; } var stack = this.listeners[event.type].slice(); for (var i = 0, l = stack.length; i < l; i++) { stack[i].call(this, event); } return !event.defaultPrevented; };Node 定义
Node是一个接口,许多DOM类型从这个接口继承,并允许类似地处理(或测试)这些各种类型。Node是一个接口,许多DOM类型从这个接口继承,并允许类似地处理(或测试)这些各种类型。
有那些接口重Node继承其方法和属性?Document, Element, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entity, EntityReference
PS:在方法和属性不相关的特定情况下,这些接口可能返回null。它们可能会抛出异常 - 例如,当将子节点添加到不允许子节点存在的节点时。
返回一个表示base URL的DOMString。不同语言中的base URL的概念都不一样。 在HTML中,base URL表示协议和域名,以及一直到最后一个"/"之前的文件目录。
Node.childNodes返回一个包含了该节点所有子节点的实时的NodeList。NodeList 是“实时的”意思是,如果该节点的子节点发生了变化,NodeList对象就会自动更新。
Node.firstChild返回该节点的第一个子节点,如果该节点没有子节点则返回null。
Node.lastChild返回该节点的最后一个子节点,如果该节点没有子节点则返回null。
此处省略若干Node接口属性,更多属性查看这里。
--------------------重点分割线-------------------
重点:从其父类EventTarget继承了addEventListener、removeEventListener、dispatchEvent等方法。
将一个节点添加到指定父节点的子节点列表末尾。
Node.contains()返回的是一个布尔值,来表示传入的节点是否为该节点的后代节点。
Node.cloneNode()返回调用该方法的节点的一个副本。
此处省略若干Node接口方法,更多方法查看这里。
Element是非常通用的基类,所有 Document对象下的对象都继承它。这个接口描述了所有相同种类的元素所普遍具有的方法和属性。 这些继承自Element并且增加了一些额外功能的接口描述了具体的行为。
PS:HTMLElement 接口是所有HTML元素的基础接口, 而 SVGElement 接口是所有SVG元素的基本接口。
在web以外的语言,像 XUL 可以通过 XULElement 的API,也能实现它。
所有属性继承至它的祖先接口 Node, 和它所扩展的接口 EventTarget, 并且从以下部分继承了属性ParentNode, ChildNode, NonDocumentTypeChildNode, 和Animatable.
Element.assignedSlot返回元素对应的 HTMLSlotElement 接口
Element.attributes返回一个与该元素相关的所有属性集合NamedNodeMap
Element.classList返回该元素包含的class属性是一个DOMTokenList.
Element.className它是一个 DOMString 表示这个元素的class.
此处省略若干Element接口属性,更多方法查看这里。
--------------------重点分割线-------------------
从它的父类(Node)和它父类的父类(EventTarget)继承方法,并实现parentNode、ChildNode、NonDocumentTypeChildNode、Animatable。
此处省略若干Element接口方法,更多方法查看这里。
方法用来获取匹配特定选择器且离当前元素最近的祖先元素(也可以是当前元素本身)。如果匹配不到,则返回 null。
Element.getAttribute()返回元素上一个指定的属性值。如果指定的属性不存在,则返回 null 或 "" (空字符串)。
Element.getElementsByClassName()参数中给出类的列表,返回一个动态的 HTMLCollection ,这里面包含了所有持有这些类的后代元素。
此处省略若干Element接口方法,更多方法查看这里。
HTMLElement 接口表示所有的 HTML 元素。一些HTML元素直接实现了HTMLElement接口,其它的间接实现HTMLElement接口。
属性--------------------重点分割线-------------------
继承自父接口Element和 GlobalEventHandlers的属性。
HTMLElement.accessKey DOMString 获取/设置元素访问的快捷键
HTMLElement.accessKeyLabel DOMString 返回一个包含元素访问的快捷键的字符串(只读)
HTMLElement.contentEditable DOMString 获取/设置元素的可编辑状态
HTMLElement.isContentEditable Boolean 表明元素的内容是否可编辑(只读)
此处省略若干HTMLElement接口属性,更多方法查看这里。
HTMLElement.onTouchStart
HTMLElement.onTouchEnd
HTMLElement.onTouchMove
HTMLElement.onTouchEnter
HTMLElement.onTouchLeave
HTMLElement.onTouchCancel
HTMLElement.blur() void 元素失去焦点
HTMLElement.click() void 触发元素的点击事件
HTMLElement.focus() void 元素获得焦点
HTMLElement.forceSpellCheck() void
GlobalEventHandlers接口描述了事件处理程序像HTMLElement常见的几个接口,文件,窗口,或WorkerGlobalScope Web Workers。这些接口可以实现更多的事件处理程序。
属性 GlobalEventHandlers.onabort中断事件。
GlobalEventHandlers.onblur失去焦点事件。
GlobalEventHandlers.onfocus获取焦点事件。
此处省略若干GlobalEventHandlers接口属性,更多方法查看这里。
该接口用于创建对应的元素。
如:
HTMLDivElement 接口提供了一些特殊属性(它也继承了通常的 HTMLElement 接口)来操作div元素。
HTMLFormElement接口可以创建或者修改
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/96369.html
摘要:渲染树的布局创建渲染器并将其添加到树中时,它没有位置和大小,计算这些值称为布局。根渲染器的位置为,其尺寸与浏览器窗口的可见部分即的大小相同。渲染器使其在屏幕上的矩形无效,这会导致操作系统将其视为需要重新绘制并生成绘事件的区域。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第11篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前...
摘要:原文地址如果您对本系列文章感兴趣,欢迎关注订阅这里前言上文多页应用架构系列十二利用生成普通网页页面模板我们基本上已经搞清楚如何利用来生成普通网页页面模板,本文将以我的脚手架项目介绍如何在这基础上搭建一套简单的模板布局系统。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190000007...
阅读 2364·2023-04-25 20:07
阅读 3302·2021-11-25 09:43
阅读 3661·2021-11-16 11:44
阅读 2528·2021-11-08 13:14
阅读 3177·2021-10-19 11:46
阅读 894·2021-09-28 09:36
阅读 2974·2021-09-22 10:56
阅读 2373·2021-09-10 10:51