我有一个页面,它会生成一个弹出式浏览器窗口。我在父浏览器窗口中有一个 JavaScript 变量,我想将它传递给弹出的浏览器窗口。
有没有办法做到这一点?我知道这可以在同一浏览器窗口中跨帧完成,但我不确定是否可以跨浏览器窗口完成。
我有一个页面,它会生成一个弹出式浏览器窗口。我在父浏览器窗口中有一个 JavaScript 变量,我想将它传递给弹出的浏览器窗口。
有没有办法做到这一点?我知道这可以在同一浏览器窗口中跨帧完成,但我不确定是否可以跨浏览器窗口完成。
把代码放在这件事上,你可以从父窗口做到这一点:
var thisIsAnObject = {foo:'bar'};
var w = window.open("http://example.com");
w.myVariable = thisIsAnObject;
或者这个从新窗口:
var myVariable = window.opener.thisIsAnObject;
我更喜欢后者,因为无论如何您可能都需要等待新页面加载,以便您可以访问其元素或任何您想要的内容。
如果这些窗口来自同一个安全域,并且您有对另一个窗口的引用,是的。
Javascript 的 open() 方法返回对创建的窗口(或现有窗口,如果它重用现有窗口)的引用。以这种方式创建的每个窗口都有一个应用于它的属性“window.opener”,指向创建它的窗口。
然后可以使用 DOM(取决于安全性)访问另一个的属性,或其文档、框架等。
是的,脚本可以访问它们所处理的同一域中其他窗口的属性(通常通过 window.open/opener 和 window.frames/parent 获得)。调用在另一个窗口上定义的函数通常比直接摆弄变量更容易管理。
然而,窗口可能会消亡或继续前进,浏览器会以不同的方式处理它。在尝试调用它之前,检查窗口 (a) 是否仍然打开 (!window.closed) 并且 (b) 具有您期望的可用功能。
像字符串这样的简单值很好,但通常在窗口之间传递复杂的对象(如函数、DOM 元素和闭包)并不是一个好主意。如果子窗口存储来自其开启器的对象,则开启器关闭,该对象可能变为“死”(在某些浏览器中,例如 IE),或导致内存泄漏。可能会出现奇怪的错误。
在窗口之间传递变量(如果您的窗口在同一个域中)可以通过以下方式轻松完成:
可以将消息从“父”窗口传递到“子”窗口:
在“父窗口”中打开子窗口
var win = window.open(<window.location.href>, '_blank');
setTimeout(function(){
win.postMessage(SRFBfromEBNF,"*")
},1000);
win.focus();
根据上下文替换的
在“孩子”中
window.addEventListener('message', function(event) {
if(event.srcElement.location.href==window.location.href){
/* do what you want with event.data */
}
});
if 测试必须根据上下文进行更改