tl; dr - Safari su iOS 5 sta memorizzando nella cache così difficile, sta interrompendo il mio sito.Problemi con Page Cache in iOS 5 Safari durante la navigazione indietro/scarica evento non attivato
Sono alle prese con il modo in cui il browser Safari in iOS 5 si occupa della cache backward, che chiamano "PageCache". Il modo in cui è descritto here spiega il comportamento molto bene.
Molto semplicemente, la pagina Cache rende in modo che quando si lascia una pagina che “mettere in pausa” e quando torni ci premere “Play”.
Questo sta causando problemi in tutto il mio sito. Quando si utilizza il pulsante Indietro, la maggior parte degli altri browser mostrerà la pagina nello stato in cui è stata caricata. Non Safari su iOS 5, ti mostra la pagina che hai lasciato l'ultima volta. Un semplice esempio potrebbe essere la disattivazione di un pulsante di invio. Se utilizzo Javascript per disabilitare un pulsante di invio, quindi invio un modulo, quando si fa clic sul pulsante Invia si disabiliterà comunque. Questo è stato un problema in altri browser, inclusa la versione desktop di Safari, ma è stato risolto impostando il gestore di eventi onload su una funzione vuota. Credo che questo dica al browser di invalidare la cache perché qualcosa di importante potrebbe essere successo in quella funzione. Questo hack non sembra funzionare per Safari su iOS 5.
Di seguito è riportato il problema ridotto all'essenziale. Quando carichi test.html vedrai il testo "Testo originale". Quando fai clic sul link, il testo cambierà in "Testo cambiato - inoltro alla pagina successiva", quindi in 3 secondi ti verrà inoltrato a test2.html. Tutto va bene fino a questo punto in tutti i browser. In tutti gli altri browser, quando fai clic sul pulsante Indietro, il testo che vedrai sarà "Testo originale", ma su Safari per iOS 5 vedrai "Testo cambiato - inoltro alla pagina successiva".
Qualche suggerimento su come affrontare questo?
Questo è un semplice esempio
test.html
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
Test2.html
<div>Click back button</div>
Questo è un secondo esempio mediante un alberino modulo. Questo è un semplice esempio di come funziona la mia app. Quando si torna a formtest2.asp, si dovrebbe vedere il valore del modulo pubblicato e il testo div deve essere originale.
FormTest.asp
<form method="post" action="formtest2.asp">
Test: <input type="text" name="test"/>
<input type="submit" value="Submit"/>
</form>
formtest2.asp
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<%
Dim test
test = Request("test")
Response.Write("Test value: " & test & "<br />")
%>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
Test2.html
<div>Click back button</div>
Ancora un po 'di informazioni su questo. Sembra che tutti i browser che ho testato (Firefox, IE, Safari Desktop) stiano sparpagando pagine e scarichino, in questo ordine. Safari su iOS 5 spara solo su pagehide. – Clarke
Quando si apre una nuova scheda, l'evento di scarico non viene attivato, solo pagehide. Quando si apre una nuova scheda, ci si aspetta di essere in grado di tornare a una vecchia scheda e vedere la pagina proprio come l'avevate lasciata. Il problema è che quando navighiamo da una pagina all'altra nella stessa scheda/finestra, l'evento di scarico dovrebbe essere attivato per w3c ma non lo è. http://www.w3.org/TR/DOM-Level-2-Events/events.html. "L'evento di scaricamento si verifica quando l'implementazione DOM rimuove un documento da una finestra o frame.Questo evento è valido per gli elementi BODY e FRAMESET." – Clarke
Qualsiasi soluzione che usi location.reload() fallisce perché per questa funzione, Safari su ios 5 eseguirà solo un GET, non un POST come tutti gli altri browser. – Clarke