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

时间:2020-03-05 18:59:57  来源:igfitidea点击:

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

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

解决方案

回答

如果我们对创建的窗口有引用,并且它在同一域中,则window.open()函数也将允许此操作。
如果在服务器端使用了该变量,则应该使用$ _SESSION变量(假设我们正在使用PHP)。

回答

如果这些窗口来自同一安全域,并且我们对另一个窗口有引用,可以。

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

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

回答

是的,只要两个窗口都在同一域中就可以完成。 window.open()函数将返回新窗口的句柄。子窗口可以使用DOM元素" opener"访问父窗口。

回答

另外,我们也可以将其添加到URL中,并让脚本语言(PHP,Perl,ASP,Python,Ruby等)在另一侧进行处理。就像是:

var x = 10;
window.open('mypage.php?x='+x);

回答

在父窗口中:

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']);

在解析键/值对时,可能应该进行很多错误检查,但此处未包括在内。也许有人可以在以后的答案中提供更具包容性的Javascript查询字符串解析例程。

回答

将代码放入问题中,我们可以在父窗口中执行以下操作:

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获得)。通常,调用另一个窗口上定义的函数比直接使用变量来管理更容易管理。

但是,窗口可能会死掉或者继续前进,而浏览器在处理窗口时会有所不同。在尝试调用窗口之前,请检查窗口(a)仍处于打开状态(!window.closed)和(b)具有我们期望的功能。

像字符串之类的简单值很好,但是通常不要在窗口之间传递诸如函数,DOM元素和闭包之类的复杂对象。如果子窗口从其打开器中存储对象,则打开器将关闭,该对象可能会"死"(在某些浏览器中,例如IE),或者导致内存泄漏。可能会发生奇怪的错误。