3

如果我这样做:

var new_win = window.open();

如何使所有可以在父窗口中使用的功能现在都可以在子窗口中使用(new_win)?

不想这样做:

var fun1 = window.opener.fun1;
var fun2 = window.opener.fun2;
...
4

3 回答 3

5

请注意,接下来是危险的、肮脏的、凌乱的、M$ 级别的黑客攻击。我完全意识到这一点,但它(理论上)做了@Neal 想要的。(我什至有点害怕发布它,我完全期待投票)

var i, w = window.opener;
for (i in w)
{
    if (w.hasOwnProperty(i) && !window.hasOwnProperty(i) && typeof w[i] === 'function')
    {
        window[i] = w[i];
    }
}

鉴于范围问题,我决定我们必须使用.bind. 在MDN 条目中有一个用于 Function.bind的 shim,这对于某些浏览器是必需的。

请注意,在使用之前.bind,代码必须检查属性是否为函数。我已经在检查的同时完成了这项工作hasOwnProperty,但如果您希望传输值和函数,您可能希望在其自己的if语句中执行此操作。

var i, w = window.opener;
for (i in w)
{
    if (w.hasOwnProperty(i) && !window.hasOwnProperty(i) && typeof w[i] === 'function')
    {
        window[i] = w[i].bind(window);
    }
}
于 2011-11-01T14:46:42.207 回答
1

首先,我会创建一个命名空间(有助于避免函数冲突),然后我会在弹出窗口中引用它。

父窗口:

MyNameSpace = {
      // put functions, classes or whatever you want in here.
};

在弹出窗口中:

MyNameSpace = window.opener.MyNameSpace;

您所要求的唯一可能的问题是您调用的函数是否试图引用窗口对象。我会将一个窗口对象传递给任何操作窗口的函数。

例如

function (arg1, arg2, argn, windowHandle) {
      windowHandle = windowHandle || self;

      // do some stuff.

}
于 2011-11-01T14:54:46.660 回答
0

您可以创建一个函数的新实例并传递函数名称和可选的 argNs,如下所示

var parentFunction = new Function("name", "args", "return (window.opener != null) ?  opener.window[name](args) : false");

parentFunction('notification','waring, red, 2');
于 2011-11-01T17:11:13.667 回答