自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后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. 谷歌/微软/必应web页面免费翻译插件

    随着网络时代的日益壮大,现在我们经常需要浏览一些各种外语的网页,或者是查阅资料帮助我们解决问题.更多的时候还是头疼在语言障碍上,正所谓"它认识你,你不认识它啊."谷歌和微软两个企业 ...

  2. 大型网站的 HTTPS 实践(1):HTTPS 协议和原理

    转自:http://op.baidu.com/2015/04/https-s01a01/ 1 前言 百度已经于近日上线了全站 HTTPS 的安全搜索,默认会将 HTTP 请求跳转成 HTTPS.本文重 ...

  3. QT学习第1天

    QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...

  4. contiki在keil下的stm32平台移植

    参考博客: http://www.aiuxian.com/article/p-705047.html http://blog.csdn.net/u013232419/article/details/4 ...

  5. 几种语言的CGI编程

    为了了解PHP.JSP.ASP出现之前人们写网站的方法,洒家研究了一波CGI,使用C.Python.batch.shell script语言写了几个简单的网页. CGI即通用网关接口,指web服务器调 ...

  6. 【转】Android编程判断手机or平板

    转载自:http://www.cnblogs.com/sunzn/p/3663363.html /** * 判断当前设备是手机还是平板,代码来自 Google I/O App for Android ...

  7. [转]Oracle 修改或者删除临时表 ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引

    本文转自:http://blog.csdn.net/treasurelifelhf/article/details/7290729 由于存储过程出现问题,导致前台页面无法显示数据.执行存储过程发现临时 ...

  8. 图的全局最小割的Stoer-Wagner算法及例题

    Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: --------------------------- ...

  9. copy-paste component

    http://www.cnblogs.com/wantnon/p/4579008.html

  10. 有关数据库行、锁 的几个问题(rowlock)

    行锁的基本说明: SELECT au_lname FROM authors WITH (NOLOCK) 锁定提示                                 描述  HOLDLOC ...