2010-11-02 11 views
8

Tengo una aplicación fuera de línea HTML5 (es decir, no hay componente/código del lado del servidor).Recuperar referencia de ventana secundaria después de actualizar

Básicamente tiene dos ventanas (principal e infantil). Sin embargo, en algunos casos, necesito actualizar la ventana principal de manera programática. Cuando esto sucede, pierde su referencia al niño, y la referencia del niño a window.opener ya no es válida. Así que pensé que serializaría la ventana secundaria y la almacenaría en localStorage. Luego, cuando el padre se haya actualizado, podría recoger la referencia de la ventana de localStorage y seguir interactuando con el niño.

El problema es que esto no funciona (según mi pregunta anterior aquí Stringify DOMWindow object). No puedo serializar una ventana DOM como cualquier otro objeto.

Entonces, ¿cómo puedo hacer que mi ventana recién actualizada seleccione una referencia al hijo de su predecesor?

Editar: Subrayó el hecho de que es una aplicación fuera de línea. No hay componente del lado del servidor.

Debo añadir que la razón por la que necesito actualizar el elemento principal es verificar las actualizaciones de la aplicación (cambios en el manifiesto de la caché). Dado que el padre es la primera página en la aplicación que carga, básicamente administra el almacenamiento en caché (de hecho como un lado, en Safari si esta ventana se cierra durante cualquiera de los procesos de caché todo el navegador se bloquea). Entonces "padre" es esencialmente "primera página que el usuario carga". Esto significa que no puedo tener el "padre" en un marco, ya que la ventana más alta administraría el almacenamiento en caché y requeriría la actualización para buscar actualizaciones. En realidad, parece que puedo usar el método de marco, ya que al actualizar cualquiera de las páginas de la aplicación se activará la verificación de actualización. Engorroso sin embargo.

Respuesta

1

Ver aquí: 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 incendios cada vez que una nueva versión ha sido descargado)

+1

No es el evento de actualización que estaba buscando (ya tengo un oyente para eso), sino más bien la parte applicationCache.update de su fragmento. Gracias. – ggutenberg

0

Suena como una solución bastante compleja. ¿Por qué no coloca el contenido de la ventana padre en un iframe invisible (es decir, uno sin borde) y simplemente actualiza el marco?

Eso le permitiría guardar la referencia al marco y la ventana secundaria en el documento superior donde ambos podrían acceder.

0

¿Se puede invocar algo en el abridor que indique que se debe volver a cargar y volver a abrir la ventana emergente de una página?

p. Ej.

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

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

a continuación en el código del lado del servidor, si tuviera el conjunto emergente, agregue el código para volver a poner en marcha.

+0

No hay código del lado del servidor. Es una aplicación fuera de línea HTML5. 100% del lado del cliente.Además, la ventana emergente en este caso es la aplicación "principal". Entonces, cerrarlo en cualquier punto sería desconcertante para el usuario. – ggutenberg

+0

Estoy confundido ... si la ventana emergente es la aplicación "principal", ¿por qué hay una ventana de apertura que la inicia? – scunliffe

+0

Porque mi cliente quiere que la aplicación principal "no se vea como un navegador", así que está siendo abierta por el iniciador sin una barra de herramientas, barra de direcciones, barra de estado, etc. Además, de esta manera el iniciador gestiona el proceso de actualización/descarga con progreso bar, etc., mientras que el usuario puede usar la aplicación principal en una ventana independiente. – ggutenberg

12

Puede obtener la referencia de la ventana secundaria simplemente siguiendo truco.

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

Tenga en cuenta que debe tener un nombre de ventana hijo fijo para que este truco funcione.

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

+0

Wow perfecto, justo lo que necesitaba y funciona en todos los navegadores. Muchas gracias. No sabía sobre 'sobre: ​​en blanco'. David Flanagan habla sobre esta URL en su libro "JavaScript - The Definitive Guide", en la página 354 (6ª edición). Sin embargo, una pequeña cosa es que IE y FireFox no querían centrarse en una ventana ya abierta. Resuelto eso agregando 'newWin.focus()' en la cláusula else. –

+0

¡Gracias! ¡Este fragmento de código resolvió mi problema! Mi caso es que cuando se genera una ventana secundaria a través de window.open() que contiene un Javascript de larga ejecución, el cierre inmediato de esa ventana secundaria ocasiona que la ventana principal se actualice inesperadamente en IE. – Barney

+0

Sí, es genial! Pero la ventana secundaria se recarga después de volver a cargar el elemento primario ... ¿o no debería? (No se puede comparar con el ejemplo - el enlace no funciona) – basil

Cuestiones relacionadas