我可以传递一个JavaScriptvariables到另一个浏览器窗口吗?
我有一个页面,产生一个popup浏览器窗口。 我在父浏览器窗口中有一个JavaScriptvariables,我想将它传递给popup的浏览器窗口。
有没有办法做到这一点? 我知道这可以在同一个浏览器窗口跨框架完成,但我不知道是否可以跨浏览器窗口完成。
如果窗口来自同一个安全域,并且你有一个对另一个窗口的引用,那么是的。
Javascript的open()方法返回一个对创build的窗口的引用(或者现有的窗口,如果它重用了现有的窗口的话)。 以这种方式创build的每个窗口都获得应用于它的属性“window.opener”,指向创build它的窗口。
然后,可以使用DOM(依赖于安全性)来访问另一个的属性,或者其文档,框架等。
把代码放在这个问题上,你可以从父窗口执行:
var thisIsAnObject = {foo:'bar'}; var w = window.open("http://example.com"); w.myVariable = thisIsAnObject;
或从新窗口中:
var myVariable = window.opener.thisIsAnObject;
我更喜欢后者,因为您可能需要等待新页面加载,以便您可以访问其元素或任何你想要的。
是的,脚本可以访问其他窗口的属性(通常通过window.open/opener和window.frames / parent获得)。 调用另一个窗口中定义的函数通常更易于pipe理,而不是直接调用variables。
但是,Windows可能会死亡或者继续前进,浏览器在处理时会有所不同。 检查窗口(a)是否仍然打开(!window.closed),并且(b)具有您期望可用的function,然后尝试调用它。
像string这样的简单值很好,但是通常在窗口之间传递函数,DOM元素和闭包等复杂对象并不是一个好主意。 如果一个子窗口从其开启者存储一个对象,那么开启者closures,那个对象可能会变成“死亡”(在某些浏览器中,比如IE),或者导致内存泄漏。 奇怪的错误可以随之而来。
在窗口之间传递variables(如果你的窗口在同一个域上)可以通过以下方式轻松完成:
- cookies
- localStorage的。 只要确保您的浏览器支持localStorage,并执行variables维护权限(添加/删除/删除),以保持localStorage清洁。
在你的父窗口中:
var yourValue = 'something'; window.open('/childwindow.html?yourKey=' + yourValue);
然后在childwindow.html中:
var query = location.search.substring(1); var parameters = {}; var keyValues = query.split(/&/); for (var keyValue in keyValues) { var keyValuePairs = keyValue.split(/=/); var key = keyValuePairs[0]; var value = keyValuePairs[1]; parameters[key] = value; } alert(parameters['yourKey']);
在parsing你的键/值对的时候,你应该做很多的错误检查,但是我没有在这里包括它。 也许有人可以在稍后的答案中提供更具包容性的Javascript查询stringparsing例程。
你可以传递variables,并很容易地引用父窗口中的东西:
// open an empty sample window: var win = open(""); win.document.write("<html><body><head></head><input value='Trigger handler in other window!' type='button' id='button'></input></body></html>"); // attach to button in target window, and use a handler in this one: var button = win.document.getElementById('button'); button.onclick = function() { alert("I'm in the first frame!"); }
是的,只要两个窗口在同一个域上就可以完成。 window.open()函数将返回一个句柄到新窗口。 子窗口可以使用DOM元素“opener”访问父窗口。
可以将消息从“父”窗口传递给“子”窗口:
在“父窗口”打开孩子
var win = window.open(<window.location.href>, '_blank'); setTimeout(function(){ win.postMessage(SRFBfromEBNF,"*") },1000); win.focus();
要根据上下文进行replace
在“孩子”
window.addEventListener('message', function(event) { if(event.srcElement.location.href==window.location.href){ /* do what you want with event.data */ } });
iftesting必须根据上下文进行更改
或者,您可以将其添加到URL中,让脚本语言(PHP,Perl,ASP,Python,Ruby等)在另一端处理它。 就像是:
var x = 10; window.open('mypage.php?x='+x);
我努力成功地将parameter passing给新打开的窗口。
这是我想出来的:
function openWindow(path, callback /* , arg1 , arg2, ... */){ var args = Array.prototype.slice.call(arguments, 2); // retrieve the arguments var w = window.open(path); // open the new window w.addEventListener('load', afterLoadWindow.bind(w, args), false); // listen to the new window's load event function afterLoadWindow(/* [arg1,arg2,...], loadEvent */){ callback.apply(this, arguments[0]); // execute the callbacks, passing the initial arguments (arguments[1] contains the load event) } }
示例调用:
openWindow("/contact",function(firstname, lastname){ this.alert("Hello "+firstname+" "+lastname); }, "John", "Doe");
现场示例
您可以使用window.name
作为窗口之间的数据传输 – 它也可以跨域使用。 没有正式的支持,但从我的理解来看,实际上跨浏览器工作得很好。
更多的信息在这个Stackoverflow的post
是浏览器清除所有参考。 为一个窗口。 所以你必须在主窗口上search某个类的名字,或者使用cookies作为Javascript自制的参考。
我的项目页面上有收音机。 然后你打开收音机,它在一个popup窗口中开始,我控制主页面上的主窗口链接,并显示播放状态,在FF中它很容易,但在MSIE中并不那么容易。 但是可以做到。
如果你有一个对创build的窗口的引用,window.open()函数也会允许这个,只要它在同一个域上。 如果variables用于服务器端,则应该使用$ _SESSIONvariables(假设您正在使用PHP)。