Javascript事件派发-dispatchEvent
事件派发的作用:
1.派发数据,将一个封闭模块中的数据传递给另一个封闭模块。
2.事件完成了较为复杂的解耦。
事件和回调函数不同在于:
1、事件可以在任意地方去获取,而回调函数只能在一个地方存在,如果需要完成内容后执行函数,回调函数就只能在一个地方调用,而事件却可以在任何地方接收到数据。
2、回调函数与当前的代码紧密相关联,如果有修改一个地方,可能会造成错误,但是事件机制通过事件的侦听获取,因此不管发送还是接受删除修改后都不会引起任何相关联的错误。
封装的js文件(实现加载图片为例)
回调函数版:
- var Method=(function () {
- return {
- loadImage:function (arr,callback) {
- var img=new Image();
- img.arr=arr;
- img.list=[];
- img.num=0;
- img.callback=callback;
- img.addEventListener("load",this.loadHandler);
- img.self=this;
- img.src=arr[img.num];
- },
- loadHandler:function (e) {
- this.list.push(this.cloneNode(false));
- this.num++;
- if(this.num>this.arr.length-1){
- this.removeEventListener("load",this.self.loadHandler);
- //全部加载完成后通过回调函数将list返回到html文件
- this.callback(this.list);
- return;
- }
- this.src=this.arr[this.num];
- },
- }
- })();
派发事件版:
- var Method=(function () {
- return {
- EVENT_ID:"event_id",
- loadImage:function (arr) {
- var img=new Image();
- img.arr=arr;
- img.list=[];
- img.num=0;
- // 如果DOM对象下的事件侦听没有被删除掉,将会常驻堆中
- // 一旦触发了这个事件需要的条件,就会继续执行事件函数
- img.addEventListener("load",this.loadHandler);
- img.self=this;
- img.src=arr[img.num];
- },
- loadHandler:function (e) {
- this.list.push(this.cloneNode(false));
- this.num++;
- if(this.num>this.arr.length-1){
- this.removeEventListener("load",this.self.loadHandler);
- //事件派发类型必须与事件侦听接收类型一致,这样事件才会收到
- //创建一个事件对象
- var evt=new Event(Method.EVENT_ID)
- //将list作为事件对象的属性
- evt.list=this.list;
- //抛发事件
- document.dispatchEvent(evt);
- return;
- }
- this.src=this.arr[this.num];
- },
- }
- })();
引用方式:
- <script>
- var arr=["img/a.jpeg","img/b.jpeg","img/c.jpeg","img/d.jpeg","img/e.jpeg"];
- //此处Method为上面封装的方法
- //将arr图片地址数组放入
- Method.loadImage(arr);
- //给document添加监听事件
- document.addEventListener(Method.EVENT_ID,loadFinishHandler);
- function loadFinishHandler(e) {
- //图片加载完就可以获取到图片list
- console.log(e.list);
- }
- </script>
另一个封装js文件里:
- (function () {
- document.addEventListener(Method.EVENT_ID,loadFinishHandler);
- function loadFinishHandler(e) {
- //这里仍然能获取到图片list
- console.log(e.list);
- }
- })();
通过使用事件派发机制完成了较为复杂的解耦,代码之间耦合度降低,事件机制通过事件的侦听获取,因此不管发送还是接受,删除修改后都不会引起任何相关联的错误提供了一种将一个封闭模块中的数据传递给另一个封闭模块方法。
Javascript事件派发-dispatchEvent的更多相关文章
- 事件派发dispatchEvent
1.什么是dispatchEvent? dispatch意为"调度"."派遣",event为"事件".所以dispatchEvent即向指定 ...
- javascript事件触发器fireEvent和dispatchEvent
javascript事件触发器fireEvent和dispatchEvent 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等) ...
- Javascript事件模型系列(四)我所理解的javascript自定义事件
被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】
正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...
- 总结JavaScript事件机制
JavaScript事件模型 在各种浏览器中存在三种事件模型: 原始事件模型 , DOM2事件模型 , IE事件模型. 其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE ...
- 使用lua实现一个简单的事件派发器
设计一个简单的事件派发器,个人觉得最重要的一点就是如何保证事件派发过程中,添加或删除同类事件,不影响事件迭代顺序和结果,只要解决这一点,其它都好办. 为了使用pairs遍历函数,重写了pairs(lu ...
- Javascript事件机制兼容性解决方案
本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...
- 【探讨】javascript事件机制底层实现原理
前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...
随机推荐
- Elasticsearch 术语介绍和CRUD实际操作入门
一.Elastic Stack 核心Elasticsearch Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引擎.Elasticsearch 是面向文档的,这就意味着 ...
- 16.centos7基础学习与积累-002
1.从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 互联网公司服务器品牌: dell 服务器品牌: 1U=4.45CM 2010年以 ...
- zabbix 自动发现(LLD)
概述 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,Zabbix可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网络接口手动创建监控项 ...
- 2013.4.26 - KDD第八天
下午上Android课,我看中秋也选这个课了,然后在上半节的时候速补了一下秦海龙师兄的那篇文章.中间休息的时候窜到了中秋那里,然后讨论了半节课现在的情况. 现在的情况是这样的: 中 秋开始是没有进行主 ...
- Java精通并发-notify方法详解及线程获取锁的方式分析
wait(): 在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读,而它是调用了一个参数 ...
- 《BUG创造队》作业8:软件测试与Alpha冲刺(第一天)
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...
- JQuery实现品牌展示
最近验收了ITOO,老师当时验收的时候对于界面的设计非常敏感,只要看了一个大体轮廓,就能给出我们建议,这是二十年积累的经验,我们要做的就是站在巨人的肩膀上,让我们成长更快! 老师说了一下关于界面设计的 ...
- 神经网络(8)---如何求神经网络的参数:cost function的表达
两种分类问题: binary & multi-class 下面的是两种类型的分类问题(一种是binary classification,一种是multi-class classificatio ...
- c# 隐藏窗口在ALT+TAB中
winform: protected override CreateParams CreateParams { get { const int WS_EX_APPWINDOW = 0x40000; c ...
- 七.搭建基本的FTP服务
1.安装vsftpd软件包 ]# yum -y install vsftpd 2.重起vsftpd服务 ]# systemctl restart vsftpd ]# systemctl enable ...