我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是CORS),而不留痕迹.有几个解决方案:
第一个可能是最糟糕的解决方案 - 你需要从当前窗口打开一个窗口,然后只要你打开窗户就可以进行通信.如果您在任何窗口中重新加载页面,则很可能会丢失通信.
第二种方法,使用postMessage,可能启用跨源通信,但遇到与第一种方法相同的问题.您需要维护一个窗口对象.
第三种方式,使用cookie,在浏览器中存储一些数据,这可以有效地看起来像向同一域上的所有窗口发送消息,但问题是你永远不知道所有标签是否已经读过"消息"打扫干净.您必须实现某种超时以定期读取cookie.此外,您受限于最大cookie长度,即4KB.
使用localStorage的第四种解决方案似乎克服了cookie的限制,甚至可以使用事件进行监听.接受的答案中描述了如何使用它.
编辑2018:接受的答案仍然有效,但现代浏览器有一个更新的解决方案,使用BroadcastChannel.有关如何使用BroadcastChannel在选项卡之间轻松传输消息的简单示例,请参阅其他答案.
我有两个窗口:窗口A和窗口B.
问题:
我知道这样做的两种方式:
但这两种方式并不那么优雅.
例如,获得窗口B的引用并使用window.postMessage()(HTML5)会很不错
最终的目标是制作像facebook这样的东西,如果你打开4个Facebook标签并在一个标签中聊天,聊天是最新的每个Facebook标签,这是整洁的!
我正在使用PHP和MySQL构建订单.
PHP表单有一个输入框,用户可以在其中键入产品代码.如果用户不知道产品代码,我希望他们点击输入框旁边的图像或按钮,这会打开一个包含所有产品代码列表的弹出窗口.然后,他们可以单击他们想要的产品,并将产品代码从弹出窗口传递到该表行的输入框.
我有我的页面的代码和它创建的页面的图像,所以你可以感受到我想要实现的目标.
父页面
<table border=0 id="hor-minimalist-a">
<tr>
<th valign=bottom>KVI</th>
<th valign=bottom>PACK CODE</th>
<th valign=bottom width=250>DESCRIPTION</th>
<th valign=bottom width=40>WHSE</th>
<th valign=bottom width=25>SU</th>
</tr>
<tr id="r1">
<td>
<input type=checkbox name=kvi1 id=kvi1 value=1>
</td>
<td>
<input size=10 type=number id=sku1 name=sku1 onchange="showUser(1, this.value)">
<input type="button" name="choice" onClick="window.open('sku.php','popuppage','width=400,toolbar=1,resizable=1,scrollbars=yes,height=400,top=100,left=100');" value="?">
</td>
<td>
<div align="left" id="txtHint1"> </div>
</td>
<td>
<div align="left" id="whse1"> </div>
</td>
<td>
<div align="left" id="su1"> </div>
</td>
</tr>
<tr id="r2">
<td>
<input type=checkbox name=kvi2 id=kvi2 value=2>
</td>
<td>
<input size=10 type=number id=sku2 name=sku2 onchange="showUser(2, this.value)"><img src=q.png> …
Run Code Online (Sandbox Code Playgroud) 我听说HTML5有window.postMessage()
,但似乎需要在窗口(或选项卡,整个问题)上有一个句柄,你要发布消息.如果我要向所有打开的窗口广播怎么办?这可能吗?
(我想要做的就是警告其他的窗口,没有任何服务器往返当用户做一些事情在影响别人一个窗口,使他们能够更新他们的内容.然而,虽然一些窗口可能从现有的开放--allowing我拦截和存储引用他们 - 一些新鲜的窗口可以由用户手动打开,然后选择书签或URL输入在这种情况下,似乎没有被拦截的方式和存储引用.)
所以在大多数当前浏览器中都有Tabs的功能,有没有办法获得Tab索引?
所以标签1在其中打开了www.google.com,标签2中打开了www.google.com,有没有办法识别标签索引是什么?
伪代码:
if($tab == 2) {
alert "Tab 2 is active\n";
}
if($tab == 1) {
alert "Please use Tab 2 as this is Tab 1\n";
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,我搜索的所有关于标签的内容都与网页本身的标签索引相关,叹息......
假设我有两个选项卡,每个选项卡都在不同的域上加载了一个网页.两个选项卡中的页面想要进行通信.
我能看到的最简单的解决方案就是这个 (我在搜索重复项时发现的一个密切相关的问题的答案),其中一个或两个页面加载一个中间页面iFrame,它代理事件postMessage()
和localStorage
事件.但是,这确实需要在某处托管此页面,以及客户端的额外请求.
是否有任何技术可以不需要专门的"代理页面"由其中一个域提供服务?(即可以通过没有支持服务器的JavaScript库实现?)
我正在开发一个Web应用程序,因为我只想在关闭应用程序的所有"选项卡"或用户关闭浏览器时注销用户.
有谁知道怎么做?
我有两个脚本.每个都在我们公司的不同子域上运行"Example.com".
Script #1 -- house.example.com
Script #2 -- bob.fred.example.com
Run Code Online (Sandbox Code Playgroud)
相同的域,不同的子域.
当一个特定元素出现时house.example.com
,我需要向运行的脚本发送一条消息bob.fred.example.com
由于Google扩展可以在扩展之间交换消息,因此必须有一种方法可以让TamperMonkey在脚本之间的相同扩展内交换消息 - 特别是如果它们在同一个二级域上运行.
谁能指出我正确的方向?一两个例子就值得用黄金来衡量.
更新:尽管Gothdo将浏览器标签/窗口之间的Javascript通信引用为包含此问题的答案,但他没有考虑所涉及的跨源策略.该引用问题中的答案都没有为跨源浏览器选项卡通信提供明确的答案,这是该问题的主要观点.我现在已经研究并解决了这个问题,从一些SO和非SO来源获取想法.如果重新打开这个问题,我会发布我的解决方案.
我有一个类项目用javascript创建html页面而不使用任何服务器端通信,第一个是关于用户输入特殊数字.在第一页中,教师必须输入有关其班级的信息和学生编号,然后完成后,他会点击下一步并打开一个新页面,询问每个学生的信息和成绩.但是当从第一页改为第二页时,学生编号的变量变得不确定.我正在使用这部分
var snum;
function savesnum(val){
snum =val;}
Run Code Online (Sandbox Code Playgroud)
并试过,
var snum;
function savesnum(){
snum = document.getElementById('stunb').value; }
Run Code Online (Sandbox Code Playgroud) javascript ×10
html5 ×3
browser ×2
postmessage ×2
browser-tab ×1
cross-domain ×1
greasemonkey ×1
html ×1
ipc ×1
jquery ×1
php ×1
popup ×1
tampermonkey ×1