js自定义事件
自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后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自定义事件的更多相关文章
- js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- 漫谈js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- js 自定义事件 包含 添加、激活、销毁
1.思路 (1)构思 var eventTarget = { addEvent: function(){ //添加事件 }, fireEvent: function(){ //触发事件 }, remo ...
- js自定义事件CustomEvent、Event、TargetEvent
1.Event Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! Event的事件都是系统自 ...
- JS自定义事件之选项卡
自定义事件是一种处理与DOM产生交互的代码逻辑片段之间耦合的很好的架构方法. 一个简单的jQuery插件——选项卡 让ul列表来响应点击事件.当用户点击一个列表项时,给这个列表项添加一个名为activ ...
- JS自定义事件(Dom3级事件下)
原文出处: http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...
- 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)
四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...
- vue.js 自定义事件
<div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...
- cocos2d JS 自定义事件分发器(接收与传递数据) eventManager
简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...
随机推荐
- ZooKeeper日志与快照文件简单分析
有用过Zookeeper的都知道zoo.cfg配置文件中有dataDir配置项用于存储数据,不过可能有些人不太清楚这个目录具体存储的是那些数据,默认情况下这个目录是用于存储Log(事务日志)与Snap ...
- WIN 下的超动态菜单(二)用法
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ ...
- Windows 安装ELK
在Windows服务器上安装ELK logstash在windows平台下不能监控磁盘文件,用nxlog代替,监控文件并把内容发送到logstash 部署环境 Os :Windows 7 logsta ...
- dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法
dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法 grub 启动菜单后加入 rootdelay=90, 如下:/boot/vmlinuz-2.6.3 ...
- stm32之NVIC
非本人原创,转载自http://blog.csdn.net/denghuanhuandeng/article/details/8350392 STM32的NVIC理解 例程: /* Configur ...
- netsh端口转发
使用多个虚拟机,将开发环境和工作沟通环境分开(即时通,办公系统都只能在windows下使用…),将开发环境的服务提供给外部访问时,需要在主机上通过代理配置数据转发. VirtualBox提供了端口 ...
- WPF捕获未处理的异常
WPF程序中,对于异常的捕获一般使用try/catch块.就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获.如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失 ...
- NopCommerce 发布时 Could not load file or assembly 'file:///...\Autofac.3.5.2\lib\net40\Autofac.dll' or one of its dependencies
本文转自:http://www.nopcommerce.com/boards/t/33637/4-errors.aspx 问题: The 3.5 solution compiles fine, and ...
- 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
富文本编辑器,不多说了,这个大家应该都用到过,至于用到的什么版本,那就分很多种 CKEditor:很早以前叫FCK,那个时候也用过,现在改名了,比较流行的一个插件,国外很多公司在用 UEDITOR:百 ...
- ES5特性Object.seal
一个对象在默认状态下: 1,extensible:可扩展(可以添加新的属性) 2,configurable:可配置(可以改变原有属性的特性,比如修改属性的enumerable) Object.seal ...