转 js自定义事件——Event和CustomEvent

之前在学习自定义事件时,在MDN的Event.initEvent()页面顶端有写:该特性已从Web标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。

  作为替代,我们可以通过创建Event对象和CustomEvent对象来创建自定义对象。先从Event()对象开始。

  

Event()——Event对象的构造函数

  

  咱们可以看着下面这个例子去了解如何使用Event()创建一个自定义对象:

复制代码
 1 <script type="text/javascript">  
 2     /* 创建一个事件对象,名字为newEvent,类型为build */
 3     var newEvent = new Event('build', { bubbles:true,cancelable:true,composed:true });
 4         
 5     /* 给这个事件对象创建一个属性并赋值 */
 6     newEvent.name = "新的事件!";
 7     
 8     /* 将自定义事件绑定在document对象上,这里绑定的事件要和我们创建的事件类型相同,不然无法触发 */
 9     document.addEventListener("build",function(){
10         alert("你触发了自定义事件!" + newEvent.name);
11     },false)
12         
13     /* 触发自定义事件 */
14     document.dispatchEvent(newEvent);  
15 </script>    
复制代码

  启动文档的时候因为"document.dispatchEvent(newEvent)"的关系,会先触发一次事件:

  

  之后你每执行一次"document.dispatchEvent(newEvent)"都会触发这个事件:

  

  好,接下来我们看看Event()这个方法的语法把(disapthEvent()在我的另一个笔记里有介绍,这里就不再次介绍了):

  event = new Event(typeArg, eventInit);

  typeArg:指定事件类型,传递一个字符串。这里的事件类型指的是像点击事件(click)、提交事件(submit)、加载事件(load)等等。

  eventInit:可选,传递EventInit类型的字典。实际上这个EventInit类型的字典也就是我们使用InitEvent()时需要传递的参数,以键值对的形式传递,不过它可以多选一个参数:

    bubbles:事件是否支持冒泡,传递一个boolean类型的参数,默认值为false。

    cancelable:是否可取消事件的默认行为,传递一个boolean类型的参数,默认值为false。

    composed:事件是否会触发shadow DOM(阴影DOM)根节点之外的事件监听器,传递一个boolean类型的参数,默认值为false。(关于shadow DOM可以去看ChokCoco前辈的这篇文章,这里就不详说了,可能我会根据自己的理解也写一个关于shadow DOM的笔记)这个参数是InitEvent()中没有的新参数。

  

  用法其实和使用createEvent()结合initEvent()差不多,不过Event()不支持IE浏览器,所以怎么使用还是得看咱们。

  

CustomEvent()——CustomEvent对象的构造函数

 

  CustomEvent()可以像Event()那样赋值,但它可以在Web Workers中使用(与主线程分离的另一个线程),可以传递跟事件关联的相关值(detail)。(但我贼Event()中没看到又说可不可以使用Web Workers,写完这个去查查)

  我们先通过下面的例子了解一下如何使用CustomEvent()去创建一个事件对象(这里先不使用事件相关值detail):

复制代码
 1 <script type="text/javascript">  
 2     /* 创建一个事件对象,名字为newEvent,类型为build */
 3     var newEvent = new CustomEvent('build', { bubbles:true,cancelable:true,composed:true });
 4     
 5     /* 给这个事件对象创建一个属性并赋值,这里绑定的事件要和我们创建的事件类型相同,不然无法触发 */
 6     newEvent.name = "新的事件!";
 7     
 8     /* 将自定义事件绑定在document对象上 */
 9     document.addEventListener("build",function(){
10         alert("你触发了使用CustomEvent创建的自定义事件!" + newEvent.name);
11     },false)
12         
13     /* 触发自定义事件 */
14     document.dispatchEvent(newEvent);  
15 </script>  
复制代码

  启动文档的时候因为"document.dispatchEvent(newEvent)"的关系,会先触发一次事件:

 

  之后你每执行一次"document.dispatchEvent(newEvent)"都会触发这个事件:

  

  然后我们来看CustomEvent()的语法:

  event = new CustomEvent(typeArg, customEventInit);

  typeArg:指定事件类型,传递一个字符串。这里的事件类型指的是像点击事件(click)、提交事件(submit)、加载事件(load)等等。

  customEventInit:可选。传递一个CustomEventInit字典。实际上这个字典就是我们使用initCustomEvent()时需要的参数,这个参数就是事件相关值(detail):

    detail:可选,默认值为null,类型为any(也就是说可以传递任意类型的参数)。这个值就是和事件相关联的值。

  在展示使用detail作为第二个参数的例子前,要先注意一件事:CustomEventInit字典也可以接受EventInit字典的参数,就像一开始的例子一样,我传递了EventInit字典的bubbles、cancelable、composed。

  下面将展示使用detail参数的例子,使用到detail的部分我会加粗处理(为了看着方便,这回就不传递EventInit字典中的参数了):

复制代码
 1 <script type="text/javascript">  
 2     /* 创建一个事件对象,名字为newEvent,类型为build */
 3     var newEvent = new CustomEvent('build',{ 
 4         detail: {
 5             dog:"wo",cat:"mio"
 6         }
 7     });
 8     
 9     /* 将自定义事件绑定在document对象上 */
10     document.addEventListener("build",function(){
11         alert(" event.detail.dog:" + event.detail.dog
12          + "\n event.detail.cat:" + event.detail.cat );
13     },false)
14     
15     /* 触发自定义事件 */
16     document.dispatchEvent(newEvent);  
17 </script>  
复制代码

  启动文档的时候因为"document.dispatchEvent(newEvent)"的关系,会先触发一次事件:

  

  之后你每执行一次"document.dispatchEvent(newEvent)"都会触发这个事件:

  

  


参考资料:

MDN - 创建和触发Event:https://developer.mozilla.org/zh-CN/docs/Web/Guide/Events/Creating_and_triggering_events

MDN - Event():https://developer.mozilla.org/zh-CN/docs/Web/API/Event/Event

MDN - CustomEvent():https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent/CustomEvent

MDN - CustomEvent.initCustomEvent():https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/initCustomEvent

MDN - CustomEvent.detail:https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent/detail

 

笔记只是我个人的理解,可能不是正确答案,如果有dalao发现我哪里说错了,留言告诉我,大家一起学习一起进步嘛(o′▽`o)ノ

转载于:https://www.cnblogs.com/xiaozhang666/p/11582740.html

### JavaScript 事件监听的使用方法 #### 基本概念 `addEventListener` 是 JavaScript 中的核心 API,用于为 DOM 元素绑定事件监听器。它允许开发者指定当某个事件发生时应执行的操作。 其基本语法如下: ```javascript element.addEventListener(eventType, listener, options); ``` - `eventType`: 需要监听的事件类型(如 `click`, `keydown` 等)[^1]。 - `listener`: 当事件被触发时调用的回调函数。 - `options`: 可选参数,通常是一个对象,用于控制事件行为(如捕获阶段、一次性监听等)。 --- #### 示例代码 以下是几个常见的 `addEventListener` 的使用场景: ##### 场景一:简单的按钮点击事件 下面的例子展示了如何为一个按钮添加点击事件监听器。 ```html <button id="myButton">Click Me</button> <script> const button = document.getElementById('myButton'); button.addEventListener('click', function() { alert('Button was clicked!'); }); </script> ``` 此代码会在用户单击按钮时弹出提示框。 --- ##### 场景二:键盘按下事件 以下示例演示了如何检测用户的按键输入。 ```html <input type="text" id="inputField"> <script> const inputField = document.getElementById('inputField'); inputField.addEventListener('keydown', function(event) { console.log(`Key pressed: ${event.key}`); }); </script> ``` 这段代码会记录每次按下的键值并打印到控制台。 --- ##### 场景三:事件选项——捕获阶段 vs 冒泡阶段 默认情况下,事件监听发生在冒泡阶段。如果希望在捕获阶段处理事件,则可以通过设置第三个参数实现。 ```javascript const divElement = document.querySelector('#outerDiv'); // 捕获阶段 divElement.addEventListener('click', function() { console.log('Captured phase'); }, true); // 冒泡阶段 divElement.addEventListener('click', function() { console.log('Bubbling phase'); }); ``` 在此例子中,第一个监听器将在捕获阶段运行,而第二个则在冒泡阶段运行。 --- #### 性能优化 —— 事件委托 对于动态生成的内容或者大量相似元素的情况,推荐使用 **事件委托** 技术。该技术通过将单一监听器附加到父级节点上来管理多个子节点上的事件[^3]。 ##### 实现方式 假设有一个无序列表 `<ul>` 若干 `<li>` 子项,我们希望通过一次性的监听来响应所有 `<li>` 被点击的行为。 ```html <ul id="list"> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> <script> const list = document.getElementById('list'); list.addEventListener('click', function(event) { if (event.target.tagName === 'LI') { console.log('Clicked List Item:', event.target.textContent); } }); </script> ``` 上述代码仅需在一个地方注册监听即可完成整个列表的功能支持。 --- #### 创建自定义事件 除了内置的标准事件外,还可以创建自己的事件并通过派发机制触发它们。 ```javascript // 定义一个新的事件 const customEvent = new CustomEvent('customAction', { detail: { message: 'This is a custom event!' } }); // 绑定监听器 document.body.addEventListener('customAction', function(event) { console.log('Custom Event Triggered!', event.detail.message); }); // 手动触发事件 document.body.dispatchEvent(customEvent); ``` 这里展示了一个完整的流程,从定义到分发再到接收自定义事件。 --- ### 注意事项 1. 如果同一个元素绑定了多次相同的事件类型但不同的处理器,这些处理器将以注册顺序依次被执行。 2. 若要移除已有的监听器,请确保传入完全一致的参数给 `removeEventListener()` 方法。 3. 对于旧版浏览器兼容性问题,可能需要考虑替代方案(例如直接赋值属性形式:`onclick=...`),不过现代开发建议优先采用标准做法即 `addEventListener`. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值