事件派发的作用:

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的更多相关文章

  1. 事件派发dispatchEvent

    1.什么是dispatchEvent? dispatch意为"调度"."派遣",event为"事件".所以dispatchEvent即向指定 ...

  2. javascript事件触发器fireEvent和dispatchEvent

    javascript事件触发器fireEvent和dispatchEvent   事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等) ...

  3. Javascript事件模型系列(四)我所理解的javascript自定义事件

    被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...

  4. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  5. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  6. 总结JavaScript事件机制

    JavaScript事件模型 在各种浏览器中存在三种事件模型: 原始事件模型 , DOM2事件模型 , IE事件模型. 其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE ...

  7. 使用lua实现一个简单的事件派发器

    设计一个简单的事件派发器,个人觉得最重要的一点就是如何保证事件派发过程中,添加或删除同类事件,不影响事件迭代顺序和结果,只要解决这一点,其它都好办. 为了使用pairs遍历函数,重写了pairs(lu ...

  8. Javascript事件机制兼容性解决方案

    本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...

  9. 【探讨】javascript事件机制底层实现原理

    前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...

随机推荐

  1. SVN提交错误及使用技巧

    错误1: Some of selected resources were not added to version control. Some of selected resources were n ...

  2. Win10任务栏卡死解决方法

    有时,切换输入法,或者点击windows底部菜单,电脑鼠标会变成忙碌转圈圈的状态,无法操作底部菜单功能: 1. ctrl+shift+esc(或者ctrl+alt+delete)的方式调出任务管理器: ...

  3. python3.7内置函数整理笔记

    #python3.7 内置函数整理 #abs(x) #返回数字的绝对值. 参数可以是整数或浮点数. 如果参数是复数,则返回其大小 # print(abs(1)) # print(abs(-1)) # ...

  4. redis 缓存问题,转载:https://www.cnblogs.com/liangsonghua/p/www_liangsonghua_me_22.html

    缓存穿透: 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且处于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义 ...

  5. final修饰的变量引用不能变还是对象不可变

    两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能指向另外一个对象. 基本数据类型: package cn.yqg.day2; publ ...

  6. java oracle的2种分页方法

    java oracle的2种分页方法 一物理分页: <!-- 分页查询所有的博客信息 --> <select id="findBlogs" resultType= ...

  7. mysql优化后的主配置文件

    #!/bin/bash basedir=$mysql datadir=$mysql/data server_id=$(hostname -I | awk '{print $NF}'|awk -F '. ...

  8. Oracle 日期型 将timestamp类型转换为date类型

    Oracle将timestamp类型转换为date类型有三种方法 1.使用to_char先转为字符型,在使用to_date再转为日期型 select to_date(to_char(systimest ...

  9. Linux shell - 按时间和文件大小排序显示文件

    在工作中有这样的情况,需要显示所有的文件,按照时间先后或者文件大小先后排序显示 命令:ls 1.按时间排序显示文件 1 test@> ll -rt 2.按文件大小排序显示文件(文件大小单位:k, ...

  10. TCPDUMP抓包学习

    一.抓包基础 1.抓网卡ens33 的包,有多大抓多大,然后保存到a.cap中 [root@localhost ~]# tcpdump -i ens33 -s -w a.cap tcpdump: li ...