2010-11-08 10 views
38

Sembra che Apple abbia disattivato l'evento window.onbeforeunload per dispositivi iOS (iPhone, iPad, iPod Touch). Purtroppo non riesco a trovare alcuna documentazione sul motivo per cui questo evento non funziona in Safari Mobile.C'è un modo per usare window.onbeforeunload su Mobile Safari per dispositivi iOS?

Qualcuno sa se esiste un'alternativa affidabile a questa funzione? Il browser di Android sembra supportarlo perfettamente e l'applicazione desktop Safari supporta anche l'evento onbeforeunload senza problemi.

+0

Questo è un duplicato di [non window.onbeforeunload lavorare su l'iPad?] (http://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad) –

risposta

1

Se proprio ne hai bisogno, non puoi semplicemente ottenere tutti i link, i moduli e gli oggetti DOM che hanno un gestore che cambia l'URL e fa in modo che attenda fino a quando non hai fatto quello che vuoi. Per i collegamenti, ottieni getElementsByTagName, controlla se href inizia con qualcosa tranne un # e aggiungi semplicemente la tua funzione onbeforeunload add onclick (che sarà invocata prima che venga guardato href). Lo stesso per i moduli ma con onsubmit. Infine, per gli elementi che modificano l'href con JavaScript, dovresti assicurarti di quando aggiungi l'utente che chiami la tua funzione onbeforeunlaod (o, se usi gli ascoltatori DOM0 o DOM1, puoi semplicemente aggiungere qualche classe e poi usare un global script che controlla tutti gli elementi con la classe e lo aggiunge al listener di eventi con una chiusura

Ma dovresti essere normalmente in grado di evitare l'uso di questo evento (probabilmente usando i cookie per memorizzare la cosa che volevi inviare ogni x secondi e permettendo, nel peggiore dei casi, di dare un'occhiata alla prossima volta che l'utente carica una pagina e, nel migliore dei casi, essere in grado di inviare una richiesta Ajax a onbeforeunload o onunload che, anche se invia solo le intestazioni http , woudl ti permette di ottenere quello che vuoi)

+0

Grazie a Xavier, tutte le possibilità, ma tutte richiedono molte modifiche DOM che nel caso della mia applicazione non è pratico in quanto potrebbe interferire con il funzionamento delle pagine ospitate. –

+0

Non è necessario aggiungere l'evento su ogni singolo collegamento e così via, è possibile utilizzare la delega degli eventi. Puoi metterne uno sul corpo e usare e.srcElement || e.target e poi controlla se cambierà l'url. In questo modo, non è necessario mettere tanti elementi. Ma potresti ancora aver bisogno di mettere l'onsubmit sui moduli stessi ... non ne sono sicuro. – xavierm02

+1

Qualche opzione per lo scenario l'utente sta effettivamente chiudendo la pagina, invece di spostarsi su un'altra pagina tramite un elemento? –

13

Vedo che è una vecchia domanda, ma ho affrontato questo problema di recente.

sto usando window.unload e funziona benissimo in iOS browser (anche se si guarda al Apple documentation sembra essere deprecato e raccomandare di utilizzare document.pagehide)

+1

+1 per il suggerimento 'document.pagehide'. Esattamente quello di cui ho bisogno! –

+5

Sembra che nessuna pagina o scaricamento funzioni su iOS 9 quando l'utente ricarica la pagina. – CpnCrunch

Problemi correlati