2010-06-25 4 views
4

Je souhaite contrôler la facilité avec laquelle les utilisateurs peuvent quitter mon application. Maintenant, je sais que je ne peux pas le faire complètement; C'est pour ça que les emplois cron sont. Mais j'aimerais attraper autant de cas que possible.Est-ce que OnBeforeUnload peut exécuter du code s'il accepte la boîte de dialogue?

Je pensais, je pourrais utiliser onBeforeUnload pour afficher la boîte de dialogue, les avertissant de quitter et leur demandant de cliquer s'il vous plaît sur le bouton Quitter à la place. Mais alors j'ai découvert qu'il pourrait être possible d'exécuter un appel AJAX synchrone (heh) lorsque onBeforeUnload est appelé; l'avantage d'être synchrone est que le navigateur attendra qu'il se termine avant de continuer, si je comprends bien. De cette façon, je pourrais dire au serveur que je me déconnecte en fermant la fenêtre. Et parce que c'est dans onBeforeUnload et non onUnload, toutes les données sont toujours existantes et l'appel sera envoyé.

Ma question est, est-il possible de combiner ces? Je voudrais un popup les avertissant de partir, et s'ils continuent à vouloir partir, envoyer le message qu'ils partent en fait. De la façon dont je le comprends, je ne peux pas le faire; Je peux le faire:

  1. Envoyer le message que
  2. Mettre en place la boîte de dialogue ne
  3. Envoyer le message et mis la boîte de dialogue

... mais je ne peux pas envoyer le message conditionnellement si ils ont accepté le dialogue, non? Ma compréhension est que quand ils cliquent sur "OK, je veux partir", il déclenche immédiatement onUnload, et à ce moment-là il est trop tard. Et # 3 ci-dessus n'est pas utile parce que je ne veux pas envoyer le message qu'ils se déconnectent, puis leur demander d'annuler la boîte de dialogue et de rester sur la page. Puis-je avoir mon gâteau et le manger aussi? Puis-je leur demander s'ils veulent partir et, si oui, envoyer le message?

+0

Ne comptez pas sur 'onbeforeunload' pour ces choses, ce n'est pas sûr: cet événement non-standard n'est pas supporté par Opera et ne se déclenche donc jamais. De plus, tuer un navigateur en utilisant un gestionnaire de tâches ou quelque chose (commande * nix 'kill') ne déclenche pas non plus cet événement. –

+0

Comme je l'ai dit au début de mon article, je n'avais pas l'intention de * compter * sur le navigateur pour quoi que ce soit. C'est ce que les emplois cron côté serveur sont: attraper fermetures disgracieuses. J'espérais faire en sorte que cela soit aussi gracieux que possible et attraper autant de situations que possible. – Andrew

+0

Ah, j'ai raté cette partie. –

Répondre

-1

Comme je l'ai déjà indiqué dans un commentaire, onbeforeunload ne fonctionne pas dans Opera. Cependant, j'ai essayé le code suivant dans Firefox (3.6.3/Linux) et Chromium (5.0.375.70) et cela a fonctionné plus ou moins. Toutefois, lors de la fermeture de la fenêtre ou de l'onglet Chromium, la boîte de confirmation est affichée, mais en une seconde, la fenêtre/l'onglet est fermé, même si vous cliquez sur Ok. Il semble y avoir un délai d'attente pour XMLHttpRequests synchrone pendant onbeforeunload.

window.onbeforeunload = function() { 
    if (confirm("Send unsaved data?")) 
     sendData(); 

}; 

function sendData() { 
    var request = new XMLHttpRequest(); 
    request.open("POST", "wait.php", false); // false = synchronous request 
    request.send('data={"foo":"bar"}'); 
    if (request.readyState == 4 && request.status == 200) 
     alert("Succes!"); 

} 

Mise à jour - Juste pour être complet, comme je l'ai oublié d'inclure wait.php, il ne détient que la connexion pendant 10 secondes:

<?php sleep(10); ?> 
+0

Cela ne sera probablement utilisé dans FF et IE de toute façon, je ne vais pas sortir de ma façon de soutenir Opera et Chrome (c'est une application interne). Mais ça a l'air assez vague. Sur la base de ce que je vois, je pense que je préférerais juste lancer mon sort avec 'cron'. (Encore une fois, pas que ça n'allait pas exister * de toute façon *, je voulais juste voir à quel point je pourrais faire la fermeture de l'application, pas trop, semble-t-il.) – Andrew

+0

@Andrew: En effet. C'est juste que le web n'a pas été conçu pour faire ce genre de choses. –

Questions connexes