js增强的自定义事件模型
作者:月影 来源:影月阁 发布时间:2008-02-18 12:37:00
标签:自定义,事件,js
原型:EventManager是一个重要的原型,它用来赋予对象自定义事件的能力
当对象类型的原型继承EventManager时,对象具有定义、分派和捕捉事件的能力
EventManager有四个重要的方法dispatchEvent、captureEvent、addEventListener和removeEventListener
function EventManager()
{
this.dispatchEvent = function(eventType, eventArgs)
{
eventArgs = eventArgs || {};
var events = this["on"+eventType];
var called = 0;
if(events && typeof(events) == "function")
events = [events];
if(!eventArgs.type) eventArgs.type = eventType;
//阻止默认动作的执行
eventArgs.preventDefault = function()
{
eventArgs.defaultOp = null;
}
//阻止事件起泡
eventArgs.stopPropagation = function()
{
eventArgs.cancelBubble = true;
}
var $pointer = this;
if(events)
{
for(var i = 0; i < events.length; i++)
{
setTimeout(
(function(i){
var evt = events[i];
var len = events.length;
var capturer = events.capturer;
var capturerName = events.capturerName;
return function(){
called++;
var ret = evt.call($pointer,eventArgs);
//如果有捕获事件的方法,并且没有阻止事件气泡,在最后一个事件处理程序结束之后调用它
if(!eventArgs.cancelBubble && called == len && capturer && capturerName && capturer[capturerName])
{
setTimeout(function(){
capturer[capturerName](eventArgs)
},1)
}
//如果定义了默认动作,在最后一个事件处理程序结束之后执行它
if(called == len && eventArgs.defaultOp)
{
eventArgs.defaultOp.call($pointer, eventArgs);
}
return ret;
}
})(i), 1
);
}
}
else if(eventArgs.defaultOp)
{
eventArgs.defaultOp.call($pointer, eventArgs);
}
}
this.fireEvent = this.dispatchEvent;
this.captureEvents = function(target, eventType, capturerName, closure)
{
if(capturerName instanceof Function)
{
closure = capturerName;
capturerName = null;
}
capturerName = capturerName || "on" + eventType;
target["on"+eventType] = target["on"+eventType] || [function(){}];
var events = target["on"+eventType];
if(typeof(events) == "function")
{
target["on"+eventType] = [events];
}
target["on"+eventType].capturer = this;
target["on"+eventType].capturerName = capturerName;
if(closure)
this[capturerName] = closure;
}
this.addEventListener = function(eventType, closure)
{
if(this["on"+eventType] == null)
{
this["on"+eventType] = [];
}
var events = this["on"+eventType];
if(events && typeof(events) == "function"){
this["on"+eventType] = [events];
events = this["on"+eventType];
}
events.push(closure);
return closure;
}
this.removeEventListener = function(eventType, closure)
{
var events = this["on"+eventType];
if(events && typeof(events) == "function")
events = [events];
for(var i = 0; i < events.length; i++)
{
if(events[i] == closure)
events.splice(i, 1);
}
return closure;
}
}


猜你喜欢
- 几个特殊的函数(待补充)python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter、map、red
- 1. 场景描述linux服务器下安装了Anaconda3,执行Pyhton的K-means算法,结果出现如下图的中文字符乱码。上次已经解决了
- 本文实例讲述了linux下通过go语言获得系统进程cpu使用情况的方法。分享给大家供大家参考。具体分析如下:这段代码通过linux的系统命令
- 0. 前言本节中,我们使用策略梯度算法解决 CartPole 问题。虽然在这个简单问题中,使用随机搜索策略和爬山算法就足
- 0. 前言周日在爬一个国外网站的时候,发现用协程并发请求,并且请求次数太快的时候,会出现对方把我的服务器IP封掉的情况。于是网上找了一下开源
- 1.双击已下载好的navicat安装包,点击"下一步"2.点击我同意,在点击"下一步"3.设置nav
- 前言最近在使用pycharm开发新项目的时候,每次打开新的工程都显示没有解释器,要不加了解释器就是代码一堆没有红色错误提示没有模块问题,找到
- 天冷,人懒,事多,我就不全文翻译了。只列几个标题,很多内容完全按照我自己的理解写了一下。想读原汁原味的请移步:Icon design tre
- 一开始用phpMyAdmin来执行,后来出现一堆错误,后来去掉了begin,end之后可以正常执行,但要执行存储过程,在phpMyAdmn中
- 本文实例为大家分享了pytorch实现线性回归以及多元回归的具体代码,供大家参考,具体内容如下最近在学习pytorch,现在把学习的代码放在
- 机器学习之随机森林,供大家参考,具体内容如下1、Bootstraping(自助法)  
- 在Python的学习过程中,肯定会遇到很多安装模块的地方,可以使用easy_install安装,但是easy_install相对于pip而言
- 1、引言小 * 丝:鱼哥,鱼哥,help…小鱼:呼吸声越来越弱,你这是劳累过度??小 * 丝:拉倒吧,我这是激动的小鱼:什么大
- 1、MySQL常用命令create database name; 创建数据库use databasename; 选择数据库drop data
- 带农历的JavaScript日期时间,增加了农历使这款代码更具实用性,很不错,不但有农历,而且还可以显示民国计年,可以判断显示闰月、闰年等,
- 在linux服务器部署thinkphp5的时候PHP报了Warning: require(): open_basedir restricti
- 配置了好多天都报错…我真的含泪写下这篇文章1. 首先我们打开sql sever2. 打开sql配置管理器将IP1和IP
- 1.视频分解图片我们使用cv2.VideoCapture来读取视频import cv2cap = cv2.VideoCapture('
- 配置环境:redhat6.5server1:redis(172.25.254.1)server2:php(172.25.254.2)serv
- 如下所示:函数说明type()返回数据结构类型(list、dict、numpy.ndarray 等)dtype()返回数据元素的数据类型(i