我认为你不需要饼干。每个文档的js代码都可以访问其他文档元素。因此,您可以直接使用它们来共享数据。 你的第一个窗口w1打开w2并保存引用
var w2 = window.open(...)
在w2中,您可以使用window的opener属性访问w1。
如果文档的来源相同,甚至在HTML5之前就支持在不同的JavaScript执行上下文之间进行通信。如果没有,或者你没有引用另一个 Window 对象,然后你可以使用新的 的 postMessage API 强> 随HTML5一起推出。我在这两个方法中详细阐述了一下 stackoverflow的答案 。
Window
编辑: 使用Flash,您可以在任何窗口,任何浏览器之间进行通信(是的,在运行时从FF到IE)..某种形式的flash实例(ShockWave / activeX)
还有一种叫做的实验技术 Broadcast Channel API 专为具有相同来源的不同浏览器上下文之间的通信而设计。您可以发送消息并从其他浏览器上下文接收消息,而无需引用它:
Broadcast Channel API
var channel = new BroadcastChannel("foo"); channel.onmessage = function( e ) { // Process messages from other contexts. }; // Send message to other listening contexts. channel.postMessage({ value: 42, type: "bar"});
显然这是经验技术,并不是所有浏览器都支持。
窗口下方(w1)打开另一个窗口(w2)。任何窗口都可以向/从另一个窗口发送/接收消息。因此,我们应该理想地验证消息来自我们打开的窗口(w2)。
在w1
var w2 = window.open("abc.do"); window.addEventListener("message", function(event){ console.log(event.data); });
在w2(abc.do)
window.opener.postMessage("Hi! I'm w2", "*");
您可以通过本地存储API执行此操作。请注意,这仅适用于2个选项卡。您不能将发件人和收件人放在同一页面上:
在发件人页面上:
localStorage.setItem("someKey", "someValue");
在接收器页面上
$(document).ready(function () { window.addEventListener('storage', storageEventHandler, false); function storageEventHandler(evt) { alert("storage event called key: " + evt.key); } });
找到使用HTML5 localstorage的不同方法,我创建了一个包含API等事件的库:
sysend.on('foo', function(message) { console.log(message); }); var input = document.getElementsByTagName('input')[0]; document.getElementsByTagName('button')[0].onclick = function() { sysend.broadcast('foo', {message: input.value}); };
它会向所有其他页面发送消息,但不会向当前页面发送消息。