2012-08-03 15 views
13

Es bien sabido que Mobile Safari se detiene la ejecución de Javascript en una página web cuandocaso Pagehide de conmutación pestaña inminente en Mobile Safari no se dispara cuando se ejecuta en IPAD

  1. se cambia a diferentes pestaña del navegador interruptor
  2. a una aplicación de iOS diferente (por ejemplo, cuando se recibe una llamada de la aplicación de teléfono)

usted puede suscribirse a "pagehide" de la ventana y "pageshow" víspera para detectar la suspensión inminente y la reactivación de Javascript.

El problema es que esos eventos No activar cuando pestaña de conmutación de (1) en una iPad Mobile Safari. En un iPhone Mobile Safari todo es bien, tal como se describe arriba.

Es trivial demostrar:

<!DOCTYPE html> 
<html> 
<head> 
    <script> 
     window.addEventListener("pagehide", function(evt){ 
      var logger = document.getElementById('log_id'); 
      logger.innerText = logger.innerText + " pagehide fired!"; 
     }, false); 
    </script> 
</head> 
<body> 
<div id="log_id"></div> 
</body> 
</html> 

Se dispara en iPads (iOS5 y iOS6 Preview3) sólo cuando hacen App-conmutación (2) y no en la pestaña de conmutación (1). Todos los iPhones funcionan bien.

¿Alguien ha sido capaz de detectar un inminente cambio de pestañas en el navegador del iPad?

La reactivación de Javascript cuando la pestaña vuelve a activarse puede detectarse mediante un latido del ritmo cardíaco como se describe en this discussion of the same topic.

+0

Este evento también se dispara cuando el dispositivo está bloqueado. Puede usar pageshow, que se activará cuando el dispositivo esté desbloqueado y la página se muestre de nuevo. –

+0

¿Has probado [window.onblur] (https://developer.mozilla.org/en-US/docs/Web/API/window.onblur)? Eso podría funcionar. – Uooo

Respuesta

1

Intente comprobar el enfoque y el desenfoque en el documento.

¿Por qué necesita la API Visibilidad de página?

  1. Puede usar el evento de almacenamiento para decir otras páginas, que está activo.
  2. Puede usar temporizadores (setInterval) para verificar la hora del último disparo del temporizador. Y si es más grande de lo esperado, la página estaba oculta, porque la mayoría de los navegadores detienen el temporizador y la página está oculta.
0

Estoy de acuerdo con Pinal: Use focus/blur! Pero sugiero no en el documento, sino en la ventana. Simplemente registre a un oyente y haga sus cosas allí.

Como dice http://caniuse.com/#feat=pagevisibility, la característica que desea utilizar no está bien implementada. (Edición: acaba de probarlo en un mini caso de prueba, funciona en iOS 5/6, aunque caniuse.com afirma diferente)

Si intenta utilizar un temporizador, puede intentar solicitarAnimationFrame como alternativa a setInterval .

+0

Escribo un juego html5, estoy haciendo una pausa en la física del juego cuando un jugador se va del juego, los desenfoques y los eventos de enfoque no se disparan en safari en iOS 6.1.3, por ejemplo. '$ (ventana) .on ('blur', _ pauseGame)' cuando cambio las pestañas y vuelvo a la pantalla de inicio de ios, los eventos funcionan perfectamente en el escritorio. – Rob

1

Reparado por Apple en iOS7. (Sólo intenté en el simulador de iPad)

Cuestiones relacionadas