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

时间:2008-09-17 20:35:29

标签: javascript browser

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

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

14 个答案:

答案 0 :(得分:95)

将代码放入此事,您可以从父窗口执行此操作:

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

或者这个:

var myVariable = window.opener.thisIsAnObject;

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

答案 1 :(得分:39)

如果Windows来自同一个安全域,并且您有对另一个窗口的引用,那么。

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

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

答案 2 :(得分:7)

是的,脚本可以访问他们具有句柄的同一域中的其他窗口的属性(通常通过window.open/opener和window.frames / parent获得)。调用在另一个窗口上定义的函数通常更易于管理,而不是直接调整变量。

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

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

答案 3 :(得分:3)

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

  1. Cookies
  2. localStorage的。只需确保您的浏览器支持localStorage,并执行变量维护(添加/删除/删除)以保持localStorage清洁。

答案 4 :(得分:2)

在您的父窗口中:

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查询字符串解析例程。

答案 5 :(得分:2)

您可以非常轻松地传递变量并引用父窗口中的内容:

// 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!");   
}

答案 6 :(得分:2)

可以传递来自“父母”的消息。通往孩子的窗口&#39;窗口:

在父窗口中&#39;打开孩子

    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测试

答案 7 :(得分:1)

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

答案 8 :(得分:0)

或者,您可以将其添加到URL中,让脚本语言(PHP,Perl,ASP,Python,Ruby等)在另一端处理它。类似的东西:

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

答案 9 :(得分:0)

我一直在努力成功地将参数传递给新打开的窗口 以下是我提出的建议:

document.getElementById("a211094").onmouseover = null
document.getElementById("a211094").onmouseout = null

示例电话:

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)
    }
}

实例

http://jsfiddle.net/rj6o0jzw/1/

答案 10 :(得分:0)

您可以使用window.name作为Windows之间的数据传输 - 它也可以跨域工作。没有得到官方的支持,但根据我的理解,实际上跨浏览器的效果非常好。

More info here on this Stackoverflow Post

答案 11 :(得分:0)

对我来说,以下操作无效

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

// in new window
var B = window.opener.B;

但这有效(请注意变量名称)

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

// in new window
var B = window.opener.B;

var B也应该是全局的。

答案 12 :(得分:-1)

是浏览器清除所有参考。一个窗口。所以你必须在主窗口上搜索某个类的名称,或者使用cookie作为Javascript自制引用。

我的项目页面上有一个收音机。然后你打开收音机,它会在一个弹出窗口中启动,我控制主页面上的主窗口链接并显示播放状态,在FF中很容易,但在MSIE中则不那么容易。但它可以做到。

答案 13 :(得分:-2)

如果您对创建的窗口有引用,则window.open()函数也会允许此操作,前提是它位于同一个域中。 如果变量用于服务器端,则应使用$ _SESSION变量(假设您使用的是PHP)。