翼度科技»论坛 编程开发 JavaScript 查看内容

JavaScript复习——04 事件

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
事件对象

事件对象是由浏览器在外面触发事件的时候创建的,这个对象封装了各种事件相关的各种信息
例如:

  • 鼠标的位置
  • 键盘的按键
浏览器创建事件对象后,会将事件对象作为响应参数传递
在DOM类型中有多种不同类型的事件对象,但是他们都一个祖先Event

  • event.clientX:获取鼠标的X轴坐标
  • event.clientY:获取鼠标的Y轴坐标
  • event.target:表示触发事件的对象
  • event.currentTarget:绑定事件的对象
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>DOM</title>
  6.       
  7.   </head>
  8.   <body>
  9.       
  10.          
  11.               
  12.          
  13.       
  14.    
  15.   </body>
  16. </html>
复制代码
事件冒泡

事件冒泡:当我们的元素上某个事件被触发(内部元素不一定要绑定事件)后,其祖先元素的相同事件也会被触发,冒泡大大的简化了我们代码的编写,但是在某些场景下,我们有时也不希望冒泡

  • event.stopPropagation():取消事件传导
  • event.preventDefault():取消事件的默认行为
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>DOM</title>
  6.       
  7.   </head>
  8.   <body>
  9.       
  10.          
  11.               
  12.          
  13.       
  14.    
  15.   </body>
  16. </html>
复制代码
冒泡为什么有利

当我们需要所有元素都有一个共有的事件时,我们如果没有冒泡就需要一个个给他们添加事件
如果我们有冒泡,就只需要给它们的共同祖先元素添加一个事件就可以,这就是冒泡的好处
因为我们自己元素点击之后,事件会向上冒泡,所以父级元素的处理器也会感知到

事件的委托

我们希望,只绑定一次事件,就可以让所有的超链接和未来新添加的都具有这些事件
思路:我们可以将事件统一绑定document,这样点击超链接之后,由于事件的冒泡会导致document的事件被触发,这样就只绑定了一次,所有的超链接都会具有这些事件
但是这也带来了一个问题,会让除了超链接外的元素也触发事件
委托:就是本该绑定给多个对象的事件,绑定给它们的共同祖先元素,这样就可以降低我们代码的复杂度
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>DOM</title>
  6.   </head>
  7.   <body>
  8.       <button type="button" id="btn">
  9.           点我一下
  10.       </button>
  11.       <ul id="list">
  12.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接1</a></li>
  13.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接2</a></li>
  14.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接3</a></li>
  15.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接4</a></li>
  16.       </ul>
  17.    
  18.   </body>
  19. </html>
复制代码
处理委托带来的问题

我们之前也说了问题的带来的问题,我们在给共有父元素绑定事件的时候,只要是子元素都有可能触发事件,那么我们如果要选择对应的子元素触发事件呢?
可以用以下的方式来解决
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>DOM</title>
  6.   </head>
  7.   <body>
  8.       <button type="button" id="btn">
  9.           点我一下
  10.       </button>
  11.       <ul id="list">
  12.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接1</a></li>
  13.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接2</a></li>
  14.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接3</a></li>
  15.           <li><a target="_blank" href="https://www.cnblogs.com/javascript:;">链接4</a></li>
  16.       </ul>
  17.    
  18.   </body>
  19. </html>
复制代码
这上面的代码必须是li才能触发事件,要不然是不能触发事件的

事件的捕获

在DOM中,事件的传播分为三个阶段

  • 捕获阶段

    • 事件的捕获指的是我们的事件从外向内传导
    • 由祖先元素向目标元素进行事件的捕获

  • 目标阶段(触发事件的对象)
  • 冒泡阶段

    • 由目标元素想祖先元素进行冒泡从内向外传导

如果我们希望在捕获阶段触发事件,那么我们就需要将addEventListener()的第三个参数设置为true
注意:我们一般不希望在捕获阶段触发事件,设置了捕获事件,冒泡就会失效

  • evnet.eventPhase:事件触发的时机

    • 0:表示没有触发事件
    • 1:是捕获阶段
    • 2:表示为目标阶段
    • 3:表示冒泡阶段

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>DOM</title>
  6.       
  7.   </head>
  8.   <body>
  9.       
  10.          
  11.                       
  12.                           
  13.                    
  14.       
  15.       
  16.   </body>
  17. </html>
复制代码

来源:https://www.cnblogs.com/trueasureyuki/p/17822779.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

上一篇: 原型污染

下一篇: Data对象

举报 回复 使用道具