2011-06-14 99 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) { } 

這收復參考命名打開的窗口。如果它不存在,你會看到一個小窗口彈出一秒鐘。

如果您知道窗口的可能名稱,則可以循環查找名稱,嘗試查找它們。

相關問題