【发布时间】:2011-09-14 11:20:24
【问题描述】:
我想获取所有已经打开的子窗口的引用。有什么办法吗?我没有使用child = window.open(....) 只是使用window.open(....) 并打开多个子窗口。
【问题讨论】:
-
如果你在创建它们时不存储它们,为时已晚。
我想获取所有已经打开的子窗口的引用。有什么办法吗?我没有使用child = window.open(....) 只是使用window.open(....) 并打开多个子窗口。
【问题讨论】:
您最好使用前缀和计数器来命名窗口。
我需要检测一个命名窗口(即 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) { }
这重新捕获了对命名打开窗口的引用。如果它不存在,您会看到一个小窗口弹出一秒钟。
如果您知道窗口的可能名称,您可以循环浏览这些名称,尝试找到它们。
【讨论】:
好的,我在 Oracle CRM onDemand 中使用了这个问题的答案来禁用从父窗口执行脚本的弹出窗口中的选择,并且它起作用了! (我无法控制弹窗的生成,它们是由应用程序框架打开的)
让我们看看我是怎么做到的:
上下文:在详细信息页面中,用户可以通过单击放大镜图标来添加一些信息 >>> 会打开一个包含搜索表单的新窗口,但是选择会打扰管理员:如果用户更改其默认值,他/她将获得对禁止记录的访问权限!天哪!
第一种方法:立即禁用该选择!
尝试:我使用浏览器的开发工具 (F12) 找到了图片的 onclick 属性。有一个 openAssocPopup 方法,然后我知道子窗口的名称:'OccamPopup1' :)
好的!所以让我们做一些魔术(在父窗口执行):
window.open("","OccamPopup1").document.getElementById("frmSearch.AQ").setAttribute("disabled", true);
我认为这可能会有所帮助,因为这个问题对我也有帮助。你是对的。现在我正在尝试将孩子的文档对象包装在父母的 jQuery 对象中,这样我就可以访问整个孩子的 DOM……但这是另一个故事……
【讨论】:
如果您不想更改当前代码,可以简单地覆盖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 不想更改他的代码中的任何内容......
window._open.apply(window, arguments),因为为参数传入undefined 而不传入任何内容会产生不同的行为。我相信明确传入undefined 将禁用所有窗口功能
我不相信你可以,除非你知道窗户的名字,我猜你不知道。 (如果你知道他们的名字,你可以使用window.open("", "name") 来获得他们的参考。)
当然,更好的选择是首先记住从window.open 返回的引用——但你知道这一点。 :-)
【讨论】:
window.open("", "name") 检索它们,否则我认为没有第三种选择。