2010-07-13 12 views
68

¿Alguien sabe si el evento onbeforeunload es compatible con el iPad y/o si hay una forma diferente de usarlo?window.onbeforeunload no funciona en el iPad?

He intentado casi todo, y parece que el evento onbeforeunload nunca se desencadena en el iPad (navegador Safari).

En concreto, esto es lo que he intentado:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (los dos anteriores juntos)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (todas las funciones anteriores, pero en el interior <body onbeforeunload="...">

Todos estos funcionan en FF y Safari en la PC, pero no en el iPad.

Además, me he hecho la siguiente justo después de cargar la página:

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

Respectivamente, los resultados son los siguientes:

  • true
  • object
  • null

Por lo tanto, el navegador tiene la propiedad, pero por alguna razón no se dispara.

Las formas en que trato de navegar fuera de la página son haciendo clic en los botones hacia atrás y hacia adelante, haciendo una búsqueda en Google en la barra superior, cambiando la ubicación en la barra de direcciones y haciendo clic en un marcador.

¿Alguien tiene alguna idea sobre lo que está pasando? Agradecería mucho cualquier aporte.

Gracias

+0

gracias a ambos por su entrada. Debe ser una de las razones que mencionaste. Desafortunadamente, no hay documentación oficial de Apple con respecto a esta y otras limitaciones. Con suerte, se les ocurrirá una forma más creativa de habilitar esta característica, mientras se evita el uso malicioso de la misma. Oigo muy a menudo que las personas accidentalmente hacen tapping fuera de la página y pierden todos los datos que ingresaron en un formulario. –

+0

¿Ha intentado usar 'addEventListener()'? – Hello71

+2

Estoy bastante seguro de que 'beforeunload' no funciona en Safari en iOS. :-(Tal vez no sea lo que está buscando, pero tengo una sugerencia de cómo [probar de forma confiable un 'beforeunload' de trabajo] (http://stackoverflow.com/a/18137334/345716) –

Respuesta

4

sólo Apple sabría a ciencia cierta, pero mi conjetura es que a propósito no permiten que la funcionalidad de Safari móvil, ya que es la más utilizada por los personajes oscuros para conseguir que se quede en su sitio o pop un montón de ventanas porno/publicidad.

+46

O, ya sabes, guarda tus cambios automáticamente para que no se pierdan solo porque accidentalmente tocaste lo incorrecto. –

+4

No dije que no había usos válidos , Acabo de decir que esos fueron los usos más frecuentes. –

+3

@JoelMueller Tu comentario debería ser la respuesta aceptada :) –

3

Hay un known bug in WebKit con anterioridad a la descarga. Creo que está arreglado en la última versión beta de Chrome 5, pero es bastante posible que el navegador del iPad esté hecho de una versión de WebKit que no tiene la solución.

Related Chrome bug report.

+1

¿Estoy confundido o este error todavía existe en el navegador del iPad? – Peter

13

He encontrado que el evento onunload() se dispara. Su comportamiento es algo extraño; lo que tenga en su función de devolución de llamada adjunta al evento se ejecuta realmente después de que la nueva página se cargó en segundo plano (No puede decir que está cargado todavía, pero el registro del servidor mostrará que sí lo ha hecho).

Más curiosamente, si tiene una llamada de confirmación() en su onunload(), y el usuario ha hecho clic en un enlace para ir a otra parte, usted está en el negocio.Sin embargo, si el usuario cierra la pestaña del navegador iPad Safari, el evento onunload() se disparará, pero su confirmación() tendrá una cancelación implícita como respuesta.

+0

¿Tiene algún ejemplo para esta solución? – testndtv

+0

Huh, parece que esta peculiaridad confirmada (que la segunda página es acierta antes del mensaje de confirmación) es cierta no solo para safari móvil sino también para firefox (y probablemente también para otros). Me acabas de volar la cabeza. – Amalgovinus

+2

evento 'download' en desuso en favor de' pagehide' ver https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511 -SW5 – sol0mka

1

Si solo necesita saber si la página se ha dejado, puede usar document.unload. Funciona bien en navegadores ios. Si se ve en Apple documentation encontrará que está obsoleto y se recomienda utilizar document.pagehide

+0

'document.pagehide' funciona bien para mí, gracias! – yarl

2

evento antes de la descarga no es compatible con Mobile Safari. Puede ver la lista de todos los eventos compatibles aquí: Handling Events Apple documentation

¡Y la carga previa no está en la lista!

8

Este bit de código JavaScript que funciona para mí en Safari y Chrome en IPAD y el iPhone, así como de sobremesa/portátiles/Otros navegadores:

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

Puede captar el evento, pero ¿cómo puede aparecer el mensaje de confirmación?Usar 'return 'test';' similar al de op no funciona ... – user2335065

+0

Gracias, lo perdí en la pregunta original. No he probado específicamente esto en iOS, pero posiblemente agregar esta línea adicional funcionaría: \t window.event.cancelBubble = true; Voy a agregar a mi respuesta – Danger

+2

Gracias, pero lamentablemente no funciona ... He intentado poner alert() en su interior, parece que la nueva página ha comenzado a cargarse antes de que se active la alerta(). También vea esto: http://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad – user2335065

Cuestiones relacionadas