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. C# Winform 中如何获取本机安装输入法,并设置为默认输出语言,如何打开搜狗输入法和手写板

    一.问题: 今天,我整理了一下两个问题 1.如何获取本机安装所有输入法,并设置为系统输出语言 2.如何打开搜狗拼音输入法工具栏和手写板: 二.解决方法 比如:我们要设置搜狗输入法为本机输入语言,要怎么 ...

  2. Python 数据类型--Bytes类型

    一.Bytes类型 在Python3以后,字符串和bytes类型彻底分开了.字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用甚至内置方法上和字 ...

  3. 基于GUI的简单聊天室03

    上一版本,客户端关闭后会出现“socket close”异常问题,这个版本用捕捉异常来解决,实际上只是把异常输出的语句改为用户退出之类,并没真正解决 服务器类 package Chat03; /** ...

  4. 对HTML(HyperText Markup Language)的认识以及总结

    一.HTML的基础结构 以上图片可以看出HTML的基础结构: 文档声明+<html>根元素(也叫顶级元素)------><html>里包括<head>元素+& ...

  5. DevExpress v18.1新版亮点——WinForms篇(五)

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

  6. ZOJ 17届校赛 Knuth-Morris-Pratt Algorithm( 水题)

    In computer science, the Knuth-Morris-Pratt string searching algorithm (or KMP algorithm) searches f ...

  7. SSH项目搭建(四)——Maven的pom.xml配置

    史上最全的maven的pom.xml文件详解: https://www.cnblogs.com/qq765065332/p/9238135.html 下面的节点有不理解是啥意思的可以到上面链接的文章里 ...

  8. Linux环境下 多线程下载 (Python 实现版)

    本文是多年前学习编程时参照一个网友程序的基础之上改写的, 采用Python语音编写, 多线程下载功能, 可以有效提高Linux下原有下载工具中的一些不足,以下给出具体代码. #!/usr/bin/py ...

  9. linux-*.filetype.bz2 unzip

    how to unzip *.bz2 file? wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 unzip ...

  10. utf-8编码的csv文件,用excel打开乱码,解决办法,在输出前加 0xEF,0xBB,0xBF三个char

    转自 http://blog.csdn.net/zcmssd/article/details/6086649 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做”ZERO ...