2010-09-24 179 views
3

我的javascript代碼打開一些窗口槽:Javascript:持久化窗口對象引用?

var win = window.open(); 

我將win參考存儲在一個包含所有其他打開窗口的數組中。
一切正常,直到開啓者刷新。

所以我想要實現的是在加載「主」窗口時取回所有對打開的窗口的引用。

爲了實現這一點,我必須:
1.在卸載 時保留所有引用2.在load 上獲取引用3.用新的opener更新引用

這可能嗎?如果是這樣的話?

回答

3

我是如何解決這個問題的。

子窗口「opener」屬性保持對打開它的WINDOW的引用,所以當主窗口刷新時,窗口不會改變,所以開啓者引用仍然是相同的。 當開啓器爲空時唯一的情況是當窗口關閉時*

在主窗口的卸載事件上,我在子窗口上調用一個設置超時的javaScript函數。當超時結束時,我測試開啓者參考並嘗試註冊返回,因爲參考仍然正確。

這樣我有所有的孩子參考回來! ;)

當然,如果在主窗口中加載的文檔不是我的文檔,但是,例如www.google.com註冊返回子引用失敗。

此解決方案已經在Firefox,IE和Chrome下測試。

*在Chrome中,當您鍵入新地址時,它會啓動一個新窗口,因此opener也會爲空。

4

這聽起來很複雜(閱讀:有問題)。

自從回頭再回到最初的HTTP協議以來,您提出的問題一直是個問題。

簡短的回答是否定的,這是不可能的。當您刷新父項時,所有對子項的引用都將丟失。在所有的現實中,這是相當現實的......父母被「刷新」......孩子們獲得了父母留下的所有資源......對不起,脫離主題,很好。 Web是無狀態的,因此一旦頁面刷新,重新加載,關閉,打開或附加了任何其他動詞,該頁面將被視爲新的文檔。


這在Chrome/FireFox中工作正常,但在IE無法正常工作。

類似下面的內容將起作用,但爲了重新連接孩子/父母之間的關係,必須從孩子完成。下面的腳本/標記將舉例說明。 所以我不會使用它,但它只是作爲一個例子。

步驟:

  • 打開的子
  • 轉到兒童
  • 刷新父
  • **父 - >子關係丟失。
  • **孩子 - >父母關係依然存在。
  • 鏈接父
  • 轉到父頁
  • 入住關係
  • **你會看到父母現在是不是null
  • 留在父母
  • 刷新兒童

HTMLPage 。HTM:

<input type="button" onclick="openChild();" value="Open Child" /> 
<input type="button" onclick="refreshParent();" value="Refresh Parent" /> 
<input type="button" onclick="linkParent();" value="Link Parent" /> 
<input type="button" onclick="checkRelationship();" value="Check Relationship" /> 
<input type="button" onclick="refreshChild();" value="Refresh Child" /> 


<script type="text/javascript" language="javascript"> 

    var child;  
    function openChild() { 
     child = window.open("HTMLPage.htm"); 
    } 

    function refreshParent() { 
     alert("refreshing parent"); 
     window.opener.location.href = window.opener.location.href; 
    } 

    function linkParent() { 
     window.opener.child = window; 
     checkRelationship(); 
    } 

    function checkRelationship() { 
     alert("Parent: " + window.opener + ". Children:" + child); 
    } 

    function refreshChild() { 
     child.location.href = child.location.href; 
    } 


</script> 

那麼接下來我的下一個問題是:

什麼是你想實現這個?當情況確實需要一個窗口時,我全部都是使用模態窗口/彈出窗口,但是你需要一組窗口嗎?

父頁面是否需要刷新?你可以在父頁面上粘貼一個iframe,並刷新它(IE。文件上傳等,主頁面不需要刷新)。

我根本不是一個蘋果迷的男孩,但這個鏈接給使用的IFrame的腳本一個很好的洞察力:http://developer.apple.com/internet/webcontent/iframe.html

我希望這有助於。

0

要麼避免重新刷新主窗口(使用AJAX或iframes),要麼將「主窗口」放入框架集中,以便實際上只重載「主框架」 - 然後您可以將變量粘貼到父框架中

+0

frame ....設置.... :P帶我回到geocity天。 – 2010-09-24 16:38:31

+0

當你不得不訴諸(JavaScript控制)彈出式窗口,這是足夠邪惡的,框架是不是更邪惡...... – mihi 2010-09-25 14:10:07