2011-03-14 9 views
23

A partir del último safari 5 se lanzó, y resultó causar algunos problemas para mi sitio web. Tengo un sitio web dinámico con ASP clásico (aunque eso no debería importar mucho) y el sitio tiene un uso creativo de la pila de historial. Por ejemplo, puede estar en una página que enumera productos, luego vaya a detalles sobre un producto y cambie el producto (vista de administrador). Cuando hace clic en Guardar en el producto, la información se envía al servidor a través de AJAX y se emite un history.back(). Esto funciona muy bien en todos los navegadores (incluido safari < = 4), sin embargo, en el safari recién lanzado 5 dejó de funcionar. Parece que cuando haces clic en Safari 5 no actualiza la página, solo la carga desde la memoria caché, lo que significa que no se muestran los cambios realizados en la vista de detalles. ¿Cómo puedo hacer para que esto funcione en Safari 5 también? Este es el código actual que tengo que desactivar la caché (incluido en la parte superior de cada página):Prevención de la memoria caché en el botón de la parte posterior en Safari 5

Dim pStr 
pStr = "private, no-cache, no-store, must-revalidate" 
Response.AddHeader "pragma","no-cache"  '? 
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "cache-control", "post-check=0, pre-check=0"  '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT"  '? 
Response.AddHeader "Last-Modified", Now() 

Respuesta

45

El controlador unload vacío ya no funcionará. En su lugar, puede consultar la propiedad persisted del evento onpageshow. Se establece en falso en la carga de la página inicial. Cuando la página se carga desde bfcache, se establece en verdadero.

La solución de Kludgish es forzar una recarga cuando la página se carga desde bfcache.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() 
    } 
}; 

Si está utilizando jQuery y luego hacer:

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     window.location.reload() 
    } 
}); 
+1

Gran solución - ¡Confirmado para funcionar a partir de iOS 6 (iPhone y iPad)! Gracias Mika! – Jesse

+2

Esto también funciona en Safari 6, escritorio. El viejo truco de window.onunload ya no funciona de manera consistente; ahora debería considerarse la respuesta "correcta". –

+1

Esto funciona en iPad. Desafortunadamente (al menos para mí), tiene el efecto secundario de volver a cargar la página cuando se despierta del modo de suspensión. Y si el usuario ha hecho un montón de cambios en los elementos del formulario que producen todo tipo de cambios en la pantalla, el usuario debe comenzar de nuevo. ¿Hay alguna manera de volver a cargar la página solo desde un botón de retroceso, pero no si se está despertando? –

7

Después de algún googeling y la excavación que he encontrado una solución, aunque no estoy muy feliz por eso. Establecer onunload="" en la etiqueta de cuerpo hace que Safari invalide la página y la vuelva a cargar uppon window.history.back();.

+1

He tenido un problema similar, excepto que yo quiero que el usuario sea revalidado en el navegador de devolución (estudiantes turnándose en un iPad) . El truco onunload = "" parece funcionar bien forzando la revalidación en Safari en una computadora portátil, pero no en Safari móvil en un iPad. ¿Alguna idea? – John

3

Ésta es otra manera:

function invalidateBackCache() { 
     // necessary for Safari: mobile & desktop 
    } 

    window.addEventListener("unload", invalidateBackCache, false); 

yo decidimos ir a esta ruta, porque la adición de HTML (onunload = "") para el cuerpo de la etiqueta en .Net implicado modificar tres archivos en mi caso. Establecer el atributo onunload en jQuery tampoco lo resolvió.

Esto también funciona para el móvil Sarfari (iPad).

+2

no, esto tampoco funcionó para mí (botón de retroceso en ipad). solo está trabajando en actualizar. – sirmak

+1

La idea de esto es correcta/funcionó para mí. Utilicé el siguiente código dependiente de jquery: '$ (ventana) .on ('descargue', función() {});' – Sam

+0

tenga en cuenta que el evento de descarga se informó que era problemático en las versiones recientes en Safari móvil, por lo que es posible que desee doble-check –

Cuestiones relacionadas