‘pageshow’ non viene ricevuto quando si preme il pulsante “Indietro” su Safari su * IPad “

Ho il seguente gestore:

$(window).bind('pageshow', function() { alert("back to page"); }); 

Quando esco dalla pagina (premendo un collegamento) e ritorna alla pagina (premendo il pulsante “indietro” ), l’ avviso () non viene chiamato (IPad 2, iOS 5.1).

Cosa sto facendo di sbagliato, per favore? Qualche altro evento a cui devo bind?

PS: interessante che il page hide sia ricevuto correttamente quando si naviga lontano dalla pagina.

Puoi controllare la proprietà persisted dell’evento pageshow . È impostato su false al caricamento iniziale della pagina. Quando la pagina viene caricata dalla cache è impostata su true.

 window.onpageshow = function(event) { if (event.persisted) { alert("back to page"); } }; 

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("back to page"); } }; 

Questo è probabilmente un problema di memorizzazione nella cache. Quando torni alla pagina tramite il pulsante “indietro”, la pagina viene estratta dalla cache (il comportamento dipende dal browser). Per questo motivo, il tuo JS non si triggers poiché la pagina è già stata renderizzata nella cache e rieseguire il tuo j potrebbe essere dannoso per il layout e così via.

Dovresti essere in grado di superare questo problema modificando le intestazioni di cache nella tua risposta o utilizzando una manciata di trucchi del browser.

Ecco alcuni link sul problema:

  • Esiste un evento onload cross-browser quando si fa clic sul pulsante Indietro?
  • Dopo aver ripreso la cronologia di Firefox, JavaScript non verrà eseguito

MODIFICARE

Questi sono tutti estratti dai link qui sopra:

  • history.navigationMode = 'compatible';
  • “Firefox 1.5+ e alcune versioni successive di Safari (che contiene la correzione per l’errore 28758) supportano eventi speciali denominati pageshow e pagehide .”
  • Utilizzo di $(document).ready(handler)
  • window.onunload = function(){};

Quello che stai facendo è vincolante il valore di ritorno di alert("back to page") come callback. Quello non funzionerà. Devi invece associare una funzione:

 $(window).bind('pageshow', function() { alert("back to page"); });