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

IT技术 javascript window.open
2021-03-05 00:05:05

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

4个回答

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

当然!为避免将来出现问题,最好将我编写的函数重命名为window.open2():) 并将所有现有.open()调用更改.open2(). 但似乎@Govind 不想更改他的代码中的任何内容......
2021-04-25 00:05:05
为了不破坏任何依赖于默认行为的代码,这个改变的 window.open() 也应该在将它存储在数组中之后返回引用。
2021-04-27 00:05:05
您实际上应该这样做,window._open.apply(window, arguments)因为传入undefined参数而不传入任何内容会产生不同的行为。我相信明确传入undefined将禁用所有窗口功能
2021-04-30 00:05:05
@Govind:此解决方案的警告 - 它是一种黑客行为,最好避免以防止将来出现维护问题。请参阅:stackoverflow.com/questions/6223449/...
2021-05-12 00:05:05
问题是,当我们刷新主窗口时,我们丢失了openWindows 中的所有数据。有什么想法可以避免这种情况吗?
2021-05-17 00:05:05

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

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

@Govind:明白了。不幸的是,除非保存返回值或知道分配给它们的名称以便您以后可以使用 检索它们window.open("", "name"),否则我认为没有第三种选择。
2021-04-27 00:05:05
+1 很好的答案,但我对这种方法有要求。
2021-05-19 00:05:05

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

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

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

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

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

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

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

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

这不会阻止用户使用 Javascript(例如从 URL 栏)或使用开发工具更改字段值,就像您查找字段的方式一样。如果可能的话,服务器端代码应该阻止获取“禁止记录”。我知道我正在回复一个旧帖子,我想您已经考虑了这些可能性并采取了唯一可用的解决方案。但是,我认为遇到这种情况的其他人意识到仅客户端保护的风险很重要。
2021-04-27 00:05:05
是的,您是对的……但是…… 1.- Oracle CRM onDemand 在云端,只要我们只有少数有限的工具来自定义功能,我们就可以通过 jQuery 进行更改。2.-用户是新手,或者 Javascript 书呆子......几乎所有的人......我认为他们不会像我们一样浪费时间破解 CRM(我们是他们的供应商,开发团队)......我不'不介意他们这样做... :P 谢谢!
2021-05-20 00:05:05

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

我需要检测一个命名窗口(即 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) { }

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

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