2010-07-13 20 views
68

Qualcuno sa se l'evento onbeforeunload è supportato su iPad e/o se esiste un modo diverso di utilizzarlo?window.onbeforeunload non funziona su iPad?

Ho provato praticamente tutto e sembra che l'evento onbeforeunload non venga mai attivato sull'iPad (browser Safari).

In particolare, questo è ciò che ho provato:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (sia di quanto sopra insieme)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (tutte le funzioni di cui sopra ma dentro <body onbeforeunload="...">

Tutti questi funzionano su FF e Safari sul PC, ma non sull'iPad.

Inoltre, ho fatto quanto segue subito dopo il caricamento della pagina:

alert('onbeforeunload' in window); 
alert(typeof window.onbeforeunload); 
alert(window.onbeforeunload); 

Rispettivamente, i risultati sono:

  • true
  • object
  • null

Quindi, il browser ha la proprietà, ma per qualche motivo non viene licenziato.

I modi in cui provo ad allontanarmi dalla pagina sono facendo clic sui pulsanti Indietro e Avanti, eseguendo una ricerca su google nella barra in alto, cambiando la posizione nella barra degli indirizzi e facendo clic su un segnalibro.

Qualcuno ha qualche idea su cosa sta succedendo? Apprezzerei molto qualsiasi input.

Grazie

+0

Vi ringrazio entrambi per il vostro input. Deve essere uno dei motivi che hai menzionato. Sfortunatamente, non esiste documentazione ufficiale di Apple per quanto riguarda questa e altre limitazioni. Si spera che offriranno un modo più creativo di abilitare questa funzione, impedendo nel contempo l'uso malevolo di questa funzione. Ho sentito molto spesso che la gente accidentalmente toglie la pagina e perde tutti i dati inseriti in un modulo. –

+0

Hai provato a usare 'addEventListener()'? – Hello71

+2

Sono abbastanza sicuro che 'beforeunload' non funzioni su Safari su iOS. :-(Forse non è quello che stai cercando, ma ho un suggerimento su come [testare in modo affidabile un 'beforeunload' funzionante] (http://stackoverflow.com/a/18137334/345716) –

risposta

4

solo Apple saprebbe per certo, ma la mia ipotesi è che volutamente non hanno consentito che la funzionalità in Safari mobile, perché è più spesso utilizzato dai loschi per arrivare a rimanere sul loro sito o pop un sacco di finestre porno/pubblicitarie.

+46

O sai, salva le modifiche automaticamente in modo che non vengano perse solo perché hai toccato accidentalmente la cosa sbagliata. –

+4

Non ho detto che non c'erano usi validi , Ho appena detto che quelli erano gli usi più frequenti –

+3

@JoelMueller Il tuo commento dovrebbe essere la risposta accettata :) –

3

C'è un known bug in WebKit con onbeforeunload. Credo che sia stato corretto nell'ultima beta di Chrome 5, ma è possibile che il browser dell'iPad sia costituito da una versione di WebKit che non ha la soluzione.

Related Chrome bug report.

+1

Sono confuso o questo bug esiste ancora nel browser iPad? – Peter

13

Ho trovato che l'evento onunload() si attiva. Il suo comportamento è alquanto strano; qualunque cosa tu abbia nella tua funzione di callback collegata all'evento viene effettivamente eseguita dopo che la nuova pagina è stata caricata in background (non puoi dire che è ancora caricata, ma la registrazione del server mostrerà che lo ha).

Più stranamente, se si dispone di una conferma() chiamata nel vostro onunload(), e l'utente ha fatto clic su un link per andare da qualche altra parte, si è in affari.Se, tuttavia, l'utente chiude la scheda del browser Safari per iPad, l'evento onunload() si attiva, ma la tua conferma() avrà un annullamento implicito come risposta.

+0

Avete qualche esempio per questa soluzione alternativa? – testndtv

+0

Huh, sembra che questa stranezza confermi (che la seconda pagina sia colpita prima del messaggio di conferma) è vera non solo per i safari mobili ma anche per Firefox (e probabilmente anche altri). Mi hai solo fatto impazzire. – Amalgovinus

+2

evento 'scarichi' deprecato a favore di' pagehide' vedere https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511 -SW5 – sol0mka

1

Se hai solo bisogno di sapere se la pagina è stata lasciata puoi usare document.unload. Funziona perfettamente con i browser ios. Se si vede sulla Apple documentation troverete che è deprecato e si consiglia di utilizzare document.pagehide

+0

'document.pagehide' funziona bene per me, grazie! – yarl

2

https://code.google.com/p/chromium/issues/detail?id=97035

vedere sentire.

Gli avvisi non sono più consentiti durante gli eventi di eliminazione della pagina (beforeunload, unload, pagehide).

Penso agli avvisi, pronta, confermano, e altre azioni come queste sono anche più ammessi.

2

l'evento beforeunload non è supportato da Mobile Safari. Puoi vedere l'elenco di tutti gli eventi supportati qui: Handling Events Apple documentation

E il beforeunload non è nella lista!

8

Questo po 'di JavaScript per me funziona su Safari e Chrome su iPad e iPhone, così come desktop/laptop/altri browser:

var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i); 
var eventName = isOnIOS ? "pagehide" : "beforeunload"; 

window.addEventListener(eventName, function (event) { 
    window.event.cancelBubble = true; // Don't know if this works on iOS but it might! 
    ... 
}); 
+1

Può prendere l'evento, ma come si fa a far apparire il prompt di conferma?Usando 'return 'test';' simile a quello di op non funziona .. – user2335065

+0

Grazie ho perso quello nella domanda originale. Non l'ho testato specificamente su iOS, ma probabilmente aggiungendo questa linea aggiuntiva funzionerebbe: \t window.event.cancelBubble = true; Aggiungo alla mia risposta – Danger

+2

Grazie, ma purtroppo non funziona ... Ho provato a mettere alert() al suo interno, sembra che la nuova pagina abbia iniziato a caricarsi prima che venga attivato l'alert(). Vedi anche: http://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad – user2335065

Problemi correlati