【javascript】同域多网页之间通讯问题:调用方法传参与调用队列问题

负心杏 发布于 2016/09/05 16:43
阅读 296
收藏 0

业务需要,显示项目较多。工作人员有多个显示屏(一般2个屏幕),一个屏幕显示一个浏览器窗口,每个屏幕显示不同的模块内容。

目前基本已经实现业务模块化(最基础的javascript的应用,没用任何高大上技术),配置哪个屏幕有哪些模块。

问题是网页之间通讯。

两个网页之间通讯的两种方法:

第一种:【必须】用window.open 打开第二屏网页,第一屏需要【保持】window.open的返回值,第二屏使用window.opener对象。然后就能互相调用(旧解决方法),新版html的postMessage可以跨域信息传递。这种限制性大:已经用【】标出:打开多个网页,或者用url打开网页都会有问题;但是能互相调用方法(postMessage不考虑,只能传递字符串?)。


第二种:通过localstorage的存储某固定格式属性的值(键格式:固定值+模块名;值格式:方法名+参数)。localstorage值的变动事件会通知同域网页(window.onstorage 监听 ),网页对键值变动情况进行分析,如果是自己网页内模块就处理,不是不做处理。

第一种对操作人员要求多,个人倾向于第二种,但是存在两个问题:

一:localstorage变动后,获取到需要调用的模块、方法、参数,执行动态调用时的传参问题:

//APP.mods存本浏览器页面的{模块名:模块对象}

APP.mods["mod_name"]["mod_function_name"](参数);

//或者:
APP.mods["mod_name"]["mod_function_name"].call(null, 参数);

这个参数,可能模块方法有的定义了,有的没定义,也有的定义好几个参数,有的只有一个,但我这统一调用要怎么传递参数?

二:因为多页面共享一个localstorage(本质是一个键值对集合),所以当频繁互相调用时会不会有同步问题?所以考虑队列调用?

加载中
0
zabcd117
zabcd117
如果你不在意flash的话,可以使用LocalConnection,你所有的问题都能解决,管你是不是同一个域,是不是同一个parent,唯一要注意的,就是同一个浏览器。封装也很简单,就是字符串的传递,估计用不了30行代码,封装下给js用就可以了。你可以自行搜索下。
负心杏
昨天才开始整这块,原型很好实现。封装swf费了半天劲,应用到业务还有很多细节需要调整……大部分都整好了。基本确定作为主要方案。
zabcd117
zabcd117
回复 @负心杏 : 嗯,笔误笔误
负心杏
查了下api介绍,应该可行,试后再回。类名应该是:LocalConnection
0
wuyiw
wuyiw

APP.mods["mod_name"]["mod_function_name"].apply(null, [参数0, 参数1, ...]);

同步问题我没经历过不好评价. 不过如果条件允许(都用同一家浏览器)的话, 倒是可以写个浏览器插件, 标签页和后台页发消息, 后台页进行调度.

负心杏
谢谢。浏览器插件……没接触过,有点高端。
返回顶部
顶部