我们都知道,鼠标点击click,触屏的touch等事件,可以触发相应的事件处理程序,也可以为这些事件添加事件处理程序,实际开发过程中可供我们使用的事件很少,click、doubleclick,mouseover、mousemove….等等这些。但当我们的程序越来越复杂的时候,光靠这些最底层的监听似乎已近不能满足我们的需求了。我们就需要我们自己去定义事件(其实就是我们写的函数),尤其是组件开发过程中,用的尤为多。

既然是事件,就要有事件的特性。我们要能为这个事件添加监听程序,这个事件触发时,监听程序也一定要触发才行。原理跟底层的事件类似。只不过,需要我们自己处理这些。

比如我们写了一个弹窗组件Box,他有弹出显示的方法show,还有关闭的方法close等。

可能有确定按钮、取消按钮等操作。随着产品或项目越复杂,被添加到这些确定或取消的操作也会越来越多。怎么办?一种是最原始的监听这些按钮的click事件,然后的写不同的回调。但是用回调的方式,有个弊端,当项目需求改变的时候,要往这个按钮上再另加个回调的时候,就要改原先的代码,要是以后再来一次,又要改。维护成本相当大。

我们不妨换个思路,把这个‘确定’或‘取消’想成像click这样的事件,当‘确定‘这个事件发生时其相应的一系列事件都会发生。就可以很好的解决这个问题。

基本原理:事件队列,即将监听程序存到一个数组中,再自定函数执行时,将添加监听数组中每个函数执行一遍。

定义一个对象专门用于存储自定义事件,定义一个方法用于注册监听,还有一个方法需要我们主动触发这个注册的监听程序(因为不像click等事件可以被浏览器监听捕获,浏览器无法识别我们自己定义的东西)。

代码如下:

//定义一个Box类
function Box(){//other codethis.handlers = {};//存储事件的对象
}
Box.prototype = {constructor: Box,//显示方法show: function (){//code//this.fire('show');},//关闭方法close: function (){//code//this.fire('close');},//监听方法,模拟addEventListener,其中type为事件函数,handler为需要触发的函数。addListener: function (type,handler){    if (typeof this.handlers[type] == 'undefined')this.handlers[type] = []; this.handlers[type].push(handler);//将要触发的函数压入事件函数命名的数组中},//手动触发方法fire: function (type){if ( this.handlers[type] instanceof Array ){var handlers = this.handlers[type];//遍历事件函数监听的程序,依次执行for (var i=0;i<handlers.length;i++){handlers[i]();}}},//事件解绑removeListener: function (type,handler){if (!this.handlers[type]) return;var handlers = this.handlers[type];if (handler == undefined){handlers.length = 0;//不传某个具体函数时,解绑所有}else if( handlers.length ){    for ( var i=0;i<handlers.length;i++ ){if ( handlers[i] == handler ){//解绑单个this.handlers[type].splice(i,1);}}}}
}

剩下就是在需要的的时候添加注册监听了,比如

var box = new Box();
function listenShow1(){console.log(11);
}
function listenShow2(){console.log(22);
}
box.addListener('show',listenShow1);
box.addListener('show',listenShow2);
box.show();

当show方法执行,在外部或者show方法内部执行,这个可能根据实际具体项目或这具体情况来确定。

当然以上只是基本原理,可能没有特别考虑更为复杂或具体的实际情况。比如解绑是只想解绑某一类,像jQuery那样,在事件身上加命名空间,解绑该命名空间上的所有函数。但是自定义事件的基本原理就是如上描绘的那样!

javascript自定义事件原理相关推荐

  1. Javascript自定义事件功能与用法实例分析

    原文地址:https://www.jb51.net/article/127776.htm 本文实例讲述了javascript自定义事件功能与用法.分享给大家供大家参考,具体如下: 概述 自定义事件很难 ...

  2. JavaScript自定义事件

    很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...

  3. [Vue源码分析]自定义事件原理及事件总线的实现

    最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道Vue中父组件可以通过 props 向下传数据给子组件:子组件可以通过向$emit触发一个事件,在父组件中执行回调函数,从而实 ...

  4. 浅谈Vue 自定义事件——原理及用法

    前言 在Vue 中,对HTML的原生事件做了支持.例如:click.focus.change等事件.除了原生事件外,Vue 还允许用户自定义事件. 什么是事件?什么是自定义事件? 在了解自定义事件前, ...

  5. JavaScript自定义事件--高级技巧

    观察者模式 事件是JavaScript和浏览器交互的主要途径.事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术. 观察者模式:由两类对象组成,主体和观察者,主体负责发布事件,观察者通过订 ...

  6. javascript自定义事件应用实例

    可以先看例子 从 js 自定义事件 里知道:元素A通过dispatchEvent方法触发的事件,只有A上注册的监听器才能监听得到. 我们想要的效果是,别的对象干了某件事之后, 发个消息给我们,好让我们 ...

  7. JavaScript 自定义事件、触发事件

    1. 自定义事件的基本步骤 创建事件. var event = document.createEvent('Event'); 初始化事件[参数:事件类型.事件是否在DOM中冒泡.是否可以用 preve ...

  8. html 自定义js,js 自定义事件

    js怎么自定义事件,并能让用on事件监听 你这个问题全部内容应该是如下吧: 在视频播放的时候,能够用on监听事件的触发,如下: player.on('pause',function(){ consol ...

  9. 【JS】512- JS 自定义事件如此简单!

    在前端开发世界中,JavaScript 和 HTML 之间往往通过 事件 来实现交互.其中多数为内置事件,本文主要介绍 JS自定义事件概念和实现方式,并结合案例详细分析自定义事件的原理.功能.应用及注 ...

最新文章

  1. 涨跌因子计算器下载哪里下载_微信爱情指数计算器整蛊app下载_爱情指数计算器整蛊测试下载...
  2. java 方法注解_使用Java注解不正确的方法
  3. powerdesigner-建立数据库模型及全局脚本
  4. Codis 分布式缓存部署
  5. 【网络流】 HDU 4309 Seikimatsu Occult Tonneru 状压枚举边
  6. Spring Cloud Config 使用总结
  7. 索引sql server_维护SQL Server索引
  8. 解决firefox和IE9对icon font字体的跨域访问问题
  9. Linux拷贝文件夹
  10. 大数据可视化常见的三种错误
  11. python连续质数计算代码分析,素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)...
  12. 微信小程序实现秒杀、拼团、团购等效果
  13. 编程猫编程平台的使用介绍
  14. 虚拟机安装win10提示operating system not found
  15. 读《从零开始学理财》
  16. 计算机wifi共享,win7 wifi共享,教您Win7如何设置wifi共享
  17. OJ水题-----蛇形填数
  18. LuaAuxLib 按键精灵lua库
  19. JAVA学习【IDEA转中文】
  20. [附源码]计算机毕业设计Python新能源汽车租赁(程序+源码+LW文档)

热门文章

  1. 常考数据结构与算法:判断二叉树是否对称(迭代法,递归法)
  2. spring一: 容器以及bean生命周期
  3. 由event target引发的关于事件流的一连串思考(二)
  4. OpenStack遇到的坑
  5. 取得Linux系统的各种统计信息
  6. [JQuery]用InsertAfter实现图片走马灯展示效果
  7. 部署JTBC2.0网上商城(apache+tomcat+mysql)
  8. 几个帅气的linux命令
  9. CakePHP 2.x CookBook 中文版 第五章 控制器 之 组件
  10. hive修改 表/分区语句