2009-03-01 3 views
12

Merci d'avoir lu.jQuery: Abandonner automatiquement les requêtes Ajax lors du déchargement de page?

J'ai remarqué que si j'ai une page qui a une ou plusieurs requêtes ajax ouvertes, et je clique sur un lien pour quitter une page, ou l'actualiser, il attendra que les requêtes ajax se terminent avant de décharger.

Ce n'est généralement pas un problème, mais si la demande prend du temps, cela peut être le cas.

Je cherche quelque chose comme:

$(window).bind("beforeunload", function() {AjaxRequest.abort();}); 

pour abandonner automatiquement les demandes avant le déchargement, mais pas tout à fait sûr de savoir comment trouver les demandes ajax. Seraient-ils sous la fenêtre quelque part?

Répondre

8

La méthode $.ajax() jQuery renvoie l'objet XMLHttpRequest. Cela signifie que vous pouvez appliquer des méthodes standard sur l'objet, comme abort().

Pour décharger, utilisez la méthode d'événement jQuery unload intégrée.

var myajax = $.ajax(...); 
$(window).unload(function() { myajax.abort(); }); 
+0

je reçois une erreur de js "myajax.abort" est pas une fonction (jquery 1.3.2) a-t-on apprivoisé la "bête d'avortement"? – taber

+0

edit: Je pense que c'est parce que j'utilisais ".responseText" à la fin de mon appel $ .ajax (...). J'ai sorti .responseText et il n'y a pas d'erreur maintenant. Yay. – taber

+0

La méthode 'unload' a été supprimée dans Jquery:/ – Badiparmagi

1

pense que vous devez window.onunload événement, plus AjaxRequestX = $ .get (...) pour chaque demande, gardez peut-être des objets dans le tableau et passer par eux lors du déchargement.

4

Je viens d'avoir cette question, je faisais une longue boucle en PHP qui était appelé à partir .ajax $. Ma solution était d'ajouter session_write_close(); avant la longue boucle.

Ma théorie est, Chrome demande la page suivante avant annulant toutes les demandes ajax d'arrière-plan. Si votre requête ajax est la même _SESSION que la page que vous naviguez loin de et vers, alors vous avez un blocage avant même que votre première ligne de code PHP est touché.

+1

Votre réponse a résolu mon problème - merci beaucoup! –

1

Vous devez persister toute votre requête ajax et lorsque la page est en cours de rechargement, abandonnez toutes les demandes. Exemple

var _requests = []; 

var _abortAllRequests = function() { 
    $(_requests).each(function (i, xhr) { xhr.abort(); }); 

    _requests = []; 
} 

$(window).on("beforeunload", function() { 
    _abortAllRequests(); 
}); 

quelque part dans votre code

_requests.push($.ajax(...)) 

De plus, vous pouvez pop demandes effectuées à l'aide .ajaxSetup $ avec des événements ajaxStart ajaxStop, mais son à vous

5

Le code suivant est testé et avorte toutes les requêtes jQuery ajax en cours de déchargement de page dans Chrome, mais il est utilisé par Edge et IE en utilisant les clients sans erreur.

Mettez ce qui suit comme premier gestionnaire jQuery ready:

$(onPageLoaded) 

Et mettre quelque part accessible:

function onPageLoaded() { 
    var jqxhrs = []; 

    $(window).bind("beforeunload", function (event) { 
     $.each(jqxhrs, function (idx, jqxhr) { 
      if (jqxhr) 
       jqxhr.abort(); 
     }); 
    }); 

    function registerJqxhr(event, jqxhr, settings) { 
     jqxhrs.push(jqxhr); 
    } 

    function unregisterJqxhr(event, jqxhr, settings) { 
     var idx = $.inArray(jqxhr, jqxhrs); 
     jqxhrs.splice(idx, 1); 
    } 

    $(document).ajaxSend(registerJqxhr); 
    $(document).ajaxComplete(unregisterJqxhr); 
}; 
+0

Cela fonctionne très bien. Votre fonction ajax 'error' sera toujours invoquée pour l'abandon, alors assurez-vous de tester' textStatus! = 'Abort'' si vous consignez des erreurs de console, etc ... – dhc

+0

J'ai ajouté la dernière version de cette . Le code d'origine avait une boucle while() et ne se terminait que lorsqu'il n'y avait plus d'objets xhr. Cependant, ceci trouverait des entrées null xhr dans la liste, et une erreur dans certains cas. – yourpublicdisplayname

Questions connexes