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


相关推荐: Laravel怎么判断请求类型_Laravel Request isMethod用法  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  网站建设保证美观性,需要考虑的几点问题!  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  JavaScript中的标签模板是什么_它如何扩展字符串功能  如何实现建站之星域名转发设置?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何在香港服务器上快速搭建免备案网站?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel如何处理文件下载请求?(Response示例)  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  北京网站制作的公司有哪些,北京白云观官方网站?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  如何确认建站备案号应放置的具体位置?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  无锡营销型网站制作公司,无锡网选车牌流程?  深入理解Android中的xmlns:tools属性  如何快速上传建站程序避免常见错误?  英语简历制作免费网站推荐,如何将简历翻译成英文?  PHP 500报错的快速解决方法  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  原生JS获取元素集合的子元素宽度实例  网页设计与网站制作内容,怎样注册网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  HTML 中如何正确使用模板变量为元素的 name 属性赋值  JavaScript常见的五种数组去重的方式  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何在 React 中条件性地遍历数组并渲染元素  Laravel如何与Inertia.js和Vue/React构建现代单页应用  ,南京靠谱的征婚网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何用AWS免费套餐快速搭建高效网站?  微信小程序 闭包写法详细介绍  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】