js中的事件是js的一大技术点,说白了就是操作dom树的唯一途径。

关于事件无非两种绑定方式:

document.getElementById('xxx').onclick = function(){

}
document.getElementById("xxx").addEventListener("click", function(){

});

前者和后者的区别无非就是绑定一个和多个,当多次绑定相同元素的时候,前者会覆盖,后者不会覆盖。

下面我们来看看如何自定义事件,我们想的自定义事件无非两点

1.我们可以根据自己传递的自定义事件,绑定我们想要的事件

2.我们绑定的事件不能相互之前覆盖

综上所述,我们可以自己定义函数,函数实现两个参数,第一个参数用来传递我们想要绑定的自定义事件,第二个参数是我们想要运行的函数。但是不相互覆盖我们如何实现呢?我们都知道,我们直接绑定相同元素的相同事件后者一定会覆盖前者的,所以我们思路是定义一个对象

listener:{}

我们定义了一个listener对象,用于把我们所有自定义的事件都添加到这个对象里面,然后当我们调用的时候,在遍历这个对象。

核心思想就是我们把对象的键当作我们的自定义事件的名称,我们的值一定是一个数组,然后我们把所有的自定义事件的函数都push到这个数组里面来时间事件的不覆盖

listener:{
'aa':[fn1(),fn2(),fn3()],
'bb':[fn5(),fn6()]
}

例如上面的例子就是说我们自定义了五个自定义事件,有三个名字叫aa,功能分别为:

fn1()    fn2()      fn3()

有两个名字叫b,功能分别为:

fn5()     fn6()

这个就是我们实现自定义事件的核心思想,下面我们来写添加自定义事件的push函数

           function addEvent(type,fn){
if(typeof this.listener[type] ==='undefined'){
this.listener[type]=[];
}
if(typeof fn ==='function'){
this.listener[type].push(fn);
}
return this;
}

上面这个函数我们所有的添加自定义事件我们都会把这个自定义事件push到我们的listener对象中,来实现自定义事件的预定义。

之后我们定义了这个自定义事件,我们需要一个函数遍历这个listener对象来运行这里面的代码,来时间自定义事件的函数功能。

代码如下:

          function showEvent(type){
var arr = this.listener[type];
if(arr instanceof Array){
for(var i=;i<arr.length;i++){
if(typeof arr[i] ==='function'){
arr[i]({type:type});
}
}
}
}

这样我们就可以运行我们定义的某个自定义事件了。

既然有自定义事件,那么我们就一定需要一个删除自定义事件的函数,代码如下:

      function removeEvent(type, fn) {
var arrayEvent = this.listener[type];
if (typeof type === "string" && arrayEvent instanceof Array) {
if (typeof fn === "function") {
for (var i=, length=arrayEvent.length; i<length; i+=){
if (arrayEvent[i] === fn){
this.listener[type].splice(i, );
break;
}
}
} else {
delete this.listener[type];
}
}
return this;
}

这样子我们就实现了js的自定义事件,我们来整合一下我们的所有代码:

    var Event = {
listener:{},
addEvent:function(type,fn){
if(typeof this.listener[type] ==='undefined'){
this.listener[type]=[];
}
if(typeof fn ==='function'){
this.listener[type].push(fn);
}
return this;
},
showEvent:function(type){
var arr = this.listener[type];
if(arr instanceof Array){
for(var i=;i<arr.length;i++){
if(typeof arr[i] ==='function'){
arr[i]({type:type});
}
}
}
},
removeEvent: function(type, fn) {
var arrayEvent = this.listener[type];
if (typeof type === "string" && arrayEvent instanceof Array) {
if (typeof fn === "function") {
for (var i=, length=arrayEvent.length; i<length; i+=){
if (arrayEvent[i] === fn){
this.listener[type].splice(i, );
break;
}
}
} else {
delete this.listener[type];
}
}
return this;
}
};

之后我们在想要自定义事件我们只需要这样调用:

     Event.addEvent('aa',fn);
Event.addEvent('aa',function(){
alert();
});
Event.removeEvent('aa',fn);

js的自定义事件的更多相关文章

  1. js中自定义事件,使用了jQuery

    $(function(){ $('#btn').bind("myClick", function(){ //自定义myClick事件 $('#test').append(" ...

  2. (转)js原生自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...

  3. JS中自定义事件的使用与触发

    1. 事件的创建 JS中,最简单的创建事件方法,是使用Event构造器: var myEvent = new Event('event_name'); 但是为了能够传递数据,就需要使用 CustomE ...

  4. js简单自定义事件与主动触发事件

    var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...

  5. Js 实现自定义事件

    var Event = { on: function (eventName, callback) { if (!this[eventName]) { this[eventName] = []; } t ...

  6. js自定义事件

    自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后value是一个[],把此事件的所以回调都push进去. 写一个很基本的,没有把对象暴露出去的js的自定义事件. var eve ...

  7. js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  8. 漫谈js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  9. 主动触发事件 自定义事件 trigger 及其用法

    1. 触发自定义事件方式 js.jq 2. jq 触发 2.1 默认支持的事件 $('#h').on('click',function(){ $(this).append('<p>p< ...

随机推荐

  1. PHP:第四章——PHP数组处理函数

    <pre> <?php //数组处理函数 header("Content-Type:text/html;charset=utf-8"); //compact(); ...

  2. POJ 3264 RMQ水题

    题目大意就是有很多牛.告诉你每只牛的高度.然后有很多个询问.输出该区间内的最大身高差.也就是用RMQ求最大值最小值.貌似还可以用线段树.然而,我还不会线段树.....T_T 可能是太多组数据了.cin ...

  3. 框架:Lucene.net

    Lucene.net 性能<第八篇> 摘要: 一.IndexReader性能分析 IndexReader完成了打开所有索引文件和提供底层reader API等繁重的工作,而IndexSea ...

  4. 投资银行的IT部门——不同之处与常见误解

    投资银行的IT部门——不同之处与常见误解 说了这么多投资银行,投行里面的IT部门究竟是做什么的呢?在过去,投资银行仅靠纸.笔.计算器就能做生意了.但是在今天,所有的部门都要依靠IT技术.交易部门甚至是 ...

  5. DevExpress v18.1新版亮点——ASP.NET篇(四)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v18.1 的新功能,快来下载试用新版本!点 ...

  6. cocos2d-x移植:xcode到eclipse

    xcode程序移植到eclipse 必要组件: 1.macos gcc编译器,若没有,在xcode->preference->downloads中下载command line tools( ...

  7. 《利用Python进行数据分析》笔记---第5章pandas入门

    写在前面的话: 实例中的所有数据都是在GitHub上下载的,打包下载即可. 地址是:http://github.com/pydata/pydata-book 还有一定要说明的: 我使用的是Python ...

  8. 大数开根号java模板

    利用逼近的思路直接二分开方找出值 package lanqiao; import java.math.BigInteger; import java.util.Scanner; public clas ...

  9. 转:如何解决VC "应用程序无法启动,因为应用程序的并行配置不正确 sxstrace.exe"问题

    如何解决VC "应用程序无法启动,因为应用程序的并行配置不正确 sxstrace.exe"问题   引用链接 http://blog.csdn.net/pizi0475/artic ...

  10. STM32串口配置步骤

    串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化 NVIC(如果需要开启中断才 ...