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');