web-dev-qa-db-fra.com

window.onbeforeunload ne fonctionne pas sur l'iPad?

Quelqu'un sait-il si l'événement onbeforeunload est pris en charge sur l'iPad et/ou s'il existe une autre façon de l'utiliser?

J'ai essayé à peu près tout, et il semble que l'événement onbeforeunload ne soit jamais déclenché sur l'iPad (navigateur Safari).

Plus précisément, voici ce que j'ai essayé:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (les deux ci-dessus ensemble)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (toutes les fonctions ci-dessus mais à l'intérieur de <body onbeforeunload="...">

Tous ces éléments fonctionnent sur FF et Safari sur PC, mais pas sur iPad.

De plus, j'ai fait ce qui suit juste après le chargement de la page:

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

Respectivement, les résultats sont:

  • true
  • object
  • null

Ainsi, le navigateur a la propriété, mais pour une raison quelconque, il ne se déclenche pas.

Les façons dont j'essaie de m'éloigner de la page sont en cliquant sur les boutons Précédent et Suivant, en effectuant une recherche Google dans la barre supérieure, en changeant l'emplacement dans la barre d'adresse et en cliquant sur un signet.

Quelqu'un a-t-il une idée de ce qui se passe? J'apprécierais grandement toute contribution.

Merci

76
Art Zambrano

J'ai constaté que l'événement onunload () se déclenche. Son comportement est quelque peu étrange; tout ce que vous avez dans votre fonction de rappel attachée à l'événement est réellement exécuté après que la nouvelle page a été chargée en arrière-plan (vous ne pouvez pas encore dire qu'elle est chargée, mais la journalisation du serveur montrera qu'elle l'a).

Plus étrange, si vous avez un appel confirm () dans votre onunload () et que l'utilisateur a cliqué sur un lien pour aller ailleurs, vous êtes en affaires. Si, cependant, l'utilisateur ferme l'onglet du navigateur iPad Safari, l'événement onunload () se déclenchera, mais votre confirm () aura une annulation implicite comme réponse.

19
Danny Armstrong

Ce morceau de JavaScript fonctionne pour moi sur Safari et Chrome sur ipad et iphone, ainsi que sur les ordinateurs de bureau/portables/autres navigateurs:

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!
    ...
} );
11
Danger

Seulement Apple le saurait avec certitude, mais je suppose qu'ils n'ont pas intentionnellement activé cette fonctionnalité dans Safari mobile car elle est le plus souvent utilisée par des personnages louches pour vous faire rester sur leur site ou pop de nombreuses fenêtres pornographiques/publicitaires.

4
Charles Boyung

l'événement beforeunload n'est pas pris en charge par Mobile Safari. Vous pouvez voir la liste de tous les événements pris en charge ici: Gestion des événements Apple

Et le beforeunload n'est pas dans la liste!

3
Julien Bachmann

Il y a bogue connu dans WebKit avec onbeforeunload. Je pense qu'il est corrigé dans la dernière version bêta de Chrome 5, mais il est fort possible que le navigateur de l'iPad soit créé à partir d'une version de WebKit qui n'a pas le correctif.

Related Chrome .

3
Joel Mueller

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

voir entendre.

les alertes ne sont plus autorisées pendant les événements de fermeture de page (avant le déchargement, le déchargement, la page masquée).

Je pense que les alertes, les invites, les confirmations et d'autres actions comme celles-ci ne sont également plus autorisées.

2
zelda.j

Si vous avez juste besoin de savoir si la page a été laissée, vous pouvez utiliser document.unload. Cela fonctionne bien dans les navigateurs iOS. Si vous voyez sur documentation Apple vous constaterez que c'est obsolète et ils recommandent d'utiliser document.pagehide

1
Miquel

Voici une solution qui devrait fonctionner sur tous les navigateurs modernes:

var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
    if (unloaded)
        return;
    unloaded = true;
    console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
    if (document.visibilityState == 'hidden')
    {
        if (unloaded)
            return;
        unloaded = true;
        console.log("beforeUnload");
    }
});

Les navigateurs mobiles n'ont pas tendance à ne pas prendre en charge beforeunload car le navigateur peut aller en arrière-plan sans décharger la page, puis être tué par le système d'exploitation à tout moment.

La plupart des navigateurs de bureau contiennent un bogue qui empêche visibilityState d'être appelé lors du déchargement du document. Voir: ici .

Par conséquent, il est important d'inclure les deux événements pour couvrir tous les scénarios.

[~ # ~] nb [~ # ~]

J'ai utilisé console.log au lieu de alert dans mon exemple, car alert sera bloqué par certains navigateurs lorsqu'il sera appelé à partir de beforeunload ou visibilitychange.

0
Dan Bray