`

传统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核心技术与设计模式中文完整版PDF最新版本

    本书中详尽阐述了JavaScript中的经典设计模式,如单例模式、工厂模式、策略模式、观察者模式等。这些模式在JavaScript的应用开发中有着广泛的实际应用场景。例如,单例模式保证一个类仅有一个实例,并提供一个全局...

    JS设计模式与开发实践

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

    javascript 基础知识

    常见的设计模式包括单例模式、工厂模式、原型模式、观察者模式、迭代器模式等。 JavaScript基础知识覆盖了语言的核心机制、语法结构、数据处理、函数操作、事件处理、DOM操作、异步编程和网络通信等各个方面。掌握...

    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的优势在于它可以提供更复杂的事件传播规则,如延迟...

    强大安全多线程的Flux模式

    而MobX则利用观察者模式,简化了状态的响应式更新。 总的来说,“强大,安全,多线程的Flux模式”是JavaScript开发中实现高效状态管理的一种策略,它通过单向数据流和明确的角色分工,确保了复杂应用的稳定性和可...

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

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

    前端项目-matreshka.zip

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

Global site tag (gtag.js) - Google Analytics