WWW中的页面间通信?

Posted

技术标签:

【中文标题】WWW中的页面间通信?【英文标题】:Inter-Page communication in WWW? 【发布时间】:2013-10-21 13:10:31 【问题描述】:

有没有办法在javascript中的多个网页之间进行客户端进程间通信?理想情况下,我希望在没有任何复杂的服务器状态更新、ping 等的情况下完成此操作,并使其仅在客户端上工作。如果我也可以制作这个跨浏览器,我会在天堂哈哈。有任何想法吗?谢谢!

【问题讨论】:

cookies、查询字符串、本地存储 您是指在同一台计算机上吗?还是点对点? @user2736012 但是没有推送能力?我认为 localStorage 仍然需要某种忙等待(除非有 onChange() 回调或其他东西......)@BraveNewCurrency 在同一台计算机上,没有任何东西返回服务器。 Communication between tabs or windows的可能重复 【参考方案1】:

试试这个message writer的代码

function sendMessage(name, value) 
    var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";


sendMessage("test", "hello world!")

打开第二个窗口并try this message listener

function getMessage(c_name) 
    if (document.cookie.length > 0) 
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) 
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) 
                c_end = document.cookie.length;
            
            return unescape(document.cookie.substring(c_start, c_end));
        
    
    return "";

function check() 
    var message = getMessage('test');
    var element = document.getElementById('output');
    element.innerhtml = message;

window.setInterval(check, 1000);

在 Chrome 上运行良好,您还应该确保它在其他主流浏览器中也能运行,特别是在 IE 上

【讨论】:

不不不,我希望这是无请求的。我不想依赖服务器实例来工作。我认为 localStorage 方法可能是唯一的方法。 它根本不使用服务器,虽然它写入cookie,但它不更新服务器会话数据,只是在单个浏览器中某个域的页面之间共享的浏览器cookie .如果您使用的是 FF,您可以使用 Chrome 开发者工具或 Firebug 上的网络活动标签来检查这一点。【参考方案2】:

有很多方法可以进行窗口间通信。它们是 Window.postMessage、Local Storage、WebRTC,以及现在的 Shared Web Workers。

这些都有自己的优点/缺点:

本地存储仅适用于同源页面(源是协议://网站:端口)。它还将消息广播到同一来源的每个打开的窗口,因此如果您打开大量页面,它会很慢)不幸的是,这是 IE11 及以下版本支持的唯一跨窗口技术。 Shared Workers 仅在 Chrome 和 Firefox 中受支持(也仅支持同源,且 worker.js 文件必须从同源加载)。您还必须将通信流量从一个页面“中继”到另一个页面。 Window.postMessage 只在父/子窗口之间有效,但支持跨域!

在两个独立网站之间进行跨域通信真的很笨重。您要么必须从第一个网站执行 window.open() 并使用 postMessage 与第二个网站进行通信,要么您必须设置这个复杂的架构,在每个站点上使用隐藏的 iframe 与托管的网页对话在同一个网站地址上,然后这些 iframe 通过 Local Storage 或 Shared Worker 相互通信。这被称为“通信中心”。 (相当复杂,对吧?)

更糟糕的是,页面间通信已被视为安全漏洞并且几乎被回避。如果有些人有他们的方式,我想跨域 postMessage 将被删除。我希望看到的是一些协议增强和一些类似 oAuth 的技术,因此我们可以保护该技术并使其合理。未来将有大量数据移动到客户端,在网页之间共享数据将变得至关重要。

也就是说,不要重新制造***。有几个库可以实现窗口间通信。

Endpoint.js - 我开发的一个库(免责声明),它调解窗口(在多个来源)、选项卡、Web 工作者、客户端/服务器以及进程之间的 IPC 之间的通信。它还创建了一个 ad-hoc 覆盖网络,允许所有这些技术相互传递信息。 crosstab - 实现上面的“通信中心”方法。 ozp-iwc - OZone Widget Framework 的 IPC 框架。启用本地存储和 PostMessage

【讨论】:

以上是关于WWW中的页面间通信?的主要内容,如果未能解决你的问题,请参考以下文章

服务间通信

浏览器窗口间通信

教你如何实现页面间的数据通信

如何实现electron多页面间通信

线程间通信-使用EventHandler下载网络图片

Java进程间通信和线程间通信?