7
votes

Exécutez le code JavaScript uniquement si la fonction 'à l'avant -1load' renvoie true

J'utilise jQuery pour capturer l'événement de déchargement lorsqu'un utilisateur navigue loin d'une page. Cela fonctionne simplement bien, mais j'ai des données qui doivent être sauvées uniquement dans le cas où l'utilisateur vraiment veut partir.

Voici ma prise-22. Si je sauvegarde le code trop tôt et que l'utilisateur ne veut pas partir, j'ai gâché l'état du service Web soutenant le code.

J'ai donc besoin d'accomplir la tâche presque insurmontable d'exécution du code uniquement si la boîte de dialogue "à l'avant-charge" revient true. xxx

Ce code telle est pop Une boîte de dialogue qui vous demande 'Êtes-vous sûr de vouloir naviguer à l'écart du test de test? et si l'utilisateur clique sur Annuler empêchera l'utilisateur de quitter la page.

Voici une autre pensée: xxx

Cette seconde méthode n'empêchera pas l'utilisateur De quitter de toute façon, mais dans un cas, il exécutera d'abord du code de sauvegarde, et dans l'autre les déménagera dans le froid. Le problème avec cette approche est que la plupart des navigateurs (à juste titre) empêchent de confirmer des boîtes de lancement dans la fenêtre.Enunload State grâce aux années 90 Les développeurs Web de 90 aveugles aveugles des internautes de navigation médiocres avec elle.

Un avertissement de non-responsabilité: Je suis bien conscient que nous, dans la communauté du développeur Web, décourage fortement empêchant l'utilisateur de quitter une page et d'exécuter du code en arrière-plan car ils essaient de le faire. Quand je vois des questions telles que, "Comment puis-je empêcher un utilisateur de quitter mon site Web vraiment génial" ma réaction de jerk à genoux est typiquement ", ne le faites pas!" Cela dit c'est différent. Ceci est une page spécialisée pour un client particulier et nous en avons besoin comme une mesure de prévention de la panique. Je suis l'un des bons gars, je promets. Je suis un vous.


2 commentaires

Qu'en est-il de sauvegarder les données périodiquement dans de petites rafales / arrière-plan sauvegarder? De cette façon, vous avez juste besoin d'appeler cette sauvegarde () dans le gestionnaire d'événements ci-dessus..similaire à la manière dont Gmail enregistre temporairement le courrier électronique dans le dossier de projet à mesure que vous tapez.


Plus un pour une bonne idée, mais malheureusement pas une option dans ce cas.


3 Réponses :


7
votes

Essayez d'utiliser les deux événements. Ce dont vous avez besoin est une variable partagée dans la même portée, de ne pas dire une variable globale. OnbeforRunload sera tiré avant que la boîte de dialogue apparaisse. Onunload ne sera tiré que si l'utilisateur a cliqué pour échapper à la fenêtre / onglet. xxx

comme une portée, je veux dire quelque chose comme (fonction () { }) (); ou tout autre (constructeur ou fonctionnel) fonction.


1 commentaires

Cela fonctionne sur rafraîchir la page, mais lorsque je ferme la fonction ATTAGE AUTO_SAVE n'appelle pas.



4
votes

Testé et travailler en chrome.

$(window).on('beforeunload', function () {
   return 'Are you sure you want to navigate away from the Test Runner?';
});
$(window).on('unload', function () {
   $.ajax({ url: '/default.aspx', async: false });
});


1 commentaires

Testé sur Chrome, Firefox et IE10-7 aussi. Vous votant pour le faire correctement, mais je vais accepter des métadages répondant à une légère plus spécifique à ma demande.



1
votes

vient de rencontrer quels sont vos expériences maintenant

Le lien ci-dessous est une bonne référence pour ce problème.

https://developer.mozilla.org/en-us/ DOCS / Web / Evénements / Déchargement

"Le document est dans un état particulier:

  • Toutes les ressources existent toujours (IMG, IFRAME, etc.)
  • Rien n'est plus visible à l'utilisateur final
  • Interactions UI sont inefficaces (fenêtre.open, alerte, confirmez etc.)
  • Une erreur n'arrête pas le flux de travail de déchargement "

    Vous ne serez donc pas capable de déclencher quoi que ce soit après la portée avant que cela ne produise aucune valeur de retour


0 commentaires