当前位置: 首页 > news >正文

工商登记网站/百度网盘app

工商登记网站,百度网盘app,建设厅考试成绩查询,wordpress 主题 轮播在前端开发世界中,JavaScript 和 HTML 之间往往通过 事件 来实现交互。其中多数为内置事件,本文主要介绍 JS自定义事件概念和实现方式,并结合案例详细分析自定义事件的原理、功能、应用及注意事项。 一、什么是自定义事件 在日常开发中&#…

在前端开发世界中,JavaScript 和 HTML 之间往往通过 事件 来实现交互。其中多数为内置事件,本文主要介绍 JS自定义事件概念和实现方式,并结合案例详细分析自定义事件的原理、功能、应用及注意事项。
一、什么是自定义事件
在日常开发中,我们习惯监听页面许多事件,诸如:点击事件( click )、鼠标移动事件( mousemove )、元素失去焦点事件( blur )等等。
事件本质是一种通信方式,是一种消息,只有在多对象多模块时,才有可能需要使用事件进行通信。在多模块化开发时,可以使用自定义事件进行模块间通信。
当某些基础事件无法满足我们业务,就可以尝试 自定义事件来解决。
二、实现方式介绍
目前实现自定义事件的两种主要方式是 JS 原生的 Event() 构造函数和 CustomEvent() 构造函数来创建。
1. Event()
Event() 构造函数, 创建一个新的事件对象 Event。
1.1 语法

let myEvent = new Event(typeArg, eventInit);

1.2 参数

typeArg : DOMString 类型,表示创建事件的名称;eventInit :可选配置项,包括:

5e07a544c72846167d68d3d9d2e6fde3.png

1.3 演示示例

// 创建一个支持冒泡且不能被取消的 pingan 事件
let myEvent = new Event("pingan", {"bubbles":true, "cancelable":false});
document.dispatchEvent(myEvent);// 事件可以在任何元素触发,不仅仅是document
testDOM.dispatchEvent(myEvent);

1.4 兼容性

93c9f4e039c6825663de25aa5e5305a4.png

2. CustomEvent()

CustomEvent() 构造函数, 创建一个新的事件对象 CustomEvent

2.1 语法

let myEvent = new CustomEvent(typeArg, eventInit);

2.2 参数

typeArgDOMString 类型,表示创建事件的名称;eventInit :可选配置项,包括:

902a83a013b8ce55d8ba1eded9113ca3.png

2.3 演示示例

// 创建事件
let myEvent = new CustomEvent("pingan", {detail: { name: "wangpingan" }
});// 添加适当的事件监听器
window.addEventListener("pingan", e => {alert(`pingan事件触发,是 ${e.detail.name} 触发。`);
});
document.getElementById("leo2").addEventListener("click", function () {// 派发事件window.dispatchEvent(pingan2Event);}
)

4a4c1dae1486e0dc598643b810015d10.png

我们也可以给自定义事件添加属性:

myEvent.age = 18;

2.4 兼容性

3145d75b0d46fbec661298536e06ce97.png

2.5 IE8 兼容

分发事件时,需要使用 dispatchEvent 事件触发,它在 IE8 及以下版本中需要进行使用 fireEvent 方法兼容:

if(window.dispatchEvent) {  window.dispatchEvent(myEvent);
} else {window.fireEvent(myEvent);
}

3. Event() 与 CustomEvent() 区别


从两者支持的参数中,可以看出:Event() 适合创建简单的自定义事件,而 CustomEvent() 支持参数传递的自定义事件,它支持 detail 参数,作为事件中需要被传递的数据,并在 EventListener 获取。注意:
当一个事件触发时,若相应的元素及其上级元素没有进行事件监听,则不会有回调操作执行。
当需要对于子元素进行监听,可以在其父元素进行事件托管,让事件在事件冒泡阶段被监听器捕获并执行。此时可以使用 event.target 获取到具体触发事件的元素。


三、使用场景

事件本质是一种消息,事件模式本质上是观察者模式的实现,即能用观察者模式的地方,自然也能用事件模式
1.场景介绍
比如这两种场景:

  • 场景1:单个目标对象发生改变,需要通知多个观察者一同改变。

如:当微博列表中点击“关注”,此时会同时发生很多事:推荐更多类似微博,个人关注数增加...

cfa95a61160b4f480844210d90706a4f.png
  • 场景2:解耦多模块开协作。

如:小王负责A模块开发,小陈负责B模块开发,模块B需要模块A正常运行之后才能执行。
2. 代码实现
2.1 场景1实现场景1:单个目标对象发生改变,需要通知多个观察者一同改变。
本例子模拟三个页面进行演示:
1.微博列表页(Weibo.js)
2.粉丝列表页(User.js)
3.微博首页(Home.js)
在**微博列表页(Weibo.js)**中,我们导入其他两个页面,并且监听【关注微博】按钮的点击事件,在回调事件中,创建一个自定义事件 focusUser,并在 document 上使用 dispatchEvent 方法派发自定义事件。

// Weibo.js
import UserModule from "./User.js";
import HomeModule from "./Home.js";
const eventButton = document.getElementById("eventButton");
eventButton.addEventListener("click", event => {const focusUser = new Event("focusUser");document.dispatchEvent(focusUser);
})

接下来两个页面实现的代码基本一致,这里为了方便观察,设置了两者不同输出日志。

// User.js
const eventButton = document.getElementById("eventButton");
document.addEventListener("focusUser", event => {console.log("【粉丝列表页】监听到自定义事件触发,event:",event);
})// Home.js
const eventButton = document.getElementById("eventButton");
document.addEventListener("focusUser", event => {console.log("【微博首页】监听到自定义事件触发,event:",event);
})

点击【关注微博】按钮后,看到控制台输出如下日志信息:

d4d33573fbf5de21384564d5a65fe0f9.png

最终实现了,在 **微博列表页(Weibo.js)**组件负责派发事件,其他组价负责监听事件,这样三个组件之间耦合度非常低,完全不用关系对方,互相不影响。其实这也是实现了观察者模式。
2.2 场景2实现场景2:解耦多模块开协作。
举个更直观的例子,当微博需要加入【一键三连】新功能,需要产品原型和UI设计完后,程序员才能开发。
本例子模拟四个模块:
1.流程控制(Index.js)
2.产品设计(Production.js)
3.UI设计(Design.js)
4.程序员开发(Develop.js)

fc263bbfc2cc62caaf53453eab121d18.png

流程控制(Index.js)模块中,我们需要将其他三个流程的模块都导入进来,然后监听【开始任务】按钮的点击事件,在回调事件中,创建一个自定义事件 startTask,并在 document 上使用 dispatchEvent 方法派发自定义事件。

// Index.js
import ProductionModule from "./Production.js";
import DesignModule from "./Design.js";
import DevelopModule from "./Develop.js";const start = document.getElementById("start");
start.addEventListener("click", event => {console.log("开始执行任务")const startTask = new Event("startTask");document.dispatchEvent(startTask);
})

在 Production 产品设计模块中,监听任务开始事件 startTask 后,模拟1秒后原型设计完成,并派发一个新的事件 productionSuccess ,开始接下来的UI稿设计。

// Production.js
document.addEventListener("startTask", () => {console.log("产品开始设计...");setTimeout(() => {console.log("产品原型设计完成");console.log("--------------");document.dispatchEvent(new Event("productionSuccess"));}, 1000);
});

在UI稿设计和程序开发模块,其实也类似,代码实现:

// Dedign.js
document.addEventListener("productionSuccess", () => {console.log("UI稿开始设计...");setTimeout(() => {console.log("UI稿设计完成");console.log("--------------");document.dispatchEvent(new Event("designSuccess"));}, 1000);
});// Production.js
document.addEventListener("designSuccess", function (e) {console.log("开始开发功能...");setTimeout(function () {console.log("【一键三连】开发完成");}, 2000)
});

开发完成后,我们点击【开始任务】按钮后,看到控制台输出如下日志信息:

a6ce8313946fa39b8a644a8ab40d00a7.png

最终实现了在 流程控制(Index.js)模块负责派发事件,其他组件负责监听事件,按流程完成其他任务。可以看出,原型设计、UI稿设计和程序开发任务,互不影响,易于任务拓展。


四、总结


本文详细介绍 JS自定义事件概念和实现方式,并结合两个实际场景进行代码演示。细心的小伙伴会发现,这两个实际场景都是用 Event() 构造函数实现,当然也是可以使用 CustomEvent 构造函数来代替。
另外本文也详细介绍两种实现方式,包括其区别和兼容性。
最后也希望大家能在实际开发中,多思考代码解耦,适当使用自定义事件来提高代码质量。

以上内容都是我自己的一些感想,分享出来欢迎大家指正,顺便求一波关注


作者:pingan8787
链接:https://juejin.im/post/5e50cda6e51d4526c1480efe
来源:掘金

http://www.lbrq.cn/news/1118287.html

相关文章:

  • 武汉企业管理培训课程/沈阳网站制作优化推广
  • wordpress备份数据库/排名优化网站
  • 郑州 (网站建设/百度推广费用多少钱
  • 网站的运营推广方案/企业营销策划公司
  • 做网站的常识/宁波seo企业推广
  • 做网站怎建立ftp和数据库/营销技巧和营销方法培训
  • 遵义怎样做网站/百度广告联盟下载
  • 自适应网站什么做/长春seo顾问
  • 信息技术教学网站开发/seo店铺描述例子
  • 商城网站建站系统源码/百度热线客服24小时
  • 九江企业网站制作/cps广告联盟平台
  • 做网站能赚到流量费吗/百度推广一年要多少钱
  • 包装设计模板设计素材/长春关键词优化平台
  • 北京 网站 建设/手机优化
  • 数据库网站建设/互联网营销具体做什么
  • app开发制作的图片/seoer是什么意思
  • 鹤壁交友网站开发公司/网站外包一般多少钱啊
  • 代理注册公司靠谱吗?/济南seo整站优化价格
  • 网站只做五周/如何做好网上销售
  • 网站设计怎么做/seo关键词优化怎么做
  • 大学学风建设网站/网站应该如何推广
  • 温州网站建设制作设计公司/杭州网站设计
  • 建设网站前的市场分析怎么写/苹果cms永久免费全能建站程序
  • 贵州建设工程招标协会网站/企业培训计划方案
  • 海淀重庆网站建设/百度pc版网页
  • 上海工业网站建设/百度空间登录
  • 网站无法收录/广告公司取名字参考大全
  • 制作网站工具/站长网站查询
  • 网站建设对称对比型/舆情网站
  • 国外对旅游网站的建设/百度搜索排名购买
  • 使用 CrewAI 进行股票分析:自动化投资决策的新途径
  • etcd自动压缩清理
  • 【C语言进阶】字符函数和字符串函数的内部原理
  • TCP心跳机制详解
  • 【Learning Notes】 Derak Callan‘s Business English P38~40
  • 新手向:Python自动化办公批量重命名与整理文件系统