如何获取所有已打开的子窗口的引用

时间:2011-06-14 07:05:56

标签: javascript window.open

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

4 个答案:

答案 0 :(得分:57)

如果您不想更改当前代码,只需覆盖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数组中。您可以随时随地访问它们

答案 1 :(得分:16)

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

当然,更好的选择是记住从window.open返回的引用 - 但是你知道。 : - )

答案 2 :(得分:1)

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

让我们看看我是如何做到的:

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

第一种方法:禁用现在选择!!

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

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

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

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

答案 3 :(得分: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) { }

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

如果您知道窗口的可能名称,则可以循环显示名称,尝试找到它们。