自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后value是一个[],把此事件的所以回调都push进去。

写一个很基本的,没有把对象暴露出去的js的自定义事件。

 var event = (function(){
var obj = {};
var addEvent = function(type,cb){
if(!obj[type]){
obj[type] = [];
}
return obj[type].push(cb);
}
var removeEvent = function(type){
return obj[type] = null;
}
var fireEvent = function(type){
for(var i = ;i<obj[type].length;i++){
obj[type][i]();
}
}
return {
add:addEvent,
remove:removeEvent,
fire:fireEvent
}
})();
var on = function(type,param){
if(typeof param == "function"){
event.add(type,param);
}else{
event.fire(type);
}
}
var off = function(type){
event().remove(type);
}
on("hello",function(){console.log("你好世界");});
on("hello",function(){console.log("我是飘飘然");});
on("hello");

这里我们提供一个可以放入sdk中的

  customEvent = (function() {
var S4, addCustomEvent, cgid, fireCustomEvent, guid, listeners, removeCustomEvent;
S4 = function() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
guid = function() {
return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4();
};
listeners = {};
cgid = '__ceGUID';//cgid = guid; 目的为了防止框架定义的obj属性和用户定义属性的相同
addCustomEvent = function(obj, event, callback) {
obj[cgid] = undefined;
if (!obj[cgid]) {
obj[cgid] = "ifvisible.object.event.identifier";
}
if (!listeners[obj[cgid]]) {
listeners[obj[cgid]] = {};
}
if (!listeners[obj[cgid]][event]) {
listeners[obj[cgid]][event] = [];
}
return listeners[obj[cgid]][event].push(callback);
};
fireCustomEvent = function(obj, event, memo) {
var ev, j, len, ref, results;
if (obj[cgid] && listeners[obj[cgid]] && listeners[obj[cgid]][event]) {
ref = listeners[obj[cgid]][event];
results = [];
for (j = 0, len = ref.length; j < len; j++) {
ev = ref[j];
results.push(ev(memo || {}));
}
return results;
}
};
removeCustomEvent = function(obj, event, callback) {
var cl, i, j, len, ref;
if (callback) {
if (obj[cgid] && listeners[obj[cgid]] && listeners[obj[cgid]][event]) {
ref = listeners[obj[cgid]][event];
for (i = j = 0, len = ref.length; j < len; i = ++j) {
cl = ref[i];
if (cl === callback) {
listeners[obj[cgid]][event].splice(i, 1);
return cl;
}
}
}
} else {
if (obj[cgid] && listeners[obj[cgid]] && listeners[obj[cgid]][event]) {
return delete listeners[obj[cgid]][event];
}
}
};
return {
add: addCustomEvent,
remove: removeCustomEvent,
fire: fireCustomEvent
};
})();

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

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

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

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

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

  3. js 自定义事件 包含 添加、激活、销毁

    1.思路 (1)构思 var eventTarget = { addEvent: function(){ //添加事件 }, fireEvent: function(){ //触发事件 }, remo ...

  4. js自定义事件CustomEvent、Event、TargetEvent

    1.Event Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! Event的事件都是系统自 ...

  5. JS自定义事件之选项卡

    自定义事件是一种处理与DOM产生交互的代码逻辑片段之间耦合的很好的架构方法. 一个简单的jQuery插件——选项卡 让ul列表来响应点击事件.当用户点击一个列表项时,给这个列表项添加一个名为activ ...

  6. JS自定义事件(Dom3级事件下)

    原文出处:  http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...

  7. 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)

    四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...

  8. vue.js 自定义事件

    <div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...

  9. cocos2d JS 自定义事件分发器(接收与传递数据) eventManager

    简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...

随机推荐

  1. C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  2. 曲演杂坛--使用CTE时踩的小坑:No Join Predicate

    在一次系统优化中,意外发现一个比较“坑”的SQL,拿出来供大家分享. 生成演示数据: --====================================== --检查测试表是否存在 IF(O ...

  3. .NET对象的内存布局

    每个虚拟机都有它自己的对象布局,本文我们将针对sscli源码和windbg调试器来查看不同类型的.net对象布局. 在.net虚拟机里,每个对象都需要保存这些信息: 对象的类型: 对象实例的成员属性( ...

  4. [转]oracle中使用set transaction设置事务属性

    本文转自:http://yedward.net/?id=24 set transaction语句允许开始一个只读或者只写的事务,建立隔离级别或者是为当前的事务分配一个特定的回滚段.需要注意的是,set ...

  5. shell tips

    1.shopt 命令可以设置shell的可选参数 shopt [-psu] [optname...] -s 开启某个选项 -u 关闭某个选项 -p 列出所有可设置的选项 其中开启extglob选项,s ...

  6. leetcode-Combinations 复习复习排列组合

    Combinations 题意: 根据给定的n和k,生成从1到n范围内长度为k的排列组合 示例: n=4 k=2 [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2 ...

  7. Android开发中上线后修改应用名称的若干问题

    一.在Android Studio 1.3中修改app的包名: 需求来源: 之前开发的app已经在腾讯的应用宝上线,应客户要求,app需要改名字,这个就有点麻烦了.如果申请改名字,要求如下: 截图上图 ...

  8. tyvj[1087]sumsets

    描述     正整数N可以被表示成若干2的幂次之和.例如,N = 7时,共有下列6种不同的方案:1) 1+1+1+1+1+1+12) 1+1+1+1+1+23) 1+1+1+2+24) 1+1+1+4 ...

  9. Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  10. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...