`

传统javascript事件模型实现观察者模式

阅读更多
    在W3C新的事件模型框架中,IE和Mozilla都实现了相应的版本,IE的是attachEvent和detachEvent来实现元素事件的添加和删除,而Mozilla则是标准的addEventListener和 removeEventListener。在传统的javascript事件模型中,我们没办法为一个页面元素注册多个事件,只有靠自己来实现观察者模式。代码来自《ajax in action》,我添加了注释
<!---->//命名空间
var jsEvent = new Array();

//构造函数
jsEvent.EventRouter = function(el,eventType){
 
//内部维护一个事件列表
 this.lsnrs = new Array();
 
this.el = el;
 el.eventRouter 
= this;
 
//注册回调函数
 el[eventType] = jsEvent.EventRouter.callback;
};

//添加事件
jsEvent.EventRouter.prototype.addListener = function(lsnr){
 
this.lsnrs.append(lsnr,true); 
} ;

//移除事件
jsEvent.EventRouter.prototype.removeListener=
function(lsnr){ 
this.lsnrs.remove(lsnr); 
}; 

//通知所有事件
jsEvent.EventRouter.prototype.notify = function(e){
 
var lsnrs = this.lsnrs;
 
for(var i=0;i<lsnrs.length;i++){
  
var lsnr = lsnrs[i];
  lsnr.call(
this,e);
 }
};
//回调函数调用notify
jsEvent.EventRouter.callback=function(event){
 
var e = event || window.event;
 
var router = this.eventRouter;
 router.notify(e);
};

Array.prototype.append 
= function(obj,nodup){
 
if(nodup){ 
  
this[this.length]=obj;
 }
};
Array.prototype.remove 
= function(o)
{
   
var i = this.indexOf(o);
   
if (i>-1)
  {
    
this.splice(i,1);
   }
     
return (i>-1);
   }  
}; 

这里比较巧妙的就是
 el.eventRouter = this;
//注册回调函数
 el[eventType] = jsEvent.EventRouter.callback;

首先给el元素添加属性
eventRouter是当前的EventRouter对象,然后,比如eventType假设为onclick,el是一个button元素,那么这里就是el[onclick]=jsEvent.EventRouter.callback;相当于el.onclick=jsEvent.EventRouter.callback;
而请注意这个回调函数
callback将首先得到元素的eventRouter对象,再调用此对象的notify方法触发所有注册的事件。

再请注意notify函数里面这一行:
 lsnr.call(this,e);

我们把event对象传入此函数作参,而
var e = event || window.event;那么所有事件函数的第一个参数都将是event对象,避免了IE需要通过window.event得到的事件对象的浏览器不一致行为。

使用此对象方式:
<!----> var mat=document.getElementById('mousemat');
  cursor
=document.getElementById('cursor');
  
var mouseRouter=new jsEvent.EventRouter(mat,"onmousemove");
  mouseRouter.addListener(writeStatus);
  mouseRouter.addListener(drawThumbnail); 




dennis 2007-03-16 09:19 发表评论
分享到:
评论

相关推荐

    学习JavaScript设计模式之观察者模式

    在JavaScript中,事件模型实际上是一种观察者模式的实现。它允许开发者通过注册事件监听器的方式来响应不同的用户交互事件。这种方式的好处在于,它可以广泛地应用于异步编程中,取代了传统编程中传递回调函数的方式...

    李晴川_JavaScript设计模式

    - **事件驱动**:JavaScript的设计模式实现常常围绕事件驱动进行,观察者模式和发布-订阅模式在Web开发中尤为常见。 - **回调函数和异步设计模式**:JavaScript是异步编程模型,回调函数、Promise、async/await等...

    javascript 设计模式

    JQuery作为一个广泛使用的JavaScript库,它自己也实现了一系列的设计模式,比如常见的CompositePattern(组合模式)、AdapterPattern(适配器模式)、ObserverPattern(观察者模式)、IteratorPattern(迭代器模式)...

    JS设计模式与开发实践

    - **原型继承**:JavaScript支持基于原型的继承机制,这不同于传统的基于类的继承模型,因此在实现某些设计模式时会有不同的处理方式。 - **函数式编程**:JavaScript支持高阶函数等函数式编程特性,使得函数不仅...

    JavaScript面向对象的支持

    尽管JavaScript的面向对象特性不同于其他语言,开发者依然可以使用如工厂模式、单例模式、观察者模式等常见的设计模式来组织代码。 了解JavaScript的这些面向对象特性对于编写高效、可维护的代码至关重要。同时,...

    基于MVC的JavaScript Web富应用开发 (英文版)

    - **事件监听与观察者模式**:JavaScript应用的核心是用户交互,通过监听事件来响应用户的操作。 - **事件监听**:使用addEventListener等方法绑定事件处理器。 - **事件取消**:阻止事件的默认行为或阻止事件传播...

    基于MVC的JavaScript Web富应用开发(英文,带书签)

    本书详细探讨了如何利用事件监听和观察者模式来增强应用程序的交互性。 - **监听事件**:注册事件监听器,以便在特定事件发生时执行相应的回调函数。 - **取消事件**:了解如何取消或阻止事件的默认行为,这对于...

    JavaScript面向对象的编程

    JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式和动态网页方面扮演着...在实际开发中,结合使用各种设计模式(如工厂模式、观察者模式、单例模式等)可以让JavaScript的面向对象编程更加灵活和强大。

    外文翻译_MVC设计模式.docx

    模型通常实现观察者模式,以便在数据更改时通知相关的视图组件进行更新。 2. **视图(View)**:视图负责展示数据给用户,即用户界面的表示。它可以有多种形式,比如图表、列表等。视图并不直接与模型通信,而是...

    javascript 面向对象程序设计博客文章

    面向对象设计模式在JavaScript中同样适用,如工厂模式、单例模式、观察者模式等,它们是解决特定问题的通用解决方案,有助于编写更清晰、更可扩展的代码。 以上就是JavaScript中面向对象程序设计的一些关键知识点,...

    javascript代码大全

    在“javascript代码大全”中,你可能还会发现关于jQuery库的使用、前端框架如React、Vue、Angular的应用示例,以及一些常见的JavaScript设计模式,如工厂模式、单例模式、观察者模式等。此外,可能还包括关于异步...

    软件模式的现状(1).zip

    首先,传统的设计模式如工厂模式、单例模式、观察者模式等,仍然是现代软件开发的基础。它们为初学者提供了一个理解面向对象编程和软件架构的良好起点。这些模式在各种编程语言中被广泛采用,成为了许多框架和库的...

    Node.js-EventBusOttoRxBus事件总线使用

    RxJava是一个强大的异步编程库,它将观察者模式和函数响应式编程结合在一起。RxBus使用`Observable`来发布事件,订阅者通过`subscribe()`方法订阅这些事件。RxBus的优势在于它可以提供更复杂的事件传播规则,如延迟...

    Event Based Programming

    1. **设计模式**:在事件驱动编程中,观察者模式是最常用的模式之一。观察者模式定义了一种一对多的依赖关系,让多个观察对象同时监听某一个主题对象,当主题对象的状态发生变化时,所有观察对象都会得到通知并自动...

    rxhandler一个简单的函数用于利用streams处理事件

    - **观察者模式**:理解观察者模式在Reactive Programming中的应用,以及如何通过`subscribe`方法来监听和响应事件。 - **错误处理**:学习如何在流中优雅地处理错误,如使用`catchError`操作符。 - **性能优化**:...

    前端项目-matreshka.zip

    总结来说,Matreshka.js是一个强大且灵活的JavaScript框架,它通过事件驱动、数据绑定和观察者模式,为开发者提供了构建现代化Web应用的强大工具。无论是在小型项目还是大型企业级应用中,Matreshka.js都能以其高效...

Global site tag (gtag.js) - Google Analytics