我可以将 JavaScript 变量传递给另一个浏览器窗口吗?

IT技术 javascript browser
2021-01-26 22:41:40

我有一个页面,它会生成一个弹出式浏览器窗口。我在父浏览器窗口中有一个 JavaScript 变量,我想将它传递给弹出的浏览器窗口。

有没有办法做到这一点?我知道这可以在同一浏览器窗口中跨帧完成,但我不确定是否可以跨浏览器窗口完成。

6个回答

把代码放在这件事上,你可以从父窗口做到这一点:

var thisIsAnObject = {foo:'bar'};
var w = window.open("http://example.com");
w.myVariable = thisIsAnObject;

或者这个从新窗口:

var myVariable = window.opener.thisIsAnObject;

我更喜欢后者,因为无论如何您可能都需要等待新页面加载,以便您可以访问其元素或任何您想要的内容。

@7dr3am7,我明白了,我收到“权限被拒绝”。但是如果我使用第二种方法,从新窗口,它工作正常。
2021-03-18 22:41:40
我正在使用第一个,它在 Chrome 中运行良好,但 IE 似乎在抱怨。而且很难找到断点。
2021-04-01 22:41:40
@MasoudSahabi,var x = {foo: 'bar'}只是用于创建对象的紧凑文字语法。它与var x = new Object(); x.foo = 'bar';
2021-04-03 22:41:40
我不明白 {foo:'bar'}。你能帮我解决这个问题吗?
2021-04-06 22:41:40
这会很棒,但现在 IE10 抱怨它,这不是目前跨浏览器兼容性的最佳方式。
2021-04-11 22:41:40

如果这些窗口来自同一个安全域,并且您有对另一个窗口的引用,是的。

Javascript 的 open() 方法返回对创建的窗口(或现有窗口,如果它重用现有窗口)的引用。以这种方式创建的每个窗口都有一个应用于它的属性“window.opener”,指向创建它的窗口。

然后可以使用 DOM(取决于安全性)访问另一个的属性,或其文档、框架等。

自从提出这个问题以来,情况发生了变化。现在也有可能,在新的浏览器,通过一个窗口之间的消息不同的安全域,通过调用window.postMessage
2021-03-24 22:41:40

是的,脚本可以访问它们所处理的同一域中其他窗口的属性(通常通过 window.open/opener 和 window.frames/parent 获得)。调用在另一个窗口上定义的函数通常比直接摆弄变量更容易管理。

然而,窗口可能会消亡或继续前进,浏览器会以不同的方式处理它。在尝试调用它之前,检查窗口 (a) 是否仍然打开 (!window.closed) 并且 (b) 具有您期望的可用功能。

像字符串这样的简单值很好,但通常在窗口之间传递复杂的对象(如函数、DOM 元素和闭包)并不是一个好主意。如果子窗口存储来自其开启器的对象,则开启器关闭,该对象可能变为“死”(在某些浏览器中,例如 IE),或导致内存泄漏。可能会出现奇怪的错误。

在窗口之间传递变量(如果您的窗口在同一个域中)可以通过以下方式轻松完成:

  1. 饼干
  2. 本地存储。只需确保您的浏览器支持localStorage,并做好变量维护(添加/删除/移除)以保持localStorage 干净。

可以将消息从“父”窗口传递到“子”窗口:

在“父窗口”中打开子窗口

    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 测试必须根据上下文进行更改