JS观察者设计模式:实现iframe之间快捷通信

观察者设计模式又称订阅发布模式,在JS中我们习惯叫做广播模式,当多个对象监听一个通道时,只要发布者向该通道发布命令,订阅者都可以收到该命令,然后执行响应的逻辑。今天我们要实现的就是通过观察者设计模式,实现iframe之间的通信。

一、top对象

一般的JS书里都会在讲框架集的时候讲top,这会让人误解,认为top对象只是代表框架集,其实top的含义应该是说浏览器直接包含的那一个页面对象,也就是说如果你有一个页面被其他页面以iframe的方式包含了,无论包含的层级是什么,都可以用top访问最外层的哪一个页面,因为这个页面被浏览器直接包含,这个事情的意义在于如果多个页面被同时加载,他们之间需要通信,就完全可以在最外层的页面设置一个通信对象,其他页面都通过这个对象进行通信(需要说明的是,如果要这么干,需要将他们部署在服务器上进行测试,仅仅在文件系统上测试,可能因为跨域而测试失败)。

二、搭建广播站

(function(top,undefined){
	var observerAble={};
	var radioStation={};
	radioStation.subscription=function(channel,obj){
			if(!observerAble[channel]){
				var array=new Array();
				array.push(obj);
				observerAble[channel]=array;
			}else{
				observerAble[channel].push(obj);
			}
		};
	radioStation.broadcast=function(channel,data){
			for(var item in observerAble[channel]){
				observerAble[channel][item].update(data);
			}
		};
	top.radioStation=radioStation;
}(top))

  我们将广播站放到top对象中,后面的所有iframe都可以从top中获得该对象。我们只要建立通道,一旦广播站对该通道发布命令,我们就可以从update方法中获取命令参数。

三、测试

1、radioStation.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script type="text/javascript" src="jquery-3.2.1.js"></script>
	<!-- 引入广播站,创建广播站对象-->
	<script type="text/javascript" src="RadioStation.js"></script>
</head>
<body>
	<button id="broadcast">broadcast</button>
	<iframe src="radioStation2.html" frameborder="0"></iframe>
	<div id="topdiv1"></div>
	<div id="topdiv2"></div>
	<script>
		function sayHello(){
			this.update=function(data){
				$("#topdiv1").text(data);
			}
		}
		function sayGoodBye(){
			this.update=function(data){
				$("#topdiv2").text(data);
			}
		}
		var sayhello=new sayHello();
		var saygoodbye=new sayGoodBye();
		//订阅
		radioStation.subscription("hello",sayhello);
		radioStation.subscription("hello",saygoodbye);
		//广播
		$("#broadcast").click(function(){
			radioStation.broadcast("hello",‘hello radioStation‘);
		});

	</script>
</body>
</html>

  2、radioStation2.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script type="text/javascript" src="jquery-3.2.1.js"></script>
</head>
<body>
	我是一个iframe
	<div id="iframediv1"></div>
	<div id="iframediv2"></div>
	<script>
		function sayHello(){
			this.update=function(data){
				$("#iframediv1").text(data);
			}
		}
		function sayGoodBye(){
			this.update=function(data){
				$("#iframediv2").text(data);
			}
		}
		var sayhello=new sayHello();
		var saygoodbye=new sayGoodBye();
		//订阅,从最外层的窗口对象top中获取radioStation对象
		top.radioStation.subscription("hello",sayhello);
		top.radioStation.subscription("hello",saygoodbye);
	</script>
</body>
</html>

  四、效果

时间: 2024-08-02 06:04:13

JS观察者设计模式:实现iframe之间快捷通信的相关文章

window之间、iframe之间的JS通信

一.Window之间JS通信 在开发项目过程中,由于要引入第三方在线编辑器,所以需要另外一个窗口(window),而且要求打开的window要与原来的窗口进行js通信,那么如何实现呢? 1.在原窗口创建新打开window的一个对象: var new_window; var url = 'http:://second.com'; new_window = window.open(url, 'new_window'); 新窗口里有一个say()方法: function say() { alert('

js组件之间的通信

应用场景: 1.在刷微博的时候,滑到某个头像上,会出现一张usercard(用户名片), 微博列表区有这个usercard, 推荐列表也有这个usercard,评论区也有. 2.在网上购物时,购物车安静的停留在页面的角落里,不声不响.你在页面上买了零食买了书,购物车还是安静的呆着,猛然间点开一看,安静的购物车已经躺满了. 以上两种,在模块化满天飞的今天,当然不可能面向过程的一一开发,你不能在微博列表,微博推荐和评论中逐一把用户名片功能开发一遍.实际上,常见 的做法是将usercard作为一个组件

Cocos中的观察者设计模式与通知机制

观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是 MVC( 模型-视图-控制器)模式的重要组成部分.天气一直是英国人喜欢讨论的话题,而最近几年天气的变化也成为中国人非常关注的话题.我会根据天气预报决定是坐地铁还是开车上班,我的女儿也会根据天气预报决定明天穿哪件衣服.于是我在移动公司为我的手机定制了天气预报短信通知服务,它的工作模型如图所示. 每天气象局将天气预报信息投送给移动运营商,移动运营商的短信中心负责把天气预报发送给定制过这项服务的手机.在软件系统

两个iframe之间的异步通信

艾伦说过,一切学习都是从模仿开始,我也不例外.下面我要说的是两个页面之间的通信问题. 假设现有a.html 需要与b.html进行数据交互,a通过iframe加载b.html a.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <iframe src="b.html" style=&quo

Cocos观察者设计模式和通报机制

观察员(Observer)模式也称为公告/订阅(Publish/Subscribe)模式.这是 MVC( 模型-视图-控制器)模型的重要组成部分.天气一直讨论的英国最喜欢的话题,近期天气变化几年已成为非常关注的中国人的话题.会依据天气预报决定是坐地铁还是开车上班,我的女儿也会依据天气预报决定明天穿哪件衣服.于是我在移动公司为我的手机定制了天气预报短信通知服务,它的工作模型如图所看到的. 每天气象局将天气预报信息投送给移动运营商,移动运营商的短信中心负责把天气预报发送给定制过这项服务的手机.在软件

利用DNode实现php和nodejs之间的通信

一,安装DNode, 1, for nodejs, 执行 $ sudo npm install dnode 2, for php, 利用composer来安装DNode php 执行下列语句下载composer $ wget http://getcomposer.org/composer.phar 创建一个文件composer.json,然后填入如下语句, {     "require": {         "dnode/dnode": "0.2.0&q

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

组件之间的通信(子组件-改变父组件的值)

在vue中,组件之间的通信,是不建议子组件改变父组件的值,因为一个父组件有可能会有很多子组件,改来改去会很难管理(别人都这样说,我信) 试试: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src='../vue.js'> </script> </head> <bod

Angularjs controller之间的通信

刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: 1 <html> 2 <script src="http://apps.bdimg.com/libs/angular.js/1.3.9/angular.min.js"></script> 3 <body> 4 <div ng-app="app"> 5 <div ng-c