2010-11-02 14 views
8

Ho un'app offline HTML5 (ovvero non esiste alcun componente/codice lato server).Richiama riferimento alla finestra figlio dopo l'aggiornamento

Fondamentalmente ha due finestre (genitore e figlio). Tuttavia, in alcuni casi ho bisogno di aggiornare la finestra genitore al livello di programmazione. Quando ciò accade, perde il suo riferimento al figlio e il riferimento del figlio a window.opener non è più valido. Quindi il mio pensiero era che avrei serializzato la finestra figlia e l'avrei archiviata in localStorage. Quindi, quando il genitore è stato aggiornato, può prelevare il riferimento della finestra da localStorage e continuare a interagire con il figlio.

Il problema è che questo non funziona (come per la mia domanda precedente qui Stringify DOMWindow object). Non riesco a serializzare una finestra DOM come qualsiasi altro oggetto.

Così come posso avere la mia finestra appena aggiornata prendere un riferimento al figlio del suo predecessore?

Modifica: Sottolineato il fatto che si tratta di un'app offline. Non c'è alcun componente sul lato server.

Devo anche aggiungere che il motivo per cui ho bisogno di aggiornare il genitore è controllare gli aggiornamenti dell'applicazione (cambiamenti nel manifest della cache). Poiché il genitore è la prima pagina dell'applicazione che carica, gestisce fondamentalmente la memorizzazione nella cache (infatti, a parte, in Safari se questa finestra viene chiusa durante il processo di memorizzazione nella cache l'intero browser si arresta in modo anomalo). Quindi "genitore" è essenzialmente "prima pagina caricata dall'utente". Ciò significa che non posso avere il "genitore" in un frame, poiché la finestra più in alto gestirà quindi la memorizzazione nella cache e richiederà l'aggiornamento per cercare gli aggiornamenti. In realtà, è possibile che io possa utilizzare il metodo frame, poiché l'aggiornamento di una qualsiasi delle pagine dell'applicazione attiverà il controllo degli aggiornamenti. Però ingombrante.

risposta

1

vedere qui: 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 incendi ogni volta che una nuova versione è stata scaricata)

+1

Non è l'evento aggiornabile che stavo cercando (ho già un listener per questo), ma piuttosto la parte applicationCache.update del tuo snippet. Grazie. – ggutenberg

0

Sembra una soluzione piuttosto complessa. Perché non metti il ​​contenuto della finestra genitore in un iframe invisibile (ad esempio uno senza un bordo) e aggiorna semplicemente la cornice?

Ciò consentirebbe di salvare il riferimento al frame e alla finestra secondaria nel documento in alto in cui entrambi potrebbero accedervi.

0

Puoi chiamare qualcosa sul dispositivo di apertura che dice di ricaricare e riaprire il popup in una pagina?

ad es.

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

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

quindi nel codice sul lato server, se avessi impostato il popup, aggiungi il codice per rilanciarlo.

+0

Non v'è alcun codice lato server. È un'applicazione offline HTML5. 100% lato client.Inoltre, il popup in questo caso è l'applicazione "principale". Quindi chiuderlo in qualsiasi momento sarebbe sconcertante per l'utente. – ggutenberg

+0

Sono confuso ... se il popup è l'applicazione "principale", perché c'è una finestra di apertura che la lancia? – scunliffe

+0

Poiché il mio cliente desidera che l'applicazione principale "non assomigli a un browser", viene aperta dal programma di avvio senza barra degli strumenti, barra degli indirizzi, barra di stato, ecc. Inoltre, in questo modo il programma di avvio gestisce il processo di aggiornamento/download in corso bar ecc., mentre l'utente è libero di utilizzare l'applicazione principale in una finestra separata. – ggutenberg

12

È possibile ottenere il riferimento della finestra secondaria semplicemente seguendo trucco.

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(); 
} 

Nota: è necessario avere un nome di finestra figlio fisso per far funzionare questo trucco.

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

+0

Wow perfetto, proprio quello di cui avevo bisogno e funziona su tutti i browser. Grazie mille. Non sapevo su 'about: blank'. David Flanagan parla di questo URL nel suo libro "JavaScript - The Definitive Guide", a pagina 354 (6a edizione). Una piccola cosa però, IE e FireFox non volevano mettere a fuoco una finestra già aperta. Risolto ciò aggiungendo 'newWin.focus()' nella clausola else. –

+0

Grazie! Questo snippet di codice ha risolto il mio problema! Il mio scenario è che quando si genera una finestra secondaria tramite window.open() che contiene un Javascript in esecuzione lungo, la chiusura immediata della finestra figlia provoca l'aggiornamento imprevisto della finestra padre su IE. – Barney

+0

Sì, è bello! Ma la finestra del bambino si ricarica dopo aver ricaricato il genitore ... o non dovrebbe? (non può essere paragonato ad esempio - link non funzionante) – basil

Problemi correlati