当前位置: 首页 > Web前端 > HTML5

如何形成一个完整的HTML对象

时间:2023-04-05 13:31:23 HTML5

写在前面,这篇文章会发表在Blog、掘金、segmentfault、知乎等,如果这篇文章对你有帮助,记得获取我的个人技术博客项目我哦星。为什么写这篇文章?你可能已经做了一段时间的网页开发,你有没有想过以下问题?为什么div元素甚至所有的html元素都可以使用addEventListener来添加事件?为什么每个DOM节点都有parentNode、firstChild、nodeType等属性?为什么每个DOM元素都有className、classList、innerHTML等属性?为什么有些DOM元素会有accessKey、contentEditable、isContentEditable等属性?为什么每个DOM元素都有onclick、ondblclick、ondrag等属性?这篇文章就是要回答这些简单而不“简单”的问题。EventTarget定义EventTarget是由可以接收事件并为其创建侦听器的对象实现的接口。作用Element、document和window是最常见的事件目标,但其他对象也可以是事件目标,例如XMLHttpRequest、AudioNode、AudioContext等。许多事件目标(包括元素、文档和窗口)也支持通过onXXX(如onclick)属性和属性设置事件处理程序。该接口的EventTarget.addEventListener()方法为EventTarget上的特定事件类型注册事件处理程序。EventTarget.removeEventListener()从EventTarget中移除一个事件侦听器。EventTarget.dispatchEvent()向此EventTarget分派一个事件。我们实现EventTargetvarEventTarget=function(){this.listeners={};};EventTarget.prototype.listeners=null;EventTarget.prototype.addEventListener=function(type,callback){if(!(typeinthis.listeners)){this.listeners[type]=[];}this.listeners[type].push(callback);};EventTarget.prototype.removeEventListener=function(type,callback){if(!(typeinthis.listeners)){return;}varstack=this.listeners[type];对于(vari=0,l=stack.length;i对象;它继承了HTMLElement接口的方法和属性。HTMLAnchorElement接口代表超链接元素并提供一些特殊的属性和方法(除了那些从普通HTMLElement对象接口继承的)来操纵这些元素的布局和显示。......回答上一个问题通过以上知识,我们知道:HTMLDivElement(其他元素接口)继承了HTMLElement和GlobalEventHandlers接口。HTMLElement继承了Element接口。Element继承了Node接口。Node继承了EventTarget接口。为什么div元素甚至所有的html元素都可以使用addEventListener来添加事件?答:继承自EventTarget接口。为什么每个DOM节点都有parentNode、firstChild、nodeType等属性?答:继承自Node接口。为什么每个DOM元素都有className、classList、innerHTML等属性?答:继承自Element接口。为什么有些DOM元素会有accessKey、contentEditable、isContentEditable等属性?答:继承自HTMLElement接口。为什么每个DOM元素都有onclick、ondblclick、ondrag等属性?答:继承自GlobalEventHandlers接口。------------------关键分界线--------------------只有通过上面的继承关系,我们获取到的DOM元素是一个完整的HTML对象,我们可以对其进行设置/获取属性、绑定事件、添加样式类等操作。参考文档:EventTargetNodeElementHTMLElementGlobalEventHandlers