如果我这样做:
var new_win = window.open();
如何创建它以便现在可以在子窗口中使用父窗口中可以使用的所有函数(new_win
)?
我不想要这样做:
var fun1 = window.opener.fun1;
var fun2 = window.opener.fun2;
...
答案 0 :(得分:5)
请注意以下内容是危险的,肮脏的,凌乱的,M $级别的黑客攻击。我完全清楚这一点,但它(理论上)做了@Neal想要的。 (我有点害怕甚至发布它,我完全期待downvotes)
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 Entry for Function.bind有一个垫片,对某些浏览器来说是必需的。
请注意,在使用.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);
}
}
答案 1 :(得分:1)
首先,我会创建一个命名空间(有助于避免函数冲突),然后我会在弹出窗口中引用它。
父窗口:
MyNameSpace = {
// put functions, classes or whatever you want in here.
};
弹出窗口中的:
MyNameSpace = window.opener.MyNameSpace;
您可能要求的唯一问题是您调用的函数是否尝试引用窗口对象。我会将一个窗口对象传递给任何操作窗口的函数。
e.g。
function (arg1, arg2, argn, windowHandle) {
windowHandle = windowHandle || self;
// do some stuff.
}
答案 2 :(得分:0)
您可以创建一个新的函数实例,并传递函数名称和可选的argNs,如下所示
var parentFunction = new Function("name", "args", "return (window.opener != null) ? opener.window[name](args) : false");
parentFunction('notification','waring, red, 2');