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. .net 中struct(结构)和class(类)的区别

    1.struct 结构与class(类)的区别 1)struct是值类型,class是对象类型 2)struct不能被继承,class可以被继承 3)struct默认访问权限是public,而clas ...

  2. Maven 入门篇(下)

    第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点接触后,接下去的一步是要了解maven的核心概念,这样才能在使用maven的时 ...

  3. Hive时间函数笔记

    unix_timestamp()函数: 返回值: bigint说明: 获得当前时区的UNIX时间戳 举例: hive> select unix_timestamp() from dual; 14 ...

  4. 关于如何使用cg中的discard/clip

    Pass { ZTest Always Cull Off ZWrite Off Fog { Mode off } Blend Off CGPROGRAM #pragma vertex vert_img ...

  5. jsf的运行原理及生命周期

    一.jsf(java server faces)的运行原理(工作方式) 1.jsf应用是事件驱动的,当一个事件发生时(比如用户单击一个按钮),事件通知通过HTTP发往服务器,服务器端使用叫做Faces ...

  6. 突破10万高并发的nginx性能优化经验(含内核参数优化)

    写的很好,推荐阅读. 转载:http://www.cnblogs.com/kevingrace/p/6094007.html 在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并 ...

  7. tmux安装与使用

    安装 用法 重点 一prefix前缀键 二window和pane的区分 tmux 按照官方给出的介绍是:终端复用工具.说白了就是可以仅仅在开启一个终端的情况下同时处理多个任务. 比如下面我设置的这样一 ...

  8. 如何使用firebug

    什么是Firebug 从事了数年的Web开发工作,越来越觉得现在对WEB开发有了更高的要求.要写出漂亮的HTML代码:要编写精致的CSS样式表展示每个页面模块:要调试javascript给页面增加一些 ...

  9. Codeforces 1096G. Lucky Tickets【生成函数】

    LINK 题目大意 很简单自己看 思路 考虑生成函数(为啥tags里面有一个dp啊) 显然,每一个指数上是否有系数是由数集中是否有这个数决定的 有的话就是1没有就是0 然后求出这个生成函数的\(\fr ...

  10. Navicat Premium连接PostgreSQL

    连接PostgreSQL时,报错 大致意思:你当前的IP没有连接权限,在文件pg_hba中缺少当前IP的配置 解决:找你的PostgreSQL安装路径,这是我的:C:\Program Files\Po ...