我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是JavaScript事件处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是JavaScript事件处理

这篇文章主要介绍“什么是JavaScript事件处理”,在日常操作中,相信很多人在什么是JavaScript事件处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是JavaScript事件处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一.事件传播机制

客户端 JavaScript程序(就是浏览器啦)采用了异步事件驱动编程模型。当文档、浏览器、元素或与之相关的对象发生某些有趣的事情时,Web浏览器就会产 生事件(event)。如果JavaScript应用程序关注特定类型的事件,那么它可以注册当这类事件发生时要调用的一个或多个函数。当然了,这种风格 并非Web编程独有,所有使用图形用户界面的应用程序都采用了它。

既然要详解事件处理,那我们先从几个基础概念说起吧:

①事件类型(event type):是一个用来说明发生什么类型事件的字符串。例如,“mousemove”表示用户移动鼠标,“keydown”表示键盘上某个键被按下。事件类型只是一个字符串,有时候又称之为事件名字(event name);

②事件目标(event target):是发生事件或与之相关的对象。Window、Document和Element对象是最常见的事件目标。当然,AJAX中的XMLHttpRequest对象也是一个事件目标;

③事件处理程序(event handler):是处理或响应事件的函数,它也叫事件监听程序(event listener)。应用程序通过指明事件类型和事件目标,在Web浏览器中注册它们的事件处理函数。

④事 件对象(event  object):是与特定事件相关且包含有关该事件详细信息的对象。事件对象作为参数传递给事件处理函数(但是在IE8以及其之前版本中,全局变量 event才是事件对象)。事件对象都有用来指定事件类型(event type)的type属性和指定事件目标(event  target)的target属性(但是在IE8以及其之前版本中,用的是class="lazy" data-srcElement而非target)。当然,不同类型的事件还会为其相关事 件对象定义一些其他的独有属性。例如,鼠标事件的相关对象会包含鼠标指针的坐标,而键盘事件的相关对象会包含按下的键和辅助键的详细信息。

以上说完 了四个基本概念。那么问题来了——如果在一个web页面上用鼠标点击一个元素a的某一子元素b时,应该先执行子元素b注册的事件处理程序还是先执行元素a 注册的事件处理程序呢(假设元素a和它的子元素b都有注册事件处理程序)?身为读者的你是否想过这个问题呢?

这个问题就涉及到浏览器中的事件传播(event propagation)机制。相信大家都听说过事件冒泡(event bubble)和事件捕获(event capturing)吧!没错,它们就是浏览器中的事件传播机制。无图无真相,没有配图?那怎么阔以:

什么是JavaScript事件处理

看了图之 后相信你已经大概理解了浏览器中的事件传播机制了:当一个事件发生时,它会先从浏览器***对象Window一路向下传递,一直传递到触发这个事件的那个元 素,这也就是事件捕获过程。然而,一切并没有结束,事件又从这个元素一路向上传递到Window对象,这也就是事件冒泡过程(但是在IE8以及其之前版本 中,事件模型并未定义捕获过程,只有冒泡过程)。

所以,关于上面的问题,还得看元素a注册的事件处理程序是在捕获过程还是在冒泡过程了。那么到底什么是在捕获过程注册事件处理程序,在冒泡过程注册事件处理程序又是怎么做的呢?这就得好好说说几种注册事件处理程序的方式了:

1. 设置HTML标签属性为事件处理程序

文档元素的事件处理程序属性,其名字由“on”后面跟着事件名组成,例如:onclick、onmouseover。当然了,这种形式只能为DOM元素注册事件处理程序。实例:

<!DOCTYPE HTML> <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>     <title>test</title>     <style type="text/css">         #div1{width: 300px; height: 300px; background: red; overflow:hidden;}         #div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;}         #div3{margin:50px auto; width: 100px; height: 100px; background: blue;}     </style> </head> <body>     <div id="div1" onClick="console.log('div1');">div1         <div id="div2" oNClick="console.log('div2');">div2             <div id="div3" onclick="console.log('div3');" onclick="console.log('div3333');">div3             </div>         </div>      </div> <script type="text/javascript"> </script> </body> </html>

结果(鼠标点击div3区域后):

什么是JavaScript事件处理

从结果中可以看出:

①因为HTML里面不区分大小写,所以这里事件处理程序属性名大写、小写、大小混写均可,属性值就是相应事件处理程序的JavaScript代码;

②若给同一元素写多个onclick事件处理属性,浏览器只执行***个onclick里面的代码,后面的会被忽略;

③这种形式是在事件冒泡过程中注册事件处理程序的;

2.设置JavaScript对象属性为事件处理程序

可以通过设置某一事件目标的事件处理程序属性来为其注册相应的事件处理程序。事件处理程序属性名字由“on”后面跟着事件名组成,例如:onclick、onmouseover。实例:

<!DOCTYPE HTML> <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>     <title>test</title>     <style type="text/css">         #div1{width: 300px; height: 300px; background: red; overflow:hidden;}         #div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;}         #div3{margin:50px auto; width: 100px; height: 100px; background: blue;}     </style> </head> <body>     <div id="div1">div1         <div id="div2">div2             <div id="div3">div3             </div>         </div>     </div> <script type="text/javascript">     var div1 = document.getElementById('div1');     var div2 = document.getElementById('div2');     var div3 = document.getElementById('div3'); div1.onclick = function(){ console.log('div1'); }; div2.onclick = function(){ console.log('div2'); }; div3.onclick = function(){ console.log('div3'); }; div1.onclick = function(){ console.log('div11111'); };  div1.onClick = function(){ console.log('DIV11111'); };  </script> </body> </html>

结果(鼠标点击div3区域后):

什么是JavaScript事件处理

 从结果中可以看出:

①因为JavaScript是严格区分大小写的,所以,这种形式下属性名只能按规定小写;

②若给同一元素对象写多个onclick事件处理属性,后面写的会覆盖前面的(ps:这就是在修改一个对象属性的值,属性的值是***确定的);

③这种形式也是在事件冒泡过程中注册事件处理程序的;

3.addEventListener()

前两种方式出现在Web初期,众多浏览器都有实现。而addEventListener()方法是标准事件模型中定义的。任何能成为事件目标的对象&mdash;&mdash; 这些对象包括Window对象、Document对象和所有文档元素等&mdash;&mdash;都定义了一个名叫addEventListener()的方法,使用这个方法可 以为事件目标注册事件处理程序。addEventListener()接受三个参数:***个参数是要注册处理程序的事件类型,其值是字符串,但并不包括前 缀“on”;第二个参数是指当指定类型的事件发生时应该调用的函数;第三个参数是布尔值,其可以忽略(某些旧的浏览器上不能忽略这个参数),默认值为 false。这种情况是在事件冒泡过程中注册事件处理程序。当其为true时,就是在事件捕获过程中注册事件处理程序。实例:

  1. <!DOCTYPE HTML> 

  2. <html> 

  3. <head> 

  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

  5. <title>test</title> 

  6. <style type="text/css"> 

  7. #div1{width: 300px; height: 300px; background: red; overflow:hidden;} 

  8. #div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;} 

  9. #div3{margin:50px auto; width: 100px; height: 100px; background: blue;} 

  10. </style> 

  11. </head> 

  12. <body> 

  13. <div id="div1">div1 

  14. <div id="div2">div2 

  15. <div id="div3">div3 

  16. </div> 

  17. </div> 

  18. </div> 

  19. <script type="text/javascript"> 

  20. var div1 = document.getElementById('div1'); 

  21. var div2 = document.getElementById('div2'); 

  22. var div3 = document.getElementById('div3'); 

  23. div1.addEventListener('click', function(){ console.log('div1-bubble'); }, false); 

  24. div2.addEventListener('click', function(){ console.log('div2-bubble'); }, false); 

  25. div3.addEventListener('click', function(){ console.log('div3-bubble'); }, false); 

  26. div3.addEventListener('click', function(){ console.log('div3-bubble222'); }, false); 

  27. div1.addEventListener('click', function(){ console.log('div1-capturing'); }, true); 

  28. div2.addEventListener('click', function(){ console.log('div2-capturing'); }, true); 

  29. div3.addEventListener('click', function(){ console.log('div3-capturing'); }, true); 

  30. </script> 

  31. </body> 

  32. </html>

结果(鼠标点击div3区域后):

什么是JavaScript事件处理

从结果中可以看出:

①addEventListener()第三个参数的作用正如上面所说;

②通过addEventListener()方法给同一对象注册多个同类型的事件,并不会发生忽略或覆盖,而是会按顺序依次执行;

相对addEventListener()的是removeEventListener()方法,它同样有三个参数,前两个参数自然跟 addEventListener()的意义一样,而第三个参数也只需跟相应的addEventListener()的第三个参数保持一致即可,同样可以 省略,默认值为false。它表示从对象中删除某个事件处理函数。实例:

div1.addEventListener('click', div1BubbleFun, false); div1.removeEventListener('click', div1BubbleFun, false); function div1BubbleFun(){     console.log('div1-bubble'); }

4.attachEvent()

   但是,IE8以及其之前版本的浏览器并不支持addEventListener()和removeEventListener()。相应的,IE定义了 类似的方法attachEvent()和detachEvent()。因为IE8以及其之前版本浏览器也不支持事件捕获,所以attachEvent() 并不能注册捕获过程中的事件处理函数,因此attachEvent()和detachEvent()要求只有两个参数:事件类型和事件处理函数。而且,它 们的***个参数使用了带“on”前缀的事件处理程序属性名。实例:

var div1 = document.getElementById('div1'); div1.attachEvent('onclick', div1BubbleFun); function div1BubbleFun(){ console.log('div1-bubble'); }

相应的,从对象上删除事件处理程序函数使用detachEvent()。例如:

div1.detachEvent('onclick', div1BubbleFun);

到此为止,我们已经说了浏览器中事件传播机制以及各种注册事件处理程序的方法。下面我们就再说说事件处理程序调用时的一些问题吧!

二.事件处理程序的调用

1.事件处理程序的参数:正 如前面所说,通常事件对象作为参数传递给事件处理函数,但IE8以及其之前版本的浏览器中全局变量event才是事件对象。所以,我们在写相关代码时应该 注意兼容性问题。实例(给页面上id为div1的元素添加点击事件,当点击该元素时在控制台输出事件类型和被点击元素本身):

<!DOCTYPE HTML> <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>     <title>test</title>     <style type="text/css">         #div1{width: 300px; height: 300px; background: red; overflow: hidden;}     </style> </head> <body> <div id="div1">div1</div> <script type="text/javascript"> var div1 = document.getElementById('div1'); if(div1.addEventListener){ div1.addEventListener('click', div1Fun, false); }else if(div1.attachEvent){ div1.attachEvent('onclick', div1Fun); } function div1Fun(event){ event = event || window.event; var target = event.target || event.class="lazy" data-srcElement;             console.log(event.type);             console.log(target);         }     </script> </body> </html>

2.事件处理程序的运行环境:关于事件处理程序的运行环境,也就是在事件处理程序中调用上下文(this值)的指向问题,可以看下面四个实例。
实例一:

  1. <!DOCTYPE HTML> 

  2. <html> 

  3. <head> 

  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

  5.     <title>test</title> 

  6.     <style type="text/css"> 

  7.         #div1{width: 300px; height: 300px; background: red; overflow: hidden;} 

  8.     </style> 

  9. </head> 

  10. <body> 

  11.     <div id="div1" onclick="console.log('html:'); console.log(this);">div1</div> 

  12.     <script type="text/javascript"> 

  13.     </script> 

  14. </body> 

  15. </html>

结果一:

什么是JavaScript事件处理

从结果可以看出:

①***种方法事件处理程序中this指向这个元素本身;

实例二:

<!DOCTYPE HTML> <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>     <title>test</title>     <style type="text/css">         #div1{width: 300px; height: 300px; background: red; overflow: hidden;}     </style> </head> <body> <div id="div1" onclick="console.log('html:'); console.log(this);">div1</div> <script type="text/javascript"> var div1 = document.getElementById('div1'); div1.onclick = function(){ console.log('div1.onclick:'); console.log(this);         };     </script> </body> </html>

结果二:

什么是JavaScript事件处理

从结果可以看出:

①第二种方法事件处理程序中this也指向这个元素本身;

②存在第二种方法时,它会覆盖***种方法注册的事件处理程序;

实例三:

<!DOCTYPE HTML> <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>     <title>test</title>     <style type="text/css">         #div1{width: 300px; height: 300px; background: red; overflow: hidden;}     </style> </head> <body> <div id="div1" onclick="console.log('html:'); console.log(this);">div1</div> <script type="text/javascript"> var div1 = document.getElementById('div1'); div1.onclick = function(){ console.log('div1.onclick:'); console.log(this); }; div1.addEventListener('click', function(){ console.log('div1.addEventListener:'); console.log(this); }, false);     </script> </body> </html>

结果三:

什么是JavaScript事件处理

从结果可以看出:

①第三种方法事件处理程序中this也指向这个元素本身;

②第三种方法并不会覆盖***种或第二种方法注册的事件处理程序;

实例四:

  1. <!DOCTYPE HTML> 

  2. <html> 

  3. <head> 

  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

  5.     <title>test</title> 

  6.     <style type="text/css"> 

  7.         #div1{width: 300px; height: 300px; background: red; overflow: hidden;} 

  8.     </style> </head> <body> <div id="div1" onclick="console.log('html:'); console.log(this);">div1</div> <script type="text/javascript"> var div1 = document.getElementById('div1'); div1.onclick = function(){ console.log('div1.onclick:'); console.log(this); }; div1.attachEvent('onclick', function(){ console.log('div1.attachEvent:'); console.log(this === window); 

  9.         }); 

  10.         

  11.     </script> 

  12. </body> 

  13. </html>

结果四:

什么是JavaScript事件处理

从结果可以看出:

①第四种方法事件处理程序中this指向全局对象Window;

②第四种方法也不会覆盖***种或第二种方法注册的事件处理程序;

3.事件处理程序的调用顺序:多个事件处理程序调用规则如下:

①通过HTML属性注册的处理程序和通过设置对象属性的处理程序一直优先调用;

②使用addEventListener()注册的处理程序按照它们的注册顺序依次调用;

③使用attachEvent()注册的处理程序可能按照任何顺序调用,所以代码不应该依赖于调用顺序;

4.事件取消:

①取消事 件的浏览器默认操作(比如点击超链接元素会自动发生页面跳转的默认操作):如果使用前两种方法注册事件处理程序,可以在处理程序中添加返回值false来 取消事件的浏览器默认操作。在支持addEventListener()的浏览器中,也可以通过调用事件对象的preventDefault()方法取消 事件的默认操作。至于IE8及其之前的浏览器可以通过设置事件对象的returnValue属性为false来取消事件的默认操作。参考代码:

function cancelHandler(event){     var event = event || window.event;     if(event.preventDefault){         event.preventDefault();     }     if(event.returnValue){         event.returnValue = false;     }     return false; }

②取消事 件传播:在支持addEventListener()的浏览器中,可以调用事件对象的一个stopPropagation()方法阻止事件的继续传播,它 能工作在事件传播期间的任何阶段(捕获期阶段、事件目标本身、冒泡阶段);但是在IE8以及其之前版本的浏览器中并不支持 stopPropagation()方法,而且这些浏览器也不支持事件传播的捕获阶段,相应的,IE事件对象有一个cancelBubble属性,设置这 个属性为true能阻止事件进一步传播(即阻止其冒泡)。参考代码(阻止发生在div3区域的点击事件冒泡到div2和div1):

  1. <!DOCTYPE HTML> 

  2. <html> 

  3. <head> 

  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

  5.     <title>test</title> 

  6.     <style type="text/css"> 

  7.         #div1{width: 300px; height: 300px; background: red; overflow:hidden;} 

  8.         #div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;} 

  9.         #div3{margin:50px auto; width: 100px; height: 100px; background: blue;} 

  10.     </style> </head> <body> <div id="div1">div1 <div id="div2">div2 <div id="div3">div3 </div> </div> </div> <script type="text/javascript"> var div1 = document.getElementById('div1'); var div2 = document.getElementById('div2'); var div3 = document.getElementById('div3');  div1.onclick = function(){ console.log('div1');  };  div2.onclick = function(){ console.log('div2');  };    div3.onclick = function(event){ stopEventPropagation(event); console.log('div3');  }; function stopEventPropagation(event){ var event = event || window.event; if(event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble = true; 

  11.             } 

  12.         } 

  13.     </script> 

  14. </body> 

  15. </html>

到此,关于“什么是JavaScript事件处理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是JavaScript事件处理

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

下载Word文档

猜你喜欢

javascript事件是什么

这篇文章将为大家详细讲解有关javascript事件是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为J
2023-06-15

JavaScript事件委托原理是什么

JavaScript事件委托原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是事件委托事件委托也称为事件代理。就是利用事件冒泡,把子元素的事件都绑定到父元素
2023-06-21

javaScript事件源是什么

今天就跟大家聊聊有关javaScript事件源是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在事件中,当前操作的那个元素就是事件源,比如网页元素中input有onclick事件
2023-06-15

JavaScript事件循环的原理是什么

今天小编给大家分享一下JavaScript事件循环的原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。理解 JavaS
2023-07-04

JavaScript 中触摸事件的处理方式是怎样的?(JavaScript事件处理触摸事件怎样)

在JavaScript开发中,触摸事件的处理是一个重要的方面,尤其在移动设备应用开发中。触摸事件允许开发者与用户的触摸操作进行交互,从而提供更丰富的用户体验。一、触摸事件的类型在JavaScript中,触摸事件主要包括以
JavaScript 中触摸事件的处理方式是怎样的?(JavaScript事件处理触摸事件怎样)
JavaScript2024-12-16

android事件处理机制是什么

Android事件处理机制指的是Android系统中对用户输入事件以及其他系统事件的处理方式。Android系统中的事件处理机制主要包括以下几个部分:1. 事件触发:Android系统通过底层硬件驱动来获取用户输入事件,包括触摸事件、按键事
2023-08-11

android事件处理流程是什么

Android事件处理流程如下:1. 用户触发事件:用户在Android设备上进行了某种操作,如点击屏幕、滑动、按下按键等。2. 事件分发:Android系统接收到用户触发的事件,并将其分发给当前活动的窗口,即前台Activity。3. 窗
2023-09-13

java事件处理步骤是什么

什么是事件?用户对组件的一个操作,称之为一个事件。事件源:能够产生事件的GUI组件对象。事件处理方法:能够接受,解析和处理事件类对象,实现与用户交互功能的方法。 事件监听器:可以处理事件的一个类。处理事件步骤:假设事件为XXXX1、向事件源注册某种事件的事件监
java事件处理步骤是什么
2015-07-22

什么是javascript事件委托

本篇文章为大家展示了什么是javascript事件委托,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在javascript中,事件委托就是利用冒泡的原理,将事件加到父元素或祖先元素上,触发执行效果。
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录