26

我想获取所有已经打开的子窗口的引用。有什么办法吗?我不child = window.open(....)只是使用window.open(....)和打开多个子窗口。

4

4 回答 4

60

如果您不想更改当前代码,可以简单地覆盖window.open()函数:

var openedWindows = [];
window._open = window.open; // saving original function
window.open = function(url,name,params){
    openedWindows.push(window._open(url,name,params));
    // you can store names also...
}

在调用之前运行此代码window.open()。对打开的窗口的所有引用都将存储在openedWindows数组中。您可以随时随地访问它们

于 2011-06-14T09:23:02.690 回答
17

我不相信你可以,除非你知道窗户的名字,我猜你不知道。(如果您知道他们的名字,您可以使用window.open("", "name")来获取他们的参考。)

当然,更好的选择是首先记住返回的引用window.open——但你知道这一点。:-)

于 2011-06-14T07:10:27.093 回答
2

好的,我在 Oracle CRM onDemand 中使用了这个问题的答案来禁用从父窗口执行脚本的弹出窗口中的选择,它起作用了!(我无法控制弹出窗口的生成,它们是由应用程序框架打开的)

让我们看看我是怎么做到的:

上下文:在详细信息页面中,用户可以通过单击放大镜图标来添加一些信息 >>> 会打开一个包含搜索表单的新窗口,但是选择会打扰管理员:如果用户更改其默认值,他/她将获得被禁止的记录!!我的天啊!

第一种方法:立即禁用该选择!

尝试:我使用浏览器的开发工具 (F12) 找到了图像的 onclick 属性。有一个 openAssocPopup 方法,然后我知道子窗口的名称:'OccamPopup1' :)

好的!所以让我们做一些魔术(在父窗口执行):

window.open("","OccamPopup1").document.getElementById("frmSearch.AQ").setAttribute("disabled", true);

我认为这可能会有所帮助,因为这个问题对我也有帮助。你是对的。现在我试图将孩子的文档对象包装在父母的 jQuery 对象中,这样我就可以访问整个孩子的 DOM ......但这是另一个故事......

于 2013-11-28T17:11:02.570 回答
0

您最好使用前缀和计数器来命名窗口。

我需要检测一个命名窗口(即 CBCheckout)是否已经打开并使用它:

var signupWindow = window.open('','CBCheckout','toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=1,height=1');
try {
    if (signupWindow.document.location.href == "about:blank") {
        signupWindow.close();
        signupWindow = undefined;
    }
} catch (e) { }

这重新捕获了对命名打开窗口的引用。如果它不存在,您会看到一个小窗口弹出一秒钟。

如果您知道窗口的可能名称,您可以循环浏览这些名称,尝试找到它们。

于 2016-09-24T08:44:31.723 回答