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;
}
}
0
投稿
猜你喜欢
- 代码如下:--建立数据表createtable TestData ( ID int identity(1,1) primary key, D
- asp+js做的一个dig程序中的投票(有的叫顶一下,踩一下),由于代码较长,只贴出核心部分:投票中的代码相关文章推荐:ajax +asp
- 以下为测试例子。 1.首先创建两张临时表并录入测试数据: 代码如下:create table #temptest1 ( id i
- 无意中看到以前在电脑上保存的一个html页面,关于div水平垂直居中的问题。如何实现div水平垂直居中呢?1.已知宽高度水平垂直居中posi
- 题目:用 JavaScript 代码实现空位补零,比如 pad(12, 3) => 012实现一:/* 平淡无奇法 */functio
- Sun Microsystems公司宣布,正式对外提供MySQL 5.1软件——这是全球最受欢迎的开
- 还是一个关于checkbox的一个普通的效果,就是根据你勾选的checkbox,列出你选择了哪些值演示代码:<!DOCTYPE htm
- 当你使用UPDATE, INSERT, DELETE语句更新数据的时候,你就改变了两个地方的数据:log buffer和data buffe
- 【作者翻译】结构和层次降低了复杂性并提高了可读性。你的文章或站点组织的越深入,用户就越容易理解你观点和得到你想传达的信息。在网页上,这点被通
- 当然有其它工具可以做这件事,但如果客户不允许你在服务器乱装东西时这个脚本就会有用了。 代码如下:DECLARE @tbImportTable
- 不同于其他软件项目,互联网项目的开发有其独有的特性。互联网项目开发不同于传统软件项目开发不同于需求定制性的软件开发公司。客户的需求是明确的,
- 年前帮manager 招GUI设计实习生 (PS. 这个实习生职位依然open,欢迎有兴趣的同学来投,邮箱jj.ying [at] hp.c
- 一、XML产生的背景 XML同HTML一样,都来自Standard Generalized Markup Language, 即标准通用标记
- 问题:这里只解决一个问题,到底什么是Access?设计一个数据库管理系统,用access在access里面设计好表,查询,然后再用vb做窗体
- 前言:最近某个时间开始,特别留意了一下Web标准中柱状图,也就是英文中的bar graph的实现。虽然实现方法各异,效果不尽相同,但是总体来
- 我们来看看MD5加密码的实现:注意看一下他数据库里的加密位数!先在通用处申明:Private Const BITS_TO
- 格式请使用 gif 或 jpg 或swf (flash)同一组广告请使用一种格式。命名命名方式:宽x高.图片格式x 必须小写 ; 图片格式
- 汉字转换为UTF-8的一段代码终于找到这段代码了,一个ASP写的中文转UTF-8,大家可以试试function chinese2u
- 先把我的browser信息说明一下:这是在opera里about中显示的“浏览器识别”Opera/9.62 (Windows NT 5.1;
- 阅读上一章:Chapter 13 为文字指定样式Chapter 14 图片替换随着更多设计师与开发者开始使用标准(特别是CSS),每天都会有