`
xshq
  • 浏览: 44637 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

javascript Observer模式

阅读更多
<script>
Array.prototype.append = function(obj, nodup) {
	if(!(nodup && this.contains(obj))) {
		this[this.length] = obj;
	}
}

Array.prototype.contains = function(obj) {
	return (this.indexOf(obj)>=0);
}

Array.prototype.indexOf = function(obj) {
	var result = -1;
	for(var i=0; i<this.length; i++) {
		if(this[i]==obj) {
			result = i;
			break;
		}
	}
	return result;
}

Array.prototype.clear = function() {
	this.length = 0;
}

Array.prototype.insertAt = function(index, obj) {
	this.splice(index, 0, obj);
}

Array.prototype.removeAt = function(index) {
	this.splice(index, 1);
}

Array.prototype.remove = function(obj) {
	var index = this.indexOf(obj);
	if(index>=0)
		this.removeAt(index);
}
</script>
<script>
Router = function(el, e) {
	this.lsnrs = [];
	el.router = this;
	el[e] = Router.callback;
}

Router.prototype.addListener = function(lsnr, argArray) {
	lsnr.argArray = argArray;
	this.lsnrs.append(lsnr, true);
}

Router.prototype.removeListener = function(lsnr) {
	this.lsnrs.remove(lsnr);
}

Router.prototype.notify = function(e) {
	for(var i=0; i<this.lsnrs.length; i++)
		this.lsnrs[i].apply(e.srcElement, this.lsnrs[i].argArray);
}

Router.callback = function() {
	var router = this.router;
	router.notify(window.event);
}

function test1(a) {
	alert(a)
}
function test2(a,b) {
	alert(a+b)
}
function test3(a,b,c) {
	alert(a+b+c)
}
window.onload = function() {
	var el = document.getElementById("bt");
	var router = new Router(el, "onclick")
	router.addListener(test1,[1]);
	router.addListener(test2,[1,2]);
	router.addListener(test3,[1,2,3]);
	router.removeListener(test2);
}
</script>
<input id="bt" type="button" value="button" />

 

分享到:
评论
2 楼 xshq 2009-07-24  
zdz8207 写道
楼主的方法只能运行在ie下面啊
事件监听还不如用浏览器自己的特性封装一下


谢谢提醒,之前确实没有考虑跨浏览器问题。这样封装的好处是可以动态添加和删除事件的监听方法,而且方法的个数也不限制。
把代码修改了一下,解决了跨浏览器问题。
<script>
Array.prototype.append = function(obj, nodup) {
	if(!(nodup && this.contains(obj))) {
		this[this.length] = obj;
	}
}

Array.prototype.contains = function(obj) {
	return (this.indexOf(obj)>=0);
}

Array.prototype.indexOf = function(obj) {
	var result = -1;
	for(var i=0; i<this.length; i++) {
		if(this[i]==obj) {
			result = i;
			break;
		}
	}
	return result;
}

Array.prototype.clear = function() {
	this.length = 0;
}

Array.prototype.insertAt = function(index, obj) {
	this.splice(index, 0, obj);
}

Array.prototype.removeAt = function(index) {
	this.splice(index, 1);
}

Array.prototype.remove = function(obj) {
	var index = this.indexOf(obj);
	if(index>=0)
		this.removeAt(index);
}
</script>
<script>
Router = function(el, e) {
	this.lsnrs = [];
	el.router = this;
	el[e] = Router.callback;
}

Router.prototype.addListener = function(lsnr, argArray) {
	lsnr.argArray = argArray;
	this.lsnrs.append(lsnr, true);
}

Router.prototype.removeListener = function(lsnr) {
	this.lsnrs.remove(lsnr);
}

Router.prototype.notify = function(el) {
	for(var i=0; i<this.lsnrs.length; i++)
		this.lsnrs[i].apply(el, this.lsnrs[i].argArray);
}

Router.callback = function(eventTag) {

	var el = window.event?window.event.srcElement:eventTag.target;
	var router = this.router;
	router.notify(el);
}

function test1(a) {
	alert(a)
}
function test2(a,b) {
	alert(a+b)
}
function test3(a,b,c) {
	alert(a+b+c)
}

window.onload = function() {
	var el = document.getElementById("bt");
	var router = new Router(el, "onclick");
	router.addListener(test1,[1]);
	router.addListener(test2,[1,2]);
	router.addListener(test3,[1,2,3]);
	router.removeListener(test2);
}
</script>
<input type="button" id="bt" value="button" />
1 楼 zdz8207 2009-07-23  
楼主的方法只能运行在ie下面啊
事件监听还不如用浏览器自己的特性封装一下

相关推荐

    Observer模式

    Observer模式,也被称为“发布-订阅”模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Observer模式是实现...

    JavaScript设计模式.pdf

    9. 观察者模式(Observer Pattern): 观察者模式是用于对对象的状态进行观察,并且当它发生变化时能得到通知的方法。它的主要作用是使对象之间的耦合降低,提高系统的灵活性和可扩展性。 10. 命令模式(Command ...

    设计模式之Observer

    例如,Web开发中的事件监听、JavaScript中的事件处理、Android中的BroadcastReceiver等都是Observer模式的实例。 在阅读《设计模式之Observer》这篇博文中,作者可能会深入解析Observer模式的实现细节,包括如何...

    Javascript 设计模式系统讲解与应用

    在深入探讨《JavaScript设计模式系统讲解与应用》的内容之前,我们先来了解一下设计模式的基本概念以及为什么它对于前端开发人员尤为重要。设计模式是一套被反复使用的、经过分类编目的、包含结构化的解决方案,用于...

    JavaScript模式

    基于给定的信息“JavaScript模式”,我们可以深入探讨书中所涉及的各种设计模式、编程技巧以及最佳实践。本书由Stoyan Stefanov撰写,陈新翻译,主要针对JavaScript开发者,旨在帮助他们理解并应用各种软件设计模式...

    Observer(观察者模式)学习源码

    Observer模式,也称为订阅或发布-订阅模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件...

    JavaScript高级与设计模式.zip

    3. **观察者模式(Observer)**:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在事件驱动的JavaScript中广泛使用。 4. **装饰者模式(Decorator)**...

    javascript实现观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的对象。在JavaScript中,观察者模式的实现可以帮助我们构建可扩展、松耦合的系统。这篇...

    对于Observer的扩展研究

    《对Observer模式的深入探索与应用》 Observer模式,又称为发布-订阅(Publish-Subscribe)模式或事件驱动(Event-driven)模式,是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    观察者(Observer)模式详解

    此外,许多现代编程语言和框架,如JavaScript的事件监听、C#的委托和事件、Android的BroadcastReceiver,都采用了观察者模式的思想。 总之,观察者模式是一种强大的设计工具,它使得对象之间的交互更加灵活,同时...

    JavaScript观察者模式(经典).docx

    JavaScript观察者模式是一种基于事件驱动的设计模式,它允许对象在状态改变时自动通知其他相关对象。这个模式在软件开发中非常常见,特别是在JavaScript这样的动态语言中,因为JavaScript的事件模型就是观察者模式的...

    JavaScript类的设计模式

    JavaScript 类的设计模式是一种在开发过程中遵循的一套最佳实践和结构化方法,用于创建可维护、可扩展和可重用的代码。设计模式是解决常见编程问题的经验总结,它们不是具体的代码实现,而是解决特定问题的通用解决...

    javascript观察者模式有什么方法_javascript观察者模式有哪些方法.docx

    ### JavaScript观察者模式详解 #### 一、观察者模式概念 观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象间的一种一对多依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    Javascript设计模式之观看者模式(推举)_.docx

    在JavaScript编程中,设计模式是一种最佳实践,用于解决常见的编程问题和提高代码的可维护性。观看者模式(Observer Pattern)或称为发布-订阅模式,是这些设计模式中的一种,它提供了一种方法来实现对象之间的松...

    javascript的oop思想以及单例,工厂,观察者模式简例

    本篇文章将深入探讨JavaScript的OOP思想,并通过实际代码示例介绍单例模式、工厂模式和观察者模式。 首先,面向对象编程的核心概念是类和对象。在JavaScript中,虽然没有传统的类定义,但可以通过构造函数来模拟类...

    观察者模式(Observer)

    在实际开发中,很多框架和库也内置了观察者模式,如JavaScript中的EventEmitter(Node.js)、C#的事件和委托,以及Android中的BroadcastReceiver等。这些工具使得开发者可以更便捷地应用观察者模式,提高代码的可...

    深入理解JavaScript中的观察者模式:实现与应用

    在JavaScript中,观察者模式的应用可以提升程序的可维护性和扩展性。 观察者模式主要涉及两个角色:观察者(Observer)和被观察者(Subject)。观察者负责注册到被观察者那里,当被观察者的状态发生变化时,观察者...

    music-player:使用Observer模式的Vanilla JS项目

    音乐播放器是现代数字生活中的常见元素,而在这个项目中,我们关注的是如何利用Observer模式来实现一个纯JavaScript(Vanilla JS)版本的音乐播放器。Observer模式,也称为发布-订阅模式,是一种设计模式,它定义了...

    pro javascript design patterns

    ### 观察者模式(Observer Pattern) 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在JavaScript中,可以通过事件监听机制来实现。 ### ...

    JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解

    主要介绍了JavaScript编程设计模式之观察者模式(Observer Pattern),简单说明了观察者模式的概念、原理并结合实例形式详细给出了观察者模式的相关实现与使用技巧,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics