js事件模型与自定义事件实例解析

发布时间 - 2026-01-10 22:01:59    点击率:

JavaScript 一个最简单的事件模型,需要有事件绑定与触发,还有事件删除。

var eventModel = {
 list: {},
 bind: function () {
 var args = [].slice.call(arguments),
 type = args[0],
 handlers = args.slice(1);
 if (typeof type === 'string' && handlers.length > 0) {
  for (var i = 0; i < handlers.length; i++) {
  if (typeof handlers[i] === 'function') {
   if (!this.list[type]) {
   this.list[type] = [];
   }
   this.list[type].push(handlers[i]);
  }
  }
 }
 },
 unbind: function () {
 var type = arguments[0],
 handlers = Array.prototype.slice.call(arguments, 1);
 if (typeof type === 'string') {
  if (handlers.length === 0) {
  this.list[type] = [];
  } else {
  for (var i = 0; i < handlers.length; i++) {
   if (typeof handlers[i] === 'function' && handlers[i] === this.list[type][i]) {
   this.list[type].splice(i, 1);
   }
  }
  }
 }
 },
 trigger: function () {
 var arguments = [].slice.call(arguments),
 type = arguments[0],
 args = arguments[1] instanceof Array && !arguments[2] ? arguments[1] : arguments.slice(1),
 handlers = this.list[type];
 for (var i = 0; i < handlers.length; i++) {
  handlers[i].apply(this, args.splice(0, handlers[i].length));
 }
 }
};

其中主要实现了bind(绑定事件)、unbind(删除事件)与 trigger (触发事件)。对同一事件名称,可以绑定多个事件处理函数;并按照绑定的顺序依次触发。

args.splice(0, handlers[i].length) 触发时的传参

事件绑定与触发:

eventModel.bind('myevent1', function (a) {
 console.log(a); // 1
}, function(b) {
 console.log(b); // 2
}, function(c, d) {
 console.log(c + ' + ' + d); // a + b
});
eventModel.bind('myevent1', function (e) {
 console.log(e); // 50
});
eventModel.trigger('myevent1', 1,2,'a','b', 50);

事件删除:

<button id="bind">bind</button>
<button id="unbind">unbind</button>
var fnX = function () {
 console.log('fnX');
}
var fnY = function () {
 console.log('fnY');
}
eventModel.bind('myevent2', fnX, fnY);
document.getElementById('unbind').onclick = function () {
 eventModel.unbind('myevent2', fnX); //删除 fnX 后,只剩下 fnY
};
document.getElementById('bind').onclick = function () {
 eventModel.trigger('myevent2'); //输出 fnX fnY
 //在点击unbind后,只输出 fnY
};

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 事件模型  # 自定义事件  # 带你快速理解javascript中的事件模型  # javascript事件捕获机制【深入分析IE和DOM中的事件模型】  # javascript事件模型介绍  # javascript事件模型实例分析  # Javascript基础知识(一)核心基础语法与事件模型  # 关于javascript DOM事件模型的两件事  # javascript 传统事件模型构造的事件监听器实现代码  # javascript事件模型代码  # 详解JS浏览器事件模型  # 绑定  # 多个  # 只剩下  # 最简单  # 实现了  # type  # handlers  # call  # arguments  # length  # gt  # lt  # typeof  # string  # amp  # brush  # var  # JavaScript  # pre 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站建设整体流程解析,建站其实很容易!  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何快速配置高效服务器建站软件?  如何挑选最适合建站的高性能VPS主机?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  香港服务器网站推广:SEO优化与外贸独立站搭建策略  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  韩国服务器如何优化跨境访问实现高效连接?  香港服务器选型指南:免备案配置与高效建站方案解析  如何快速使用云服务器搭建个人网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  微信小程序 canvas开发实例及注意事项  个人网站制作流程图片大全,个人网站如何注销?  高端建站如何打造兼具美学与转化的品牌官网?  如何利用DOS批处理实现定时关机操作详解  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  使用spring连接及操作mongodb3.0实例  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  PHP 500报错的快速解决方法  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  佛山网站制作系统,佛山企业变更地址网上办理步骤?  香港服务器租用费用高吗?如何避免常见误区?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Python3.6正式版新特性预览  如何快速登录WAP自助建站平台?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何基于云服务器快速搭建网站及云盘系统?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何快速打造个性化非模板自助建站?  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel如何处理表单验证?(Requests代码示例)  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何在新浪SAE免费搭建个人博客?  如何实现javascript表单验证_正则表达式有哪些实用技巧  Android使用GridView实现日历的简单功能  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  详解Android图表 MPAndroidChart折线图  如何在宝塔面板中修改默认建站目录?  C++用Dijkstra(迪杰斯特拉)算法求最短路径