2011-06-14 65 views

回答

50

如果你不想改变你目前的代码,你可以简单地覆盖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

Upvote为好戏! – rahulmohan 2011-06-14 12:45:27

+3

@Govind:这个解决方案的一个警告 - 这是一个黑客,最好避免以防止未来的维护问题。请参阅:http://stackoverflow.com/questions/6223449/why-is-it-frowned-upon-to-modify-javascript-objects-prototypes/6223589#6223589 – rahulmohan 2011-06-14 12:46:43

+0

当然!为了避免将来出现问题,最好将我写的函数重命名为'window.open2()':),并将所有现有的'.open()'调用改为'.open2()'。但似乎@Govind不想改变他的代码中的任何东西...... – 2011-06-14 14:41:53

15

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

更好的选择,当然,要记得在首位  —从window.open返回的引用,但你知道。 :-)

+0

+1好答案,但我有这种方法的要求。 – 2011-06-14 07:31:34

+0

@Govind:明白。不幸的是,除非保存返回值或知道分配给它们的名称,以便稍后使用'window.open(“”,“name”)'检索它们,我不认为有第三种选择。 – 2011-06-14 07:32:58

1

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

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

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

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

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

好吧!因此,让我们做一些魔术(在父窗口中执行):

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

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

+1

这不会阻止用户使用Javascript(例如从URL栏)更改字段值,也不会像使用开发工具那样使用开发工具来查找字段。如果可能的话,应该通过服务器端代码来阻止“禁止记录”。 我知道我正在回复一篇旧文章,我想你已经考虑过这些可能性并采取了唯一可用的解决方案。但是,我认为其他人遇到这种情况时应该意识到客户端保护的风险。 – SimeonJM 2014-10-29 00:54:27

+0

是的,您是对的......但是...... 1.- Oracle CRM onDemand位于云端,只要我们只有一些有限的工具来定制功能,我们就会通过jQuery来改变事物。 2.用户是新手,或者是Javascript书呆子...几乎所有人都......我认为他们不会像我们一样浪费时间来攻击CRM(我们是他们的提供者,开发团队)......并且我不愿意'不介意他们是否...... ...感谢! – 2014-11-13 08:03:32

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) { } 

这收复参考命名打开的窗口。如果它不存在,你会看到一个小窗口弹出一秒钟。

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