【问题标题】:How to get the references of all already opened child windows如何获取所有已打开子窗口的引用
【发布时间】:2011-09-14 11:20:24
【问题描述】:

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

【问题讨论】:

  • 如果你在创建它们时不存储它们,为时已晚。

标签: javascript window.open


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

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

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

    【讨论】:

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

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

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

    【讨论】:

    • +1 好答案,但我有这种方法的要求。
    • @Govind:明白。不幸的是,除非保存返回值或知道分配给它们的名称以便稍后使用window.open("", "name") 检索它们,否则我认为没有第三种选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2011-11-08
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多