广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >JavaScript事件类型的简单介绍
  • 733
分享到

JavaScript事件类型的简单介绍

2024-04-02 19:04:59 733人浏览 独家记忆
摘要

这篇文章主要讲解了“javascript事件类型的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript事件类型的简单介绍”吧!DOM事

这篇文章主要讲解了“javascript事件类型的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript事件类型的简单介绍”吧!

DOM事件流

DOM(文档对象模型)结构是一个树型结构,当一个html元素产生一个事件时,该事件会在元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件流。事件顺序有两种类型:事件捕捉和事件冒泡。

冒泡型事件(Event Bubbling)

这是IE浏览器对事件模型的实现,也是最容易理解的,至少笔者觉得比较符合实际的。冒泡,顾名思义,事件像个水中的气泡一样一直往上冒,直到顶端。从DOM树型结构上理解,就是事件由叶子节点沿祖先结点一直向上传递直到根节点;从浏览器界面视图HTML元素排列层次上理解就是事件由具有从属关系的最确定的目标元素一直传递到最不确定的目标元素.冒泡技术.冒泡型事件的基本思想,事件按照从特定的事件目标开始到最不确定的事件目标.

捕获型事件(Event Capturing)

Netscape 的实现,它与冒泡型刚好相反,由DOM树最顶层元素一直到最精确的元素,这个事件模型对于开发者来说(至少是我..)有点费解,因为直观上的理解应该如同冒泡型,事件传递应该由最确定的元素,即事件产生元素开始。

DOM标准的事件模型

我们已经对上面两个不同的事件模型进行了解释和对比。DOM标准同时支持两种事件模型,即捕获型事件与冒泡型事件,但是,捕获型事件先发生。两种事件流都会触发DOM中的所有对象,从document对象开始,也在document对象结束(大部分兼容标准的浏览器会继续将事件是捕捉/冒泡延续到window对象)。

DOM标准的事件模型最独特的性质是,文本节点也会触发事件(在IE不会)。

事件传送

为了更好的说明DOM标准中的事件流原理,我们把它放在“事件传送”小结里来更具体的解释。

显然,如果为一个超链接添加了click事件监听器,那么当该链接被点击时该事件监听器就会被执行。但如果把该事件监听器指派给了包含该链接的p元素或者位于DOM树顶端的document节点,那么点击该链接也同样会触发该事件监听器。

这是因为事件不仅仅对触发的目标元素产生影响,它们还会对沿着DOM结构的所有元素产生影响。这就是大家所熟悉的事件转送。W3C事件模型中明确地指出了事件转送的原理。事件传送可以分为3个阶段。

(1).在事件捕捉(Capturing)阶段,事件将沿着DOM树向下转送,目标节点的每一个祖先节点,直至目标节点。例如,若用户单击了一个超链接,则该单击事件将从document节点转送到html元素,body元素以及包含该链接的p元素。在此过程中,浏览器都会检测针对该事件的捕捉事件监听器,并且运行这件事件监听器。

(2)在目标(target)阶段,浏览器在查找到已经指定给目标事件的事件监听器之后,就会运行 该事件监听器。目标节点就是触发事件的DOM节点。例如,如果用户单击一个超链接,那么该链接就是目标节点(此时的目标节点实际上是超链接内的文本节点)。

(3).在冒泡(Bubbling)阶段,事件将沿着DOM树向上转送,再次逐个访问目标元素的祖先节点到document节点。该过程中的每一步。浏览器都将检测那些不是捕捉事件监听器的事件监听器,并执行它们。

并非所有的事件都会经过冒泡阶段的

所有的事件都要经过捕捉阶段和目标阶段,但是有些事件会跳过冒泡阶段。例如,让元素获得输入焦点的focus事件以及失去输入焦点的blur事件就都不会冒泡。

事件句柄和事件接听器

事件句柄

事件句柄(又称事件处理函数,DOM称之为事件监听函数),用于响应某个事件而调用的函数称为事件处理函数。每一个事件均对应一个事件句柄,在程序执行时,将相应的函数或语句指定给事件句柄,则在该事件发生时,浏览器便执行指定的函数或语句,从而实现网页内容与用户操作的交互。当浏览器检测到某事件发生时,便查找该事件对应的事件句柄有没有被赋值,如果有,则执行该事件句柄。

我们认为响应点击事件的函数是onclick事件处理函数。以前,事件处理函数有两种分配方式:在JavaScript中或者在HTML中。如果在JavaScript 中分配事件处理函数, 则需要首先获得要处理的对象的一引用,然后将函数赋值给对应的事件处理函数属性,请看一个简单的例子:

var link=document.getElementById("mylink");  link.onclick=function(){   alert("I was clicked !");  };

从我们看到的例子中,我们发现使用事件句柄很容易,不过事件处理函数名称必须是小写的,还有就是只有在元素载入完成之后才能将事件句柄赋给元素,不然会有异常。如果在HTML中分配事件句柄的话,则直接通过HTML属性来设置事件处理函数就行了,并在其中包含合适的脚本作为特性值就可以了,例如:

<a href="/" onclick="JavaScript code here">......</a>

这种JavaScript代码和通过HTML的style属性直接将CSS属性赋给元素类似。这样会代码看起来一团糟,也违背了将实现动态行为的代码与显示文档静态内容的代码相分离的原则。从1998年开始,这种写法就过时了。这种传统的事件绑定技术,优缺点是显然的:

◆简单方便,在HTML中直接书写处理函数的代码块,在js中给元素对应事件属性赋值即可。

◆IE与DOM标准都支持的一种方法,它在IE与DOM标准中都是在事件冒泡过程中被调用的。

◆可以在处理函数块内直接用this引用注册事件的元素,this引用的是当前元素。

◆要给元素注册多个监听器,就不能用这方法了。

事件接听器

除了前面已经介绍的简单事件句柄之外,现在大多数浏览器都内置了一些更高级的事件处理方式,即,事件监听器,这种处理方式就不受一个元素只能绑定一个事件句柄的限制。

我们已经知道了事件句柄与事件监听器的***不同之处是使用事件句柄时一次只能插接一个事件句柄,但对于事件监听器,一次可以插接多个。

IE下的事件监听器

IE提供的却是一种自有的,完全不同的甚至存在BUG的事件监听器,因此如果要让脚本在本浏览器中正常运行的话,就必须使用IE所支持的事件监听器。另外,Safari 浏览器中的事件监听器有时也存在一点不同。在IE中,每个元素和window对象都有两个方法:attachEvent方法和detachEvent方法。

element.attachEvent("onevent",eventListener);

此方法的意思是在IE中要想给一个元素的事件附加事件处理函数,必须调用attachEvent方法才能创建一个事件监听器。attachEvent方法允许外界注册该元素多个事件监听器。

attachEvent接受两个参数。***个参数是事件类型名,第二个参数eventListener是回调处理函数。这里得说明一下,有个经常会出错的地方,IE下利用attachEvent注册的处理函数调用时this指向不再是先前注册事件的元素,这时的this为window对象。还有一点是此方法的事件类型名称必须加上一个”on”的前缀(如onclick)。

element.attachEvent("onevent",eventListener);

要想移除先前元素注册的事件监听器,可以使用detachEvent方法进行删除,参数相同。

DOM标准下的事件监听器

在支持W3C标准事件监听器的浏览器中,对每个支持事件的对象都可以使用addEventListener方法。该方法既支持注册冒泡型事件处理,又支持捕获型事件处理。所以与IE浏览器中注册元素事件监听器方式有所不同的。

//标准语法   element.addEventListener('event', eventListener, useCapture);  //默认  element.addEventListener('event', eventListener, false);

addEventListener方法接受三个参数。***个参数是事件类型名,值得注意的是,这里事件类型名称与IE的不同,事件类型名是没&rsquo;on&rsquo;开头的;第二个参数eventListener是回调处理函数(即监听器函数);第三个参数注明该处理回调函数是在事件传递过程中的捕获阶段被调用还是冒泡阶段被调用 ,通常此参数通常会设置为false(为false时是冒泡),那么,如果将其值设置为true,那就创建一个捕捉事件监听器。移除已注册的事件监听器调用element的removeEventListener方法即可,参数相同.。

//标准语法   element.removeEventListener('event', eventListener, useCapture);  //默认  element.removeEventListener('event', eventListener, false);

通过addEventListener方法添加的事件处理函数,必须使用removeEventListener方法才能删除,而且要求参数与添加事件处理函数时addEventListener方法的参数完全一致(包括useCapture参数),否则将不能成功删除事件处理函数。

跨浏览器的注册与移除元素事件监听器方案

我们现在已经知道,对于支持addEventListener方法的浏览器,只要需要事件监听器脚本就都需要调用addEventListener方法;而对于不支持该方法的IE浏览器,使用事件监听器时则需要调用attachEvent方法。

要确保浏览器使用正确的方法其实并不困难,只需要通过一个if-else语句来检测当前浏览器中是否存在addEventListener方法或attachEvent方法即可。这样的方式就可以实现一个跨浏览器的注册与移除元素事件监听器方案:

var EventUtil = {       //注册       addHandler: function(element, type, handler){             if (element.addEventListener){                    element.addEventListener(type, handler, false);             } else if (element.attachEvent){                    element.attachEvent("on" + type, handler);             } else {                    element["on" + type] = handler;             }        },        //移除注册        removeHandler: function(element, type, handler){             if (element.removeEventListener){                    element.removeEventListener(type, handler, false);             } else if (element.detachEvent){                    element.detachEvent("on" + type, handler);             } else {                    element["on" + type] = null;             }       }       };

事件对象引用

为了更好的处理事件,你可以根据所发生的事件的特定属性来采取不同的操作。如事件模型一样,IE 和其他浏览器处理方法不同:IE 使用一个叫做 event 的全局事件对象来处理对象(它可以在全局变量window.event中找到),而其它所有浏览器采用的 W3C 推荐的方式,则使用独立的包含事件对象的参数传递。

跨浏览器实现这样的功能时,最常见的问题就是获取事件本身的引用及获取该事件的目标元素的引用。下面这段代码就为你解决了这个问题:

var EventUtil ={      getEvent: function(event){                 return event ? event : window.event;          },              getTarget: function(event){                 return event.target || event.srcElement;                    }  };

停止事件冒泡和阻止事件的默认行为

“停止事件冒泡“和”阻止浏览器的默认行为“,这两个概念非常重要,它们对复杂的应用程序处理非常有用。

1.停止事件冒泡

停止事件冒泡是指,停止冒泡型事件的进一步传递(取消事件传递,不只是停止IE和DOM标准共有的冒泡型事件,我们还可以停止支持DOM标准浏览器的捕捉型事件,用topPropagation()方法)。例如上图中的冒泡型事件传递中,在body处理停止事件传递后,位于上层的document的事件监听器就不再收到通知,不再被处理。

2.阻止事件的默认行为

停止事件的默认行为是指,通常浏览器在事件传递并处理完后会执行与该事件关联的默认动作(如果存在这样的动作)。例如,如果表单中input type 属性是 “submit”,点击后在事件传播完浏览器就自动提交表单。又例如,input 元素的 keydown 事件发生并处理后,浏览器默认会将用户键入的字符自动追加到 input 元素的值中。

停止事件冒泡的处理方法:

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

function someHandle() {       window.event.cancelBubble = true;  }    DOM标准通过调用event对象的stopPropagation()方法即可。   function someHandle(event) {      event.stopPropagation();  }

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

function someHandle(event) {      eventevent = event || window.event;      if(event.stopPropagation){         event.stopPropagation();      }else {         event.cancelBubble = true;      }  }

阻止事件的默认行为的处理方法:

就像事件模型和事件对象差异一样,在IE和其它所有浏览器中阻止事件的默认行为的方法也不同。在IE下,通过设置event对象的returnValue为false即可。

function someHandle() {     window.event.returnValue = false;  }

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

function someHandle(event) {     event.preventDefault();  }

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

function someHandle(event) {     eventevent = event || window.event;     if(event.preventDefault){        event.preventDefault();     }else{        event.returnValue = false;     }  }

完整的事件处理兼容性函数

var EventUtil = {                   addHandler: function(element, type, handler){              if (element.addEventListener){             element.addEventListener(type, handler, false);               } else if (element.attachEvent){                     element.attachEvent("on" + type, handler);              } else {                     element["on" + type] = handler;                }         },                 removeHandler: function(element, type, handler){               if (element.removeEventListener){                      element.removeEventListener(type, handler, false);               } else if (element.detachEvent){                      element.detachEvent("on" + type, handler);             } else {                    element["on" + type] = null;             }          },        getEvent: function(event){               return event ? event : window.event;          },              getTarget: function(event){                 return event.target || event.srcElement;       },              preventDefault: function(event){         if (event.preventDefault){              event.preventDefault();                } else {               event.returnValue = false;               }         },                          stopPropagation: function(event){              if (event.stopPropagation){                   event.stopPropagation();             } else {                    event.cancelBubble = true;             }          }           };

捕获型事件模型与冒泡型事件模型的应用场合

标准事件模型为我们提供了两种方案,可能很多朋友分不清这两种不同模型有啥好处,为什么不只采取一种模型。这里抛开IE浏览器讨论(IE只有一种,没法选择)什么情况下适合哪种事件模型。

1. 捕获型应用场合

捕获型事件传递由最不精确的祖先元素一直到最精确的事件源元素,传递方式与操作系统中的全局快捷键与应用程序快捷键相似。当一个系统组合键发生时,如果注
册了系统全局快捷键监听器,该事件就先被操作系统层捕获,全局监听器就先于应用程序快捷键监听器得到通知,也就是全局的先获得控制权,它有权阻止事件的进
一步传递。所以捕获型事件模型适用于作全局范围内的监听,这里的全局是相对的全局,相对于某个顶层结点与该结点所有子孙结点形成的集合范围。

例如你想作全局的点击事件监听,相对于document结点与document下所有的子结点,在某个条件下要求所有的子结点点击无效,这种情况下冒泡模型就解决不了了,而捕获型却非常适合,可以在最顶层结点添加捕获型事件监听器,伪码如下:

function globalClickListener(event) {       if(canEventPass == false) {           //取消事件进一步向子结点传递和冒泡传递           event.stopPropagation();           //取消浏览器事件后的默认执行           event.preventDefault();       }   }

这样一来,当canEventPass条件为假时,document下所有的子结点click注册事件都不会被浏览器处理。

2. 冒泡型的应用场合

可以说我们平时用的都是冒泡事件模型,因为IE只支持这模型。这里还是说说,在恰当利用该模型可以提高脚本性能。在元素一些频繁触发的事件中,如onmousemove,onmouseover,onmouseout,如果明确事件处理后没必要进一步传递,那么就可以大胆的取消它。

此外,对于子结点事件监听器的处理会对父层监听器处理造成负面影响的,也应该在子结点监听器中禁止事件进一步向上传递以消除影响。

综合案例分析

***结合下面HTML代码作分析:

<body onclick="alert('current is body');"> <div id="div0" onclick="alert('current is '+this.id)">       <div id="div1" onclick="alert('current is '+this.id)">          <div id="div2" onclick="alert('current is '+this.id)">             <div id="event_source"                   onclick="alert('current is '+this.id)"                   style="height:200px;width:200px;background-color:red;">             </div>          </div>    </div>  </div> </body>

HTML运行后点击红色区域,这是最里层的DIV,根据上面说明,无论是DOM标准还是IE,直接写在html里的监听处理函数是事件冒泡传递时调用的,由最里层一直往上传递,所以会先后出现:

current is event_source  current is div2  current is div1  current is div0  current is body

添加以下片段:

var div2 = document.getElementById('div2');  EventUtil.addHandler(div2, 'click', function(event){       event = EventUtil.getEvent(event);    EventUtil.stopPropagation(event);   }, false);

当点击红色区域后,根据上面说明,在泡冒泡处理期间,事件传递到div2后被停止传递了,所以div2上层的元素收不到通知,所以会先后出现:

current is event_source  current is div2

在支持DOM标准的浏览器中,添加以下代码:

document.body.addEventListener('click', function(event){      event.stopPropagation();  }, true);

感谢各位的阅读,以上就是“JavaScript事件类型的简单介绍”的内容了,经过本文的学习后,相信大家对JavaScript事件类型的简单介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: JavaScript事件类型的简单介绍

本文链接: https://www.lsjlt.com/news/81212.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript事件类型的简单介绍
    这篇文章主要讲解了“JavaScript事件类型的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript事件类型的简单介绍”吧!DOM事...
    99+
    2022-10-19
  • javascript简单事件处理和with用法介绍
    这一期介绍一些简单的事件处理: 1.鼠标点击 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio...
    99+
    2022-11-15
    事件处理 with用法
  • MySQL中decimal类型用法的简单介绍
    MySQL中支持浮点数的类型有FLOAT、DOUBLE和DECIMAL类型,DECIMAL 类型不同于FLOAT和DOUBLE,DECIMAL 实际是以串存放的。DECIMAL 可能的最大取值范围与DOUB...
    99+
    2022-10-18
  • 简单介绍Python中的几种数据类型
    大体上把Python中的数据类型分为如下几类: Number(数字) 包括int,long,float,complex String(字符串) 例如:hello,"he...
    99+
    2022-06-04
    几种 数据类型 简单
  • JavaScript闭包的简单介绍
    本篇内容主要讲解“JavaScript闭包的简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript闭包的简单介绍”吧!什么是JS闭包?先看一...
    99+
    2022-10-19
  • ADO对象模型的简单介绍
    本篇内容介绍了“ADO对象模型的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ADO对象模型是ActiveX Data Object...
    99+
    2023-06-17
  • JavaScript组合模式的简单介绍
    这篇文章主要介绍“JavaScript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2022-10-19
  • JavaScript中的数据类型介绍
    一、基本数据类型(原始值类型) 基本类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。 基本类...
    99+
    2022-11-13
  • wordpress简单提速的插件介绍
      本人2012年12月20日左右接触wordpress,至今已经两个月。因为以前丝毫没有网站管理经验及编程能力,因此在安装wordpress 后直接找主题安装使用,并没有怎么学习。在使用过程中不断尝试各种代码及插件,以...
    99+
    2022-06-12
    wordpress 提速插件
  • Python的类、继承和多态简单介绍
    这篇文章主要讲解了“Python的类、继承和多态简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的类、继承和多态简单介绍”吧!类的定义假如要定义一个类 Point,表示二维...
    99+
    2023-06-17
  • C#读取XML文件的简单介绍
    这篇文章主要讲解了“C#读取XML文件的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#读取XML文件的简单介绍”吧!C#读取XML文件:编译NO2.cs后,执行将产生"...
    99+
    2023-06-17
  • MySQL binlog中三种事件类型XID_EVENT、ROTATE_EVENT及STOP_EVENT介绍
    下面讲讲关于MySQL binlog中三种事件类型XID_EVENT、ROTATE_EVENT及STOP_EVENT介绍,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL...
    99+
    2022-10-18
  • mysql索引分类、事务特性及查看视图简单介绍
    本文主要给大家简单讲讲mysql索引分类、事务特性及查看视图,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql索引分类、事务特性及查看视图这篇文章可以...
    99+
    2022-10-18
  • javaScript深拷贝和浅拷贝的简单介绍
    目录基本数据类型在数据结构当中引用数据类型浅拷贝-深拷贝浅拷贝浅拷贝小结深拷贝结尾源码地址在了解深拷贝和浅拷贝之前,我们先梳理一下: JavaScript中,分为基本数据类型(原始值...
    99+
    2022-11-13
  • Linux环境变量文件的简单介绍
    这篇文章主要介绍“Linux环境变量文件的简单介绍”,在日常操作中,相信很多人在Linux环境变量文件的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux环境变量文件的简单介绍”的疑惑有所帮助!...
    99+
    2023-06-05
  • JavaScript中标识符的命名规则简单介绍
    本篇内容主要讲解“JavaScript中标识符的命名规则简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中标识符的命名规则简单介绍”吧...
    99+
    2022-10-19
  • Linux下几种文件系统的简单介绍
    这篇文章主要讲解了“Linux下几种文件系统的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux下几种文件系统的简单介绍”吧!ExtExt 是最为流行的 Linux 文件系统,...
    99+
    2023-06-16
  • JavaScript中的4 个相等比较算法的简单介绍
    这篇文章主要讲解了“JavaScript中的4 个相等比较算法的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中的4 个相等比较...
    99+
    2022-10-19
  • Java核心类库String的简单介绍及常用方法
    本篇内容介绍了“Java核心类库String的简单介绍及常用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一、 简介零碎知识点字符串...
    99+
    2023-06-20
  • JavaScript 中的引用类型Date 和RegExp的详细介绍
    目录引用类型 & 引用值的理解Date 引用类型Date.parse()方法Date.UTC()方法继承的方法RegExpRegExp 实例方法exec()test()继承的...
    99+
    2022-11-13
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作