J'ai un jeu qui fonctionne dans le navigateur Web (en tant que plugin) et ce que j'essaie de faire est:
Détectez si l'utilisateur a décidé de fermer le navigateur (ALT + F4, frapper le bouton 'X', etc.) P> LI>
empêche le navigateur de la fermeture tandis que nous déclenchons un appel à nos services Web pour vous connecter que l'utilisateur a fermé le navigateur P> LI>
Une fois que nous recevons la réponse des services Web, relâchez la serrure et permettez au navigateur de fermer comme demandé. P> li> ol>
La raison principale que nous voulons faire est de faire des problèmes de concurrence et de passer par nos journaux que nous souhaitons isoler les personnes se déconnecter / fermer le navigateur des instances authentiques où le plugin s'est écrasé. P>
J'ai cherché à ce que JQuery (pour la compatibilité des navigateurs X - Opéra ne fonctionnera pas, mais nous n'avons aucun utilisateur sur Opera Heureusement): P>
$(window).bind('beforeunload', function(e) { e.preventDefault(); // make AJAX call });
4 Réponses :
Je suis sûr que ce que vous voulez, il n'est pas possible d'utiliser JavaScript. Mais puisque vous avez un plugin de navigateur, ne devriez-vous pas pouvoir vérifier si votre objet plugin a été nettoyé correctement? Je ne sais pas si vous utilisez ActiveX, NPAPI ou quelque chose comme Firebreath, mais ces cadres ont toutes des méthodes de cycle de vie qui seront appelées sur votre plugin en cas d'arrêt normal, vous devriez donc pouvoir écrire quelque chose à la connecteurs à ce stade. Si le plugin se bloque, ceux-ci ne seront pas appelés. P>
Le fait que nous ne puissions pas faire l'appel du plug-in fiabilité de manière fiable la raison pour laquelle on a commencé à regarder le faire depuis le navigateur Web.
Son entreprise délicate pour éviter la fenêtre du navigateur d'être fermée. En fait, il n'ya aucun moyen de le faire, à côté de retourner une valeur non non définie code> à partir de l'événement Il y a une suggestion possible que je peux Créez, c'est la création d'une requête AJAX EM> Synchronisée EM> dans le en théorie, cela bloquera le navigateur pendant 4 secondes maximum. En réalité, les navigateurs traiteront cela différemment. Par exemple, Firefox (je l'ai testé sur 9), ne fermera pas la fenêtre immédiatement, mais elle ne respecte pas non plus la valeur du délai d'expiration. Je suppose qu'il y a un maximum interne de 2 secondes avant que la requête ne soit annulée et que la fenêtre / l'onglet soit fermée. Cependant, cela devrait suffire dans la plupart des cas, je suppose. P> Votre autre question (comment distinguer entre cliquer sur un lien) est assez simple. Comme décrit ci-dessus, à ce stade, nous recevrions toujours un Dialogue de confirmation lorsque la fenêtre / l'onglet est sur le point de se fermer. Si nous voulons éviter cela pour n'importe quel clic d'ancrage, nous pourrions la corriger comme p> Onbeforeunload code>, comme vous avez décrit.
Onbeforeunload code>. Par exemple p>
onbeforeunload code> Ce qui est retourné de ses gestionnaires d'événements. Alors suppose que nous avons une variable qui est global em> pour notre application, nous pourrions faire quelque chose comme p>
Merci Andreas pour votre contribution; Il n'y a donc aucun moyen d'empêcher le navigateur de fermer jusqu'à ce qu'une réponse soit reçue ... Le problème est si le joueur est sur une connexion lente; 2 secondes pourraient ne pas être suffisamment longue pour faire appel à l'appel. Merci pour l'explication de distinction entre un clic sur un lien - le plus utile
Si vous pensez à la manière dont il pourrait être utilisé, il est assez clair qu'aucun navigateur ne permettrait à une page de bloquer un temps de fermeture arbitraire avant de fermer. Si c'était possible, quelqu'un pourrait, par exemple, faire une pop up ad tant que un utilisateur ne pourrait jamais se fermer.
Quant à la première partie de votre question, il n'y a pas de moyen fiable d'empêcher le navigateur de fermer autre que d'utiliser window.onbeforeunload code>
. Le navigateur est là pour servir l'utilisateur et si l'utilisateur choisit de fermer son navigateur, il le fera.
Pour votre deuxième question, il est raisonnablement facile de distinguer un clic sur un lien d'autres événements déclenchant un ONBEFOREUnload CODE> Evénement par JQuery: P>
$('a').click(function(e) {window.onbeforeunload = null});
Vous pouvez utiliser ci-dessous pour empêcher le navigateur de se fermer: -
window.onbeforeunload = function() { //Your code goes here. return ""; }
Juste hors de curiosité ... Y a-t-il une différence si vous échangez le "PreventDefault" et les pièces "Faire des appels Ajax"?