如果我这样做:
var new_win = window.open();
如何使所有可以在父窗口中使用的功能现在都可以在子窗口中使用(new_win
)?
我不想这样做:
var fun1 = window.opener.fun1;
var fun2 = window.opener.fun2;
...
如果我这样做:
var new_win = window.open();
如何使所有可以在父窗口中使用的功能现在都可以在子窗口中使用(new_win
)?
我不想这样做:
var fun1 = window.opener.fun1;
var fun2 = window.opener.fun2;
...
请注意,接下来是危险的、肮脏的、凌乱的、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);
}
}
首先,我会创建一个命名空间(有助于避免函数冲突),然后我会在弹出窗口中引用它。
父窗口:
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.
}
您可以创建一个函数的新实例并传递函数名称和可选的 argNs,如下所示
var parentFunction = new Function("name", "args", "return (window.opener != null) ? opener.window[name](args) : false");
parentFunction('notification','waring, red, 2');