探索 JavaScript 变乱机制(二):如何自界说变乱

打印 上一主题 下一主题

主题 1527|帖子 1527|积分 4581

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
媒介

在上篇文章中,我们了解了 JavaScript 的变乱机制是怎么回事:从变乱冒泡到变乱捕获,再到变乱委托。这次我们要更进一步,聊聊如何在 JavaScript 中自界说变乱。这玩意儿可是前端开发中的一把利器,学会之后,你就可以为自己的应用增长更多的互动性和灵活性。
汗青文章

探索 JavaScript 变乱机制(一)从基础概念到实战应用
什么是自界说变乱?

我们在开发过程中,常常会碰到一些场景,用原生的浏览器变乱(如点击、滚动等)并不能完全满足需求。这时我们就需要“自界说变乱”,它就像我们自己界说的一套规则,想啥时候触发就啥时候触发。
自界说变乱的基本方法

JavaScript 提供了 CustomEvent 构造函数,让我们可以轻松创建自界说变乱。下面是创建和触发自界说变乱的基本步骤:

  • 创建变乱: 使用 CustomEvent 构造函数。
  • 触发变乱: 使用元素的 dispatchEvent 方法。
  • 监听变乱: 使用 addEventListener 监听自界说变乱。
自界说变乱的创建与使用

为了让大家更直观地明白,我们来通过一个小例子演示。假设我们有一个计数器,当计数达到某个值时,我们想触发一个自界说变乱来通知体系。
第一步:创建自界说变乱

// 创建一个名为 ‘countReached’ 的自界说变乱
  1. let countReachedEvent = new CustomEvent('countReached', {
  2.     detail: { // detail 属性可以用来传递数据
  3.         message: '计数达到指定值!',
  4.         time: new Date()
  5.     }
  6. });
复制代码
第二步:监听自界说变乱

  1. // 选择要监听事件的元素,这里假设是一个按钮
  2. let button = document.getElementById('myButton');
  3. // 为按钮添加自定义事件的监听器
  4. button.addEventListener('countReached', function(event) {
  5.     console.log(event.detail.message); // 输出: 计数达到指定值!
  6.     console.log('事件触发时间:', event.detail.time);
  7. });
复制代码
第三步:触发自界说变乱

  1. // 定义一个计数器变量
  2. let count = 0;
  3. // 模拟计数器的增加
  4. function incrementCounter() {
  5.     count++;
  6.     console.log('当前计数:', count);
  7.     // 当计数达到 5 时,触发自定义事件
  8.     if (count === 5) {
  9.         button.dispatchEvent(countReachedEvent);
  10.     }
  11. }
复制代码
// 假设这个函数被某个其它变乱(比如按钮点击)调用
  1. document.getElementById('incrementButton').addEventListener('click', incrementCounter);
复制代码
完整代码
  1. <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>自界说变乱示例</title></head><body>    <button id="incrementButton">增长计数</button>    <button id="myButton">监听自界说变乱</button>        <script>        // 创建一个名为 'countReached' 的自界说变乱        let countReachedEvent = new CustomEvent('countReached', {            detail: {                message: '计数达到指定值!',                time: new Date()            }        });        // 选择要监听变乱的元素        let button = document.getElementById('myButton');        // 为按钮添加自界说变乱的监听器        button.addEventListener('countReached', function(event) {            console.log(event.detail.message);            console.log('变乱触发时间:', event.detail.time);        });        // 界说一个计数器变量        let count = 0;        // 模拟计数器的增长        function incrementCounter() {            count++;            console.log('当前计数:', count);            if (count === 5) {                button.dispatchEvent(countReachedEvent);            }        }        // 按钮点击变乱        document.getElementById('incrementButton').addEventListener('click', incrementCounter);
  2.     </script></body></html>
复制代码
在上面的例子中,我们已经看到了如何创建和使用自界说变乱。接下来,我们再扩展一些实用的技巧和高级用法,让你在现实项目中更得心应手。
高级用法:变乱传播与变乱目标

在变乱机制中,我们需要了解变乱是如何从目标元素传播(冒泡或捕获)的。自界说变乱同样可以利用这种机制。我们可以指定变乱是否冒泡以及是否可以被取消。
冒泡与取消

默认情况下,自界说变乱是不冒泡的,但我们可以通过设置选项来改变这一行为。
  1. let bubblingEvent = new CustomEvent('bubblingEvent', {
  2.     bubbles: true, // 允许事件冒泡
  3.     cancelable: true, // 允许事件取消
  4.     detail: {
  5.         message: '这个事件会冒泡!',
  6.         time: new Date()
  7.     }
  8. });
复制代码
接着,我们可以注册多个变乱监听器,分别在差异的 DOM 层次上监听这个变乱。
  1. <div id="parent">
  2.     <div id="child">
  3.         <button id="bubblingButton">触发冒泡事件</button>
  4.     </div>
  5. </div>
  6. <script>
  7.     // 获取 DOM 元素
  8.     let parent = document.getElementById('parent');
  9.     let child = document.getElementById('child');
  10.     let bubblingButton = document.getElementById('bubblingButton');
  11.     // 为父元素添加事件监听器
  12.     parent.addEventListener('bubblingEvent', function(event) {
  13.         console.log('父元素捕获到事件:', event.detail.message);
  14.     });
  15.     // 为子元素添加事件监听器
  16.     child.addEventListener('bubblingEvent', function(event) {
  17.         console.log('子元素捕获到事件:', event.detail.message);
  18.     });
  19.     // 触发事件
  20.     bubblingButton.addEventListener('click', function() {
  21.         bubblingButton.dispatchEvent(bubblingEvent);
  22.     });
  23. </script>
复制代码
在这个例子中,当我们点击按钮时,自界说变乱会从按钮冒泡到它的父元素。父元素和子元素的变乱监听器都会被触发,这就展示了变乱冒泡的强大之处。
取消变乱

有时候,我们可能需要在变乱传播的过程中取消变乱。这个时候,我们可以利用 event.preventDefault() 和 event.stopPropagation() 方法。下面是一个例子:
  1. // 创建可以取消的事件
  2. let cancelableEvent = new CustomEvent('cancelableEvent', {
  3.     bubbles: true,
  4.     cancelable: true,
  5.     detail: {
  6.         message: '你可以取消这个事件',
  7.         time: new Date()
  8.     }
  9. });
  10. // 父元素
  11. parent.addEventListener('cancelableEvent', function(event) {
  12.     if (!event.defaultPrevented) {
  13.         console.log('父元素捕获到事件:', event.detail.message);
  14.     }
  15. });
  16. // 子元素
  17. child.addEventListener('cancelableEvent', function(event) {
  18.     // 取消事件
  19.     event.preventDefault();
  20.     console.log('子元素取消了事件:', event.detail.message);
  21. });
  22. // 按钮点击触发事件
  23. bubblingButton.addEventListener('click', function() {
  24.     bubblingButton.dispatchEvent(cancelableEvent);
  25. });
复制代码
在这个例子中,子元素的变乱监听器会取消变乱的默认行为,所以父元素的变乱监听器不会吸收到这个变乱。
应用场景

表单验证

在复杂的表单验证中,我们常常需要在某个字段验证成功或失败时通知其他部分。自界说变乱可以很方便地实现这一点。
  1. let form = document.getElementById('myForm');
  2. let input = document.getElementById('myInput');
复制代码
// 创建自界说变乱
  1. let validationEvent = new CustomEvent('fieldValidated', {
  2.     detail: {
  3.         field: 'myInput',
  4.         valid: false,
  5.         message: '输入不合法'
  6.     }
  7. });
复制代码
// 表单监听验证变乱
  1. form.addEventListener('fieldValidated', function(event) {
  2.     if (!event.detail.valid) {
  3.         console.log('验证失败:', event.detail.message);
  4.     } else {
  5.         console.log('验证成功');
  6.     }
  7. });
复制代码
// 模拟验证过程
  1. input.addEventListener('blur', function() {
  2.     if (input.value === '') {
  3.         input.dispatchEvent(validationEvent);
  4.     }
  5. });
复制代码
AJAX 请求完成通知

在前端开发中,AJAX 请求完成后,需要更新页面的其他部分,这时自界说变乱就变得非常有效。
  1. let ajaxEvent = new CustomEvent('ajaxComplete', {
  2.     detail: {
  3.         message: 'AJAX 请求已完成',
  4.         data: { /* 返回的数据 */ }
  5.     }
  6. });
复制代码
// 监听 AJAX 完成变乱
  1. document.addEventListener('ajaxComplete', function(event) {
  2.     console.log(event.detail.message);
  3.     // 更新页面部分
  4.     // updatePage(event.detail.data);
  5. });
复制代码
// 模拟 AJAX 请求
  1. function mockAjaxRequest() {
  2.     setTimeout(function() {
  3.         document.dispatchEvent(ajaxEvent);
  4.     }, 1000);
  5. }
复制代码
// 模拟按钮点击发送 AJAX 请求
  1. let ajaxButton = document.getElementById('ajaxButton');
  2. ajaxButton.addEventListener('click', mockAjaxRequest);
复制代码
总结

自界说变乱在前端开发中提供了极大的灵活性,可以帮助我们简化代码逻辑,提升代码的可维护性。通过本文的学习,希望你能够更好地明白和使用自界说变乱,为你的项目增添更多的互动和动态效果。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表