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. 使用简单的python语句编写爬虫 定时拿取信息并存入txt

    # -*- coding: utf-8 -*- #解决编码问题import urllibimport urllib2import reimport osimport time page = 1url ...

  2. [译].Net 4.5 的五项强大新特性

    本文原文:Five Great .NET Framework 4.5 Features 译者:冰河魔法师 目录 介绍 特性一:async和await 特性二:Zip压缩 特性三:正则表达式执行超时 特 ...

  3. IScroll的诞生和缺点

    转自http://lhdst-163-com.iteye.com/blog/1239784 iscroll.js是Matteo Spinelli开发的一个js文件,使用原生js编写,不依赖与任何js框 ...

  4. doom启示录

    半个小时之后,doom的最后一个字节抵达威斯康星大学,瞬间,上万名玩家涌向那台服务器,淹没了她,威斯康星大学的服务器瘫痪了,大卫的服务器崩溃了. “天哪”大卫在电话里结结巴巴地对杰伊说:“我还从没见过 ...

  5. Beta 冲刺(6/7)

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10129063.html 作业博客:https://edu.cnblogs.com/campus ...

  6. 统一异常处理@RestContrllerAdvice,@ExceptionHandler(转载)

    思想很重要 统一异常处理实现方式:使用注解@RestContrllerAdvice,@ExceptionHandler 先想明白一个问题:定义统一异常处理类之后,是不是在Contrller中就不用捕获 ...

  7. bootstrap-treeview 自定义实现双击事件

    bootstrap-treeview是一款效果非常酷的基于bootstrap的jQuery多级列表树插件.该jQuery插件基于Twitter Bootstrap,以简单和优雅的方式来显示一些继承树结 ...

  8. grafana+influxdb+telegraf监控服务器cpu,内存和硬盘

    随便抄了一篇,目前我们的项目也在用,这个是linux和windows通吃的一种监控方案,非常有效,详细和优美,需要监控什么具体的业务内容,自己向influxdb中插入就行了. 监控服务器状态是运维必不 ...

  9. adb安装启动Touch校正软件

    /********************************************************************************* * adb安装启动Touch校正软 ...

  10. Windows下C++删除清除map

    清除单map(非嵌套map) #include<map> #include<string> #include<iostream> using namespace s ...