jQuery ajax appelle un gestionnaire de déchargement qui se déclenche APRÈS avoir la page actualisée lors d’un rafraîchissement manuel Comment puis-je garantir que le déchargement arrive en premier?

J’ai une situation où, à la page déchargement, je lance une demande de suppression du brouillon du travail d’un utilisateur. Cela fonctionne correctement jusqu’à ce qu’un utilisateur choisisse d’actualiser la page, après quoi l’inspection de l’onglet réseau de Chrome indique que Chrome charge la nouvelle page avant que la demande ajax ne soit réellement déclenchée. Le résultat est qu’un nouveau brouillon est créé par le chargement de la page, puis supprimé immédiatement par l’appel ajax. Voici essentiellement ce que je fais:

window.onbeforeunload = function(){ if (pageUpdated){ return 'Are you sure you want to abandon this draft?'; } } window.onunload = function(){ $.ajax({ async: false, type: 'DELETE', url: '/some/url/' }); } 

Existe-t-il un moyen de forcer le gestionnaire onunload à se terminer avant que la demande de la nouvelle page ne soit envoyée?

Navigateurs testés: (Chrome 9, FF 3.6) sur Ubuntu 10.04 Lucid

Dans onbeforeunload ou $ .unload (), configurez votre object AJAX avec async = false. Cela garantira que l’appel ajax se termine avant le déchargement de la page.

Je sais que cette question date de quelques mois, mais je voulais append cette information au cas où cela aiderait tous ceux qui recherchent un problème similaire avec AJAX!

Rendre la demande XHR synchrone devrait retarder le chargement de la nouvelle page jusqu’à ce que la demande soit complète. Je ne sais pas comment jQuery gère ses requêtes XHR synchrones sous le capot, mais voici comment vous pouvez le faire en utilisant du JavaScript pur:

 var request = new XMLHttpRequest(); // or new ActiveXObject("Microsoft.XMLHTTP") for some versions of IE request.open("GET", "/some/url", false); request.send(null); var result = request.responseText; alert(result); 

En mettant cela dans votre gestionnaire de déchargement, le navigateur devrait attendre que “/ some / url” soit chargé avant de passer à la page suivante.

Je suis ici pour confirmer la réponse de @Silkster. Je peux envoyer une requête AJAX après avoir défini une option async = false

Voici l’exemple de code.

 $(window).unload( function () { $.ajaxSetup ({ async: false }); $.get("target.php"); }); 

Vous pouvez essayer d’utiliser window.onbeforeunload place, mais je ne suis pas sûr qu’il soit implémenté dans tous les navigateurs.