2012-08-16 35 views
34

Il problema riscontrato è molto simile a this question, ad eccezione del fatto che Safari sui desktop sembra aver risolto il problema. In sostanza, il problema è questo: quando un client sta navigando su mobile safari e la pagina esegue una funzione javascript su pagea.html, quindi vai a pageb.html, quindi premi il pulsante indietro per tornare a pagea.html, la funzione javascript non verrà eseguito quando il client ha premuto il pulsante Indietro per tornare a pagea.html. Salterà la chiamata javascript.Pulsante Indietro Safari mobile

Ho provato le soluzioni citate nel link sopra, ma nulla sembra funzionare per Safari mobile. Qualcun altro ha riscontrato questo bug? Come lo hai gestito?

+2

Si consiglia di provare ad aggiungere tutti gli URL dei collegamenti con "?" Se non è ancora presente. ad es .: 'href =" next.html "' diventa 'href =" next.html? "'. Ciò darebbe un suggerimento al browser web che il contenuto della pagina è dinamico e andare a quella pagina di nuovo dovrebbe ricaricare nuovamente la pagina dal server. Questo dovrebbe essere applicato anche agli script esterni. ad es .: 'src =" mylib.js "' diventa 'src =" mylib.js? "'. – Jay

risposta

86

Questo è causato da back-forward cache. Si suppone di salvare lo stato completo della pagina quando l'utente si allontana. Quando l'utente torna indietro con il pulsante Indietro, la pagina può essere caricata dalla cache molto rapidamente. Questo è diverso dalla cache normale che memorizza solo il codice HTML.

Quando la pagina viene caricata per l'evento bfcache onload, non verrà attivato. Invece è possibile verificare la proprietà persisted dell'evento onpageshow. È impostato su false al caricamento iniziale della pagina. Quando la pagina viene caricata da bfcache è impostata su true.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     alert("From back/forward cache."); 
    } 
}; 

Per qualche motivo, jQuery non ha questa proprietà nell'evento. Puoi trovarlo dall'evento originale però.

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     alert("From back/forward cache."); 
    } 
}); 

La soluzione rapida a questi problemi è di ricaricare la pagina quando si preme il pulsante Indietro. Ciò tuttavia annulla qualsiasi effetto positivo che la cache di back/forward darebbe.

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

Come sidenote, è possibile vedere molte pagine che offrono utilizzando vuota onunload gestore come soluzione. Questo non ha funzionato da iOS5.

$(window).bind("unload", function() { }); 
+3

Va notato che questa soluzione non funziona più sulle versioni correnti di iOS (credo di aver letto da qualche parte che era qualcosa oltre il 5ish). L'evento pageshow si attiva per il primo back/forward e mai più per lo stato di cronologia di quella pagina. L'unica soluzione praticabile che ho trovato oltre che è di utilizzare l'evento popstate per identificare back/forward. – Shiboe

+1

È il gestore onunload vuoto che non ha funzionato da iOS5. La risposta sopra funziona per iOS6. Non sono sicuro di iOS7 però. Proverò un po 'più tardi. –

+0

Funziona su iOS7, ma ha anche l'effetto collaterale di aggiornare la pagina se lo schermo è spento e riacceso. Un modo per aggirare questo? – Dave4988