【JS】DOM事件模型

DOM事件模型主要包含4个方面的内容,分别是:

  1. 事件流
  2. 主流浏览器的事件模型
  3. 事件对象
  4. 注册与移除事件监听器

下面一一了解下:

首先,什么是DOM?文档对象模型(DOM)是表示文档(比如HTML和XML)和访问、操作构成文档的各种元素的应用程序接口(API)。一般的,支持Javascript的所有浏览器都支持DOM。

在DOM眼中,HTML跟XML一样是一种树形结构的文档,<html>是根(root)节点,<head>、<title>、<body>是<html>的子(children)节点,互相之间是兄弟(sibling)节点;<body>下面才是子节点<table>、<span>、<p>等等。如下图:

DOM下,HTML文档各个节点被视为各种类型的Node对象。每个Node对象都有自己的属性和方法,利用这些属性和方法可以遍历整个文档树。由于HTML文档的复杂性,DOM定义了nodeType来表示节点的类型。这里列出Node常用的几种节点类型:


接口


nodeType常量


nodeType值


备注


Element


Node.ELEMENT_NODE


1


元素节点


Text


Node.TEXT_NODE


3


文本节点


Document


Node.DOCUMENT_NODE


9


document


Comment


Node.COMMENT_NODE


8


注释的文本


DocumentFragment


Node.DOCUMENT_FRAGMENT_NODE


11


document片断


Attr


Node.ATTRIBUTE_NODE


2


节点属性

1、 事件流

DOM(文档对象模型)结构是一个树型结构,当一个   HTML元素产生一个事件时,该事件会在元素结点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流。

2、 主流浏览器的事件模型

直到DOM Level3中规定后,多数主流浏览器才陆陆续续支持DOM标准的事件处理模型——捕获型与冒泡型。

目前除IE浏览器外,其它主流的Firefox,Opera,Safari都支持标准的DOM事件处理模型。IE仍然使用自己的模型,即冒泡型,它模型的一部份被DOM采用,这点对于开发者来说也是有好处的,只使用DOM标准,IE都共有的事件处理方式才能有效的跨浏览器。

冒泡型事件(Bubbling):从DOM树型结构上理解,就是事件由叶子结点沿祖先结点一直向上传递直到根结点;从浏览器界面视图HTML元素排列层次上理解就是事件由具有从属关系的最确定的目标元素一直传递到最不确定的目标元素。

捕获型事件(Capturing):NetscapeNavigator的实现,它与冒泡型刚好相反,由DOM树最顶层元素一直到最精确的元素。

DOM标准事件模型:因为两个不同的模型都有其优点和解释,DOM标准支持捕获型与冒泡型,可以说是它们两者的结合体。它可以在一个DOM元素上绑定多个事件处理器,并且在处理函数内部,this关键字仍然指向被绑定的DOM元素,另外处理函数参数列表的第一个位置传递事件event对象。

首先是捕获式传递事件,接着是冒泡式传递,所以,如果一个处理函数既注册了捕获型事件的监听,又注册冒泡型事件监听,那么在DOM事件模型中它就会被调用两次。

Javascript的DOM事件流主要经历三个阶段,分别是事件捕获阶段、目标出发阶段和时间冒泡阶段。注意,所有事件都经过捕获阶段和目标阶段,但并不是所有的时间都会经过冒泡阶段。

3、 事件对象

在IE浏览器中事件对象是window对象的一个属性event,并且event对象只能在事件发生时候被访问,所有事件处理完后,该对象就消失了。而标准的DOM中规定event必须作为惟一的参数传给事件处理函数。故为了实现兼容性,通常采用下面的方法:

functionsomeHandle(event) {

if(window.event)

event=window.event;

}

说明:

在两种浏览器处理事件中,type属性是各种浏览器所兼容的,他表示获取的事件类型,返回字符串。

在检测Shift,Alt,Ctrl三个键时,两种浏览器事件使用的方法也是一样的。

在IE中,事件的对象包含在event的srcElement属性中,而在标准的DOM浏览器中,对象包含在target属性中。

为了处理两种浏览器兼容性,举例如下:

function handle(oEvent){

if(window.event) oEvent =window.event;        //处理兼容性,获得事件对象

var oTarget;

if(oEvent.srcElement)               //处理兼容性,获取事件目标

oTarget =oEvent.srcElement;

else

oTarget = oEvent.target;

alert(oTarget.tagName);               //弹出目标的标记名称

}

window.onload = function(){

var oImg =document.getElementsByTagName(“img”)[0];

oImg.onclick = handle;

}

4、 注册与移除事件监听器

IE下注册多个事件监听器与移除监听器方法

IE浏览器中HTML元素有个attachEvent方法允许外界注册该元素多个事件监听器,例如:element.attachEvent(‘onclick’, observer);

要移除先前注册的事件的监听器,调用element的detachEvent方法即可,参数相同,例如:element.detachEvent(‘onclick’, observer);

DOM标准下注册多个事件监听器与移除监听器方法

实现DOM标准的浏览器与IE浏览器中注册元素事件监听器方式有所不同,它通过元素的addEventListener方法注册,该方法既支持注册冒泡型事件处理,又支持捕获型事件处理。

element.addEventListener(‘click’, observer,useCapture);

addEventListener方法接受三个参数。第一个参数是事件名称,值得注意的是,这里事件名称与IE的不同,事件名称是没‘on’开头的;第二个参数observer是回调处理函数;第三个参数注明该处理回调函数是在事件传递过程中的捕获阶段被调用还是冒泡阶段被调用,默认true为捕获阶段。

移除已注册的事件监听器调用element的removeEventListener即可,参数不变。

element.removeEventListener(‘click’, observer,useCapture);

直接在DOM节点上加事件

如何取消浏览器事件的传递与事件传递后浏览器的默认处理:

取消事件传递是指,停止捕获型事件或冒泡型事件的进一步传递。例如上图中的冒泡型事件传递中,在body处理停止事件传递后,位于上层的document的事件监听器就不再收到通知,不再被处理。

事件传递后的默认处理是指,通常浏览器在事件传递并处理完后会执行与该事件关联的默认动作(如果存在这样的动作)。

取消浏览器的事件传递:

在IE下,通过设置event对象的cancelBubble为true即可。

functionsomeHandle() {

window.event.cancelBubble = true;

}

DOM标准通过调用event对象的stopPropagation()方法即可。

functionsomeHandle(event) {

event.stopPropagation();

}

因此,跨浏览器的停止事件传递的方法是:

functionsomeHandle(event) {

event = event || window.event;

if(event.stopPropagation)

event.stopPropagation();

else event.cancelBubble = true;

}

取消事件传递后的默认处理

在IE下,通过设置event对象的returnValue为false即可。

functionsomeHandle() {

window.event.returnValue = false;

}

DOM标准通过调用event对象的preventDefault()方法即可。

functionsomeHandle(event) {

event.preventDefault();

}

因此,跨浏览器的取消事件传递后的默认处理方法是:

functionsomeHandle(event) {

event = event || window.event;

if(event.preventDefault)

event.preventDefault();

else event.returnValue = false;

}

可见,为了兼容不同浏览器的不同标准,我们需要添加多一些if..else判断才能在各种浏览器上跑起来。生活中,人也是这样,每个人的性格不同,需要我们多一些包容,胸怀才能更广阔,才能与人更好地相处。

Author:致知

Sign:路漫漫其修远兮,吾将上下而求索。

时间: 2024-08-24 23:11:58

【JS】DOM事件模型的相关文章

JS的三种使用方式/CSS的三种使用方式/JS中的DOM事件模型/JS中匿名函数的书写及调用/媒体查询@media的三种使用方式

一.JS的三种使用方式 1.html标签中内嵌JS(不提倡使用.)                <button onclick="javascript:alert('你真点啊.')" > 有本事点我呀!!!!</button>                                2.HTML页面中直接使用JS:                <script type="text/javascript">        

仅用原生JavaScript手写DOM事件模型

前言 前段时间博客园里有篇很火的帖子2016十家公司前端面试小记,主要讲作者的前端求职面试经历,其中提到了面试官会考察手写一个简单的事件模型: "如果上述都ok的话,那么极有可能要求让你[实现事件模型],即写一个类或是一个模块,有两个函数,一个bind一个trigger,分别实现绑定事件和触发事件,核心需求就是可以对某一个事件名称绑定多个事件响应函数,然后触发这个事件名称时,依次按绑定顺序触发相应的响应函数." 如果了解观察者模式,那么事件模型应该不算太难.本着深入钻研的精神,我试着来

DOM事件模型

DOM 首先,DOM全称是Document Object Model,即文档对象模型.DOM是W3C的标准,定义了访问 HTML 和 XML 文档的标准. “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容.结构和样式.” DOM事件 DOM使Javascript有能力对HTML上的事件做出反应.这些事件包括鼠标键盘的点击事件.移动事件以及页面中内容的变化等.HTML元素事件是浏览器内在自动产生的,当有事件发生时html元素会向外界(这里主要

DOM事件模型学习笔记

下面的内容属于阅读笔记,其中涉及大量内容来自于PPK的博客的内容,如果你要跟随我的脚步领略大家风采,那么就从Introduction to Events开始阅读吧. 现代的前端开发应该是会严格遵守 html 展示文档内容构成,css 渲染页面效果,javascript 提供交互 浏览器提供交互行为可以追溯到Netscape公司在其第二个版本中支持javascript语言,随后其与微软之间的浏览器大战,以及w3c标准制定的落后,导致至今一直被诟病的浏览器兼容问题,而这些不兼容中关于DOM事件模型的

javascript的IE事件和DOM事件模型

通用的事件模型: 1.是在HTML页面绑定 <button id="button" onclick="function();">按钮</button> 2.在javascript脚本文件中绑定事件处理 document.getElementById('button').onclick = function; IE中的事件模型 1.使用script for绑定(这个绑定很少用) <script for="btn1" e

【javascript总结】javascript的IE事件和DOM事件模型

通用的事件模型 1.是在HTML页面绑定 <button id="button" onclick="function();">按钮</button> 2.在javascript脚本文件中绑定事件处理 document.getElementById('button').onclick = function; IE中的事件模型 1.使用script for绑定(这个绑定很少用) <script for="btn1" ev

W3C DOM 事件模型(简述)

1.事件模型 由于事件捕获与冒泡模型都有其长处和解释,DOM标准支持捕获型与冒泡型,能够说是它们两者的结合体.它能够在一个DOM元素上绑定多个事件处理器,而且在处理函数内部,thiskeyword仍然指向被绑定的DOM元素,另外处理函数參数列表的第一个位置传递事件event对象.首先是捕获式传递事件,接着是冒泡式传递,所以,假设一个处理函数既注冊了捕获型事件的监听,又注冊冒泡型事件监听,那么在DOM事件模型中它就会被调用两次. [ oschina] 2.事件传播 A)冒泡模式(Bubble)IE

DOM事件模型浅析

1.何为DOM DOM是"Document Object Model"的缩写,中文译为"文档对象模型".它是一种跨平台.跨语言的编程接口,将HTML,XHTML,XML文档映射成树形结构,树的每一个节点都是一个对象.正因如此,面向对象的编程语言(如javascript)可以通过DOM对HTML,XHTML,XML文档进行操作.对于HTML文档来说,它的根结点为document对象,HTML元素为element对象,HTML元素的属性为attr对象. 2.何为DOM事

DOM事件: DOM事件级别、DOM事件流、DOM事件模型、DOM事件捕获过程、自定义事件

前端面试中只要问到事件,就肯定会有DOM事件:如果回答出来了,就会一直向下延申,其实这些东西都很简单,但我第一次被问到的时候,也是懵的: DOM事件级别: DOM0 element.onclick = function() { } DOM1 一般只有设计规范,没有设计跟事件相关的东西:所以直接跳过 DOM2 element.addEventListener(‘click’, function() { }, false) DOM3 element.addEventLIstener(‘keyup’,