2012-08-16 18 views
34

Das Problem, das ich gefunden habe, ist sehr ähnlich zu this question, außer dass Safari auf Desktops scheint das Problem gelöst haben. Das Problem ist im Wesentlichen folgendes: Wenn ein Client auf einer mobilen Safari surft und die Seite eine JavaScript-Funktion auf pagea.html ausführt, navigieren Sie zu pageb.html und drücken Sie dann die Zurück-Taste, um zur JavaScript-Funktion pagea.html zurückzukehren wird nicht ausgeführt, wenn der Client die Zurück-Taste gedrückt hat, um zu pagea.html zurückzukehren. Es wird den Javascript-Aufruf überspringen.Mobile Safari Zurück-Taste

Ich habe die oben genannten Lösungen ausprobiert, aber nichts scheint für mobile Safari zu funktionieren. Hat jemand anderen diesen Fehler festgestellt? Wie bist du damit umgegangen?

+2

Sie können versuchen, alle Link-URLs mit '?' Anzuhängen, wenn sie noch nicht vorhanden sind. Beispiel: 'href =" next.html "' wird 'href =" next.html? "'. Dies würde dem Webbrowser einen Hinweis geben, dass der Seiteninhalt dynamisch ist, und erneut auf die Seite gehen, sollte die Seite erneut vom Server laden. Dies sollte auch auf externe Skripte angewendet werden. Beispiel: 'src =" mylib.js "' wird 'src =" mylib.js? "'. – Jay

Antwort

86

Dies wird durch back-forward cache verursacht. Es soll den vollständigen Zustand der Seite speichern, wenn der Benutzer weg navigiert. Wenn der Benutzer mit Zurück zurück navigiert, kann die Schaltfläche Seite sehr schnell aus dem Cache geladen werden. Dies unterscheidet sich vom normalen Cache, der nur HTML-Code zwischenspeichert.

Wenn die Seite für bfcache geladen wird onload Ereignis wird nicht ausgelöst. Stattdessen können Sie die persisted Eigenschaft des onpageshow Ereignisses überprüfen. Es wird beim ersten Laden der Seite auf false gesetzt. Wenn die Seite aus Bfcache geladen wird, wird sie auf True gesetzt.

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

Aus irgendeinem Grund hat jQuery diese Eigenschaft nicht im Ereignis. Sie können es jedoch vom ursprünglichen Ereignis finden.

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

Schnelle Lösung für dieses Problem ist es, die Seite neu zu laden, wenn die Zurück-Taste gedrückt wird. Dies hebt jedoch jeglichen positiven Effekt auf, den der Back/Forward-Cache geben würde.

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

Als Nebenbei bemerkt, können Sie viele Seiten sehen mit leeren onunload Handler als Lösung anbietet. Dies hat seit iOS5 nicht funktioniert.

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

Es sollte angemerkt werden, dass diese Lösung nicht mehr auf aktuellen Versionen von iOS funktioniert (ich glaube, ich habe irgendwo gelesen, es war alles jenseits 5ish). Das pageshow-Ereignis wird für den ersten Vor-/Rücklauf und nie wieder für den Seitenverlauf ausgelöst. Die einzige praktikable Lösung, die ich darüber hinaus gefunden habe, ist die Verwendung von Popstate-Ereignis, um zurück/vorwärts zu identifizieren. – Shiboe

+1

Es ist der leere onunload-Handler, der seit iOS5 nicht funktioniert hat. Die obige Antwort funktioniert für iOS6. Nicht sicher über iOS7 obwohl. Wird ein bisschen später testen. –

+0

Das funktioniert auf iOS7, hat aber auch den Nebeneffekt, dass die Seite aktualisiert wird, wenn der Bildschirm ausgeschaltet und wieder eingeschaltet wird. Irgendein Weg, um das zu umgehen? – Dave4988