Javascript 将所有函数移到子窗口

Javascript 将所有函数移到子窗口,javascript,new-window,Javascript,New Window,如果我这样做: var new_win = window.open(); 如何使父窗口中可以使用的所有函数现在都可以在子窗口中使用(new\u-win) 我不想做: var fun1 = window.opener.fun1; var fun2 = window.opener.fun2; ... 请注意,下面是一个危险、肮脏、混乱的M$级黑客。我完全明白这一点,但它(理论上)符合@Neal的要求。(我甚至有点害怕发表这篇文章,我完全希望得到反对票) 考虑到范围问题,我决定我们必须使用.bin

如果我这样做:

var new_win = window.open();
如何使父窗口中可以使用的所有函数现在都可以在子窗口中使用(
new\u-win

我不想做:

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

请注意,下面是一个危险、肮脏、混乱的M$级黑客。我完全明白这一点,但它(理论上)符合@Neal的要求。(我甚至有点害怕发表这篇文章,我完全希望得到反对票)

考虑到范围问题,我决定我们必须使用
.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);
    }
}

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

父窗口:

MyNameSpace = {
      // put functions, classes or whatever you want in here.
};
在弹出窗口中:

MyNameSpace = window.opener.MyNameSpace;
您请求的唯一潜在问题是,您调用的函数是否试图引用窗口对象。我会将窗口对象传递给任何操作窗口的函数

e、 g


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

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

parentFunction('notification','waring, red, 2');

您是否有任何动态生成的函数,并且希望也包含这些函数?否则,为什么不在打开的窗口中包含相同的javascript文件(如果没有位置,请使用newWin.document.write).@draevor根据用户单击父窗口的情况,所有函数都是动态的。请注意,所有函数仍在原始窗口的范围内执行。@RobW如果这是在
new\u window.onload=function(){…over code…}
我相信(当我使用
函数foo(){alert(document.title)};var w=window.open('about:blank');w.onload=function(){w.foo=foo}
并使用
foo()时,使用
this
new_window
而不是
window
在打开的窗口中,我得到了原始文档的标题。我看不出有任何问题。这正是应该发生的事情。这应该在子窗口中执行,而不是在父窗口中执行。
function (arg1, arg2, argn, windowHandle) {
      windowHandle = windowHandle || self;

      // do some stuff.

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

parentFunction('notification','waring, red, 2');