2010-11-02 53 views
8

我有一個HTML5離線應用程序(即沒有服務器端組件/代碼)。刷新後檢索子窗口參考

它基本上有兩個窗口(父母和孩子)。但是,在某些情況下,我需要以編程方式刷新父窗口。發生這種情況時,它會失去對孩子的引用,並且孩子對window.opener的引用不再有效。所以我的想法是,我會序列化子窗口並將其存儲在localStorage中。然後,當父母刷新它可以從localStorage拿起窗口引用,並仍然與孩子交互。

問題是,這不起作用(根據我以前的問題Stringify DOMWindow object)。我不能像任何其他對象一樣序列化DOM窗口。

那麼,我怎樣才能讓我最近刷新的窗口獲得對其前任孩子的參考?

編輯:強調它是一個離線應用程序的事實。沒有服務器端組件。

我還應該補充一點,我需要刷新父項的原因是檢查應用程序更新(緩存清單中的更改)。由於父頁是加載的應用程序的第一頁,它基本上管理緩存(事實上,如果在整個瀏覽器崩潰的任何緩存過程中此窗口關閉,則在Safari中放在旁邊)。所以「父母」本質上是「用戶加載的第一頁」。 這意味着我不能在框架中擁有「父」,因爲最頂層的窗口會管理緩存,並且需要刷新才能查找更新。 實際上,我似乎可以使用框架方法,因爲刷新應用程序中的任何頁面都會觸發更新檢查。雖然麻煩。

回答

1

在這裏看到:http://www.w3.org/TR/html5/offline.html#dom-appcache-update

applicationCache.addEventListener("updateready", function() { 
    applicationCache.swapCache(); 
    //now reload the body html 
}, false); 
setInterval(60000, applicationCache.update);//check for updates every minute 

(每一個新版本已被下載時間updateready火災)

+1

這不是我正在尋找的更新事件(我已經有了一個偵聽器),而是您的片段的applicationCache.update部分。謝謝。 – ggutenberg 2010-11-03 14:46:39

0

聽起來像一個非常複雜的解決方案。你爲什麼不把父窗口的內容放在一個不可見的iframe中(即沒有邊框),只刷新一幀?

這將允許您將引用保存到頂部文檔中的框架和子窗口,其中兩者都可以訪問它。

0

你能打電話給你的開瓶器,告訴它重新加載並重新打開彈出頁面的東西?

例如

//in popup 
window.opener.doReload('popup_page_name.html'); 
window.close(); 

//in opener 
function doReload(popupURL){ 
    setSomeFormField(popupURL); 
    someForm.submit(); 
} 

然後在您的服務器端代碼中,如果您有彈出式設置,請添加代碼以重新啓動它。

+0

沒有服務器端代碼。這是一個HTML5離線應用程序。 100%的客戶端。另外,這種情況下的彈出窗口是「主」應用程序。因此,在任何時候關閉它都會讓用戶非常不安。 – ggutenberg 2010-11-02 17:38:45

+0

我很困惑......如果彈出窗口是「主」應用程序,爲什麼會有一個啓動窗口啓動它? – scunliffe 2010-11-02 17:58:09

+0

因爲我的客戶希望主應用程序「看起來不像瀏覽器」,所以它被啓動器打開時沒有工具欄,地址欄,狀態欄等。另外,這種方式啓動程序管理更新/下載進程酒吧等,而用戶可以在一個單獨的窗口中自由地使用主應用程序。 – ggutenberg 2010-11-02 18:04:09

12

你可以簡單地通過下面的技巧獲得子窗口的參考。

newWin = window.open("", "child_window_name", "width=..."); 
if (newWin.location.href === "about:blank") { 
    newWin = window.open("a.html", "child_window_name", "width=..."); 
} else { 
    // We've already obtained the reference. 
    // However, IE and FireFox won't put focus on an already opened window. 
    // So we have to do that explicitly: 
    newWin.focus(); 
} 

注意,你必須有一個固定的子窗口名稱,以使這一招作品。

例URL: http://josephj.com/lab/2011/window-open-reconnect/demo.html

+0

哇完美,正是我所需要的,它適用於所有瀏覽器。非常感謝。我不知道'about:blank'。 David Flanagan在他的書「JavaScript - 權威指南」一書的第354頁(第6版)中談到了這個URL。儘管如此,IE和FireFox並不想把重點放在已經打開的窗口上。通過在else子句中添加'newWin.focus()'來解決這個問題。 – 2013-12-14 17:30:17

+0

謝謝!這段代碼解決了我的問題!我的情況是,當通過window.open()產生一個包含長時間運行的Javascript的子窗口時,立即關閉該子窗口會導致父窗口在IE上意外刷新。 – Barney 2015-01-13 10:12:14

+0

是的,很酷!但是,重新加載父級後,子窗口會重新加載...或者它不應該? (不能與示例 - 鏈接不工作) – basil 2016-06-02 06:47:35