Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈JavaScript的事件(事件处理程序)

浅谈JavaScript的事件(事件处理程序)

作者头像
水击三千
发布于 2018-02-27 09:51:18
发布于 2018-02-27 09:51:18
1.6K00
代码可运行
举报
文章被收录于专栏:水击三千水击三千
运行总次数:0
代码可运行

  事件就是用户或者浏览器自身执行的某种动作。诸如click、load和mouseover,都是事件的名字。而响应某个事件的函数就叫事件处理程序。事件处理程序的名字以“on”开头,比如click事件的事件处理程序是onclick。为事件指定事件处理程序的方式有多种方式。

  • HTML事件处理程序

元素支持的事件,都可以使用与相应事件处理程序同名的HTML特性来指定。这个特性的值能支持一定的JavaScript代码。例如,在单击按钮的时候执行一些JavaScript代码。 <div id="aa" onclick="console.log('div')" style="width: 100px;">2222</div> ,当单击这个div的时候,会在浏览器的控制台中输出div。这个特性是通过JavaScript来实现的,不能在其中使用未经转义的HTML语法字符,例如和号(&)、双引号("")、单引号('')、小于号(<)或者大于号(>)。

  在HTML中定义的事件处理程序可以包含要执行的具体动作,也可以调用定义在其他页面的脚本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1  function divClick(e){
2              var target=e.target;
3              console.log("div");
4              //stopBubble(e);
5          }

<div id="aa" onclick="divClick(event);" style="width: 100px;">2222</div>

  上面的代码中,点击div之后就会调用divClick函数。这个函数是单独定义的script脚本中的,当然也可以定义在一个外部文件中。事件处理程序中的代码,可以访问全局的方法。上面的代码中,同样可以传递event参数以及this参数。event参数能够获取事件的类型参数等,通过this能够获取点击对象本身。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1  function divClick(e){
2              //var target=e.target;
3              console.log($(e).text());//222
4              //stopBubble(e);
5          }

<div id="aa" onclick="divClick(this);" style="width: 100px;">2222</div>

  在HTML中指定事件处理程序有一定的缺点:存在一定的时差,用户可能在页面一出现就触发相应的事件,但是事件处理程序尚不具备执行的条件。上面的例子上,如果divClick函数定义在div的下方,我们在函数尚未解析之前,就点击div,这样就会导致报错。

  另一个缺点是,这样的事件处理程序的作用域链在不同的浏览器中会导致不同结果。不同JavaScript引擎遵循的标识符解析规则略有差异,很可能在访问非限定对象时出错。

  通过HTML指定事件处理程序的最后一个缺点是HTML与JavaScript代码的紧密耦合。如果要更换事件处理程序就需要改动两个地方:JavaScript和HTML。

  • DOM级事件处理程序

  通过JavaScript指定事件处理程序的传统方式是将一个函数赋值给事件处理程序属性。通过JavaScript指定事件处理程序有两个优势:简单和浏览器兼容性好。要使用JavaScript指定事件处理程序,首先必须获取一个元素的对象引用。每个元素都有自己的事件处理程序,这个属性通常是全部小写,比如onclick。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <div id="aa"  style="width: 100px;">2222</div>
2         <script>
3             var a=document.getElementById("aa");
4             a.onclick=function(e){
5                 var target=e.target;
6                 var text=target.innerHTML;
7                 console.log(text);//222
8             }
9         </script>

  上面的代码,通过文档对象获取了对象的引用,然后为它指定了onclick事件处理程序。e为点击事件的参数,通过该参数能够获取点击事件的对象,即target。通过对象可以进一步获取对象的属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <div id="aa"  style="width: 100px;">2222</div>
2         <script>
3             $("#aa").click(function(e){
4                 var target=e.target;
5                 var text=target.innerHTML;
6                 console.log(text);//222
7             });
8         </script>

  这段代码与上面的例子实现的是一样的效果,但是这个是通过JQuery来实现的。

  DOM2级事件处理程序定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener和removeEventListener。所有DOM节点都包含这两个方法,并且他们接收3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。布尔值如果为true,表示在捕获阶段执行事件处理程序,如果为false,表示在冒泡阶段调用事件处理程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <div id="aa"  style="width: 100px;">2222</div>
2         <script>
3             var a=document.getElementById("aa");
4             a.addEventListener("click",function(e){
5                 console.log(this.id);
6             },false);
7         </script>

  上面的例子通过addEventListener为元素aa添加了一个click事件。通过事件处理程序能够访问到元素,this和元素处在同一个作用域链。

  通过DOM2级可以通过添加多个事件处理程序。事件处理程序会按照添加的顺序依次触发。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var a=document.getElementById("aa");
2             a.addEventListener("click",function(e){
3                 console.log(this.id);
4             },false);
5             a.addEventListener("click",function(e){
6                 console.log(this.innerHTML);
7             },false);

  通过addEventListener添加的事件处理程序,可以通过removeEventListener来移除事件处理程序。但是,有时候我们会走入一个误区。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var a=document.getElementById("aa");
2             a.addEventListener("click",function(e){
3                 console.log(this.id);
4             },false);
5             a.removeEventListener("click",function(e){
6                 console.log(this.id);
7             },false);

  上面的代码我们使用removeEventListener方法移除事件处理程序,但是并没有起作用。在使用addEventListener和removeEventListener的时候,第二个事件处理程序函数必须是同一个函数才会有作用,我们对上面的代码作一个修改,就可以了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var a=document.getElementById("aa");
2             var callback=function(e){
3                 console.log(this.id);
4             }
5             a.addEventListener("click",callback,false);
6             a.removeEventListener("click",callback,false);

  上面的代码中,我们在addEventListener和removeEventListener中调用的是同一个方法,所以元素aa已经没有点击事件。

  对于IE8以及IE8以下浏览器来说,它们并没有上述的两个方法,但是提供了attachEvent和detachEvent两个方法。这两个只需要传递两个参数:第一参数事件程序名称,第二个事件处理程序函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var a=document.getElementById("aa");
2             var callback=function(e){
3                 console.log(e.target.innerHTML);
4             }
5             //a.addEventListener("click",callback,false);
6             //a.removeEventListener("click",callback,false);
7             a.attachEvent("onclick",callback);

  上面的代码通过attachEvent添加了事件处理程序,但是attachEvent与addEventListener不一样。在attachEvent的事件处理程序函数中this是指向window的,我们无法获取元素对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var a=document.getElementById("aa");
2             var callback=function(e){
3                 console.log(this.id);
4             }
5             //a.addEventListener("click",callback,false);
6             //a.removeEventListener("click",callback,false);
7             a.attachEvent("onclick",function(e){
8                 callback.call(a,e);
9             });

  上面的代码,我们通过call修改了this的指向,但是这样会带来另外一个问题,怎么detachEvent?

  • 跨浏览器事件处理程序 

  为了以跨浏览器的事件处理程序,开发人员可以封装适合自己的js库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 var EventUtil={
 2                 addEvent:function(element,type,fn){
 3                     if(element.addEventListener){
 4                         element.addEventListener(type,fn,false);
 5                     }
 6                     else if(element.attachEvent){
 7                         element.attachEvent("on"+type,fn);
 8                     }
 9                     else{
10                         element["on"+type]=fn;
11                     }
12                 },
13                 removeEvent:function(element,type,fn){
14                     if(element.removeEventListener){
15                         element.removeEventListener(type,fn,false);
16                     }
17                     else if(element.detachEvent){
18                         element.detachEvent("on"+type,fn);
19                     }
20                     else{
21                         element["on"+type]=null;
22                     }
23                 }
24             };
25             var aa=document.getElementById("aa");
26             var func=function(e){
27                 console.log(e.type);
28                 EventUtil.removeEvent(aa,"click",func);
29             }
30             EventUtil.addEvent(aa,"click",func);

  上面的EventUtil封装了一个跨浏览器的对象,包含两个方法addEvent和removeEvent。在第25行获取元素对象引用,26行定义了fn函数,30行调用addEvent添加了事件处理程序。这个事件处理程序只能执行一次,因为我们在func函数中又调用了removeEvent函数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈JavaScript的事件(事件对象)
  在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有关的信息。包括导致事件的元素、事件的类型和事件的相关信息。例如鼠标操作的事件中,会包含鼠标的位置信息。而键盘触发的事件会包含与按下的键有关信息。所有浏览器都支持event对象,但支持方式不同。 DOM中的事件对象   兼容dom的浏览会将一个event对象传递到事件处理程序中。 1 var aa=document.getElementById("aa"); 2 aa.onclick=functi
水击三千
2018/02/27
1.3K0
javascript事件详解
事件流 事件流两种顺序:冒泡与捕获。 简单的添加与删除事件 obj.onclick=function(){} obj.onclick=null; 通用事件添加的删除 obj.addEventListener(),obj.attachEvent() obj.removeEventListener(),obj.attachEvent() 三个参数分别表示,(事件,绑定函数,事件流), 注意: 1.如果必须得删除事件,这种写法,不能用匿名函数,否则删除函数的时候,不方便。 2.attachEvent的事件名称是o
前朝楚水
2018/04/02
1.4K0
一次关于js事件出发机制反常的解决记录
起因:正常情况下我点击s2时是先弹出我是children,再弹出我是father,但是却出现了先弹出我是father,后弹出我是children的情况,这种情况是在和安卓app交互的h5页面中出现的,本地测试没有问题,但是在安卓打包的内嵌h5页面就出现了问题。简单化的代码先展示出来。 html代码如下 <div id="father" class="ss1">s1 <div id="children" class="ss2">s2 </div> </div> 事件绑定如下 $('#fathe
吴裕超
2018/02/28
1.5K0
一次关于js事件出发机制反常的解决记录
事件
JavaScript与HTML之间的交互式通过事件实现的。 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码。
奋飛
2019/08/15
3.3K0
浅谈JavaScript的事件(事件委托)
  事件处理程序为Web程序提供了系统交互,但是如果页面中的事件处理程序太多,则会影响页面的性能。每个函数都是对象,都会占用内存,内存中对象越多,性能越差。需要事先为DOM对象指定事件处理程序,导致访问DOM的次数增多,会延迟整个页面的交互就绪时间。 事件委托   对事件处理程序过多的解决方案是使用事件委托。事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。比如click事件会一直冒泡到document,也就是说我们只需为整个页面指定一个onclick事件处理程序,而不必为每个需
水击三千
2018/02/27
1.1K0
事件
利用 on 开头的事件,如 onclick, 同一个元素同一个事件只能设置一个处理函数,出现多个处理函数的话,后面的会覆盖前面的。
赤蓝紫
2023/01/01
1.4K0
事件
JavaScript的事件
javascript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。
小小鱼儿小小林
2020/06/24
1.5K0
JavaScript事件探秘
事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流
张张
2019/12/26
9160
JavaScript事件处理程序
事件就是用户或者浏览器执行的某种操作。我们常用的点击,滚动视口,鼠标滑动都是事件,为响应事件而调用的函数被称为事件处理程序,在js中事件处理程序的名字以 on 开头。
大熊G
2022/11/14
5760
javascript 事件基础
一:事件流       事件流描述的是从页面中接收事件的顺序。  事件冒泡 <div id="one"> <div id="two"> <div id=
柴小智
2018/04/10
9660
javascript 事件基础
「面试常问」系统理解浏览器之事件机制
在早期 IE 和 Netscape 团队在开发第四代浏览器的时候,遇到一个问题:当点击一个按钮的时候,是应该先处理父级的事件呢?还是应该先处理按钮的事件呢?IE 和 Netscape 给出了 2 种完全相反的答案,IE 提出事件冒泡的概念,而 Netscape 则支持事件捕获。
用户4456933
2021/06/01
5750
「面试常问」系统理解浏览器之事件机制
事件高级
给元素添加事件,称为注册事件或者绑定事件。 注册事件有两种方式:传统方式和方法监听注册方式
梨涡浅笑
2022/05/08
1.3K0
事件高级
详解JavaScript事件处理程序
事件是用户与浏览器进行交互的方式。譬如用户点击按钮就会产生click事件,浏览器会找到相应js代码并执行,我们要做的就是按照规则编写js代码放在指定位置即可。
Learn-anything.cn
2021/12/26
9040
DOM事件基本概念大总结(前端必备)
事件流 这一概念源自于对事件触发对象的思考。例如常见的点击事件,鼠标移动事件。这些事件发生之时,往往不只是点击或者移动到某一特定元素上。 比如点击某一个按钮,而它是由上一层的父标签,或许在上一层还有父标签甚至是整个页面。因此点击一个元素可以看成是同时点击了父标签或者整个页面。那么此时事件应该怎么响应到指定标签呢? 事件冒泡 即事件从指定元素开始传播到最外层的元素,并且该事件不仅会在指定元素上发生,还会在传播过过程中的每一个元素上发生。 <html> <body> <div>
努力的Greatiga
2022/07/25
1.9K0
事件
事件 JavaScript和HTML的交互是通过事件实现的。JavaScript采用异步事件驱动编程模型,当文档、浏览器、元素或与之相关对象发生特定事情时,浏览器会产生事件。如果JavaScript关注特定类型事件,那么它可以注册当这类事件发生时要调用的句柄。事件是某个行为或者触发,比如点击、鼠标移动..... 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当用户触发按键时... 事件流 事件流描述的是从页面中接收事件的顺序,比如有两个嵌套的div,点击了内层的div,这时候是内层
小胖
2018/06/27
1.4K0
JavaScript——DOM事件高级
此方法将指定的监听器注册到eventTarger(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。
岳泽以
2022/10/26
1.9K0
JavaScript——DOM事件高级
事件处理程序
IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。
RiemannHypothesis
2022/10/31
7010
JavaScript 事件绑定
事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型)。现代事件绑定在传统绑定上提供了更强大更方便的功能。 一.传统事件绑定的问题 传统事件绑定有内联模型和脚本模型,内联模型我们不做讨论,基本很少去用。先来看一下脚本模型,脚本模型将一个函数赋值给一个事件处理函数。 var box = document.getElementById('box');//获取元素 box.onclick = function () {//元素点击触发事件 alert('Lee'); };
汤高
2018/01/11
3.5K0
《现代Javascript高级教程》深入理解事件处理和传播机制
JavaScript中的事件流是一种机制,用于描述和处理事件在DOM树中的传播过程。了解事件流的属性和工作原理对于编写高效的事件处理代码和实现复杂的交互功能至关重要。本文将详细介绍JavaScript事件流的发展流程、属性以及应用场景,并提供一些代码示例和引用资料,帮助读者深入理解并应用这一重要的前端技术。
linwu
2023/07/27
2640
JavaScript事件
JavaScript事件 对于事件来讲,首先,我们需要了解这样几个概念:事件;事件处理程序;事件类型;事件流;事件冒泡;事件捕获;事件对象;事件模拟,事件方面的性能优化(事件委托、移除事件处理程序); 事件的概念 事件:指的是文档或者浏览器窗口中发生的一些特定交互瞬间。我们可以通过监听器(或者处理程序)来预定事件,以便事件发生的时候执行相应的代码。 事件处理程序:我们用户在页面中进行的点击这个动作,鼠标移动的动作,网页页面加载完成的动作等,都可以称之为事件名称,即:click、mousemove、loa
汤高
2018/01/11
2.1K0
JavaScript事件
相关推荐
浅谈JavaScript的事件(事件对象)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验