2009-03-01 5 views
12

Danke fürs Lesen.jQuery: Automatisches Abbrechen von AjaxRequests beim Entladen der Seite?

Ich habe festgestellt, dass, wenn ich eine Seite habe, die eine oder mehrere Ajax-Anfragen geöffnet hat, und ich auf einen Link klicke, um eine Seite zu verlassen, oder sie aktualisiere, wird sie warten, bis die Ajax-Anfragen abgeschlossen sind.

Dies ist normalerweise kein Problem, aber wenn die Anfrage eine Weile dauert, kann es sein.

Ich bin auf der Suche nach so etwas wie:

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

automatisch abbrechen Anfragen vor entladen, aber nicht ganz sicher, wie die AJAX-Anfragen zu finden. Würden sie irgendwo unter dem Fenster sein?

Antwort

8

Die Methode $.ajax() jQuery gibt das XMLHttpRequest-Objekt zurück. Dies bedeutet, dass Sie Standardmethoden auf das Objekt anwenden können, wie abort().

Verwenden Sie zum Entladen die eingebaute jQuery-Ereignismethode .

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

Ich bin ein js Fehler "myajax.abort" bekommen ist keine Funktion (jquery 1.3.2) hat jemand das "abort biest" gezähmt? – taber

+0

edit: ich denke es liegt daran, dass ich ".responseText" am ende meines $ .ajax (...) calls benutzt habe. ich nahm .responseText heraus und es gibt keinen Fehler jetzt. Yay. – taber

+0

'Entladen' Methode wurde in Jquery entfernt:/ – Badiparmagi

1

Denken Sie window.onunload Ereignis Plus AjaxRequestX = $ .get (...) für jede Anforderung benötigen, vielleicht Objekte in Array halten und durch sie auf Entladen gehen.

4

Ich hatte gerade dieses Problem, ich war eine lange Schleife in PHP zu tun, die von $ Schnipsel genannt wurden. Meine Lösung bestand darin, session_write_close(); vor der langen Schleife.

Meine Theorie ist, fordert Chrome die nächste Seite vor Abbrechen alle Hintergrund AJAX-Anfragen. Wenn Ihre ajax-Anfrage die selbe _SESSION ist wie die Seite, von der Sie weg von AND TO navigieren, haben Sie einen Deadlock, bevor Sie selbst Ihre erste PHP-Codezeile treffen.

+1

Ihre Antwort löste mein Problem - vielen Dank! –

1

Sie müssen alle Ihre Ajax-Anforderungen persistieren und wenn die Seite neu geladen wird, brechen Sie alle Anfragen ab. Probe

var _requests = []; 

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

    _requests = []; 
} 

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

irgendwo im Code

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

Zusätzlich können Sie getan Anfragen mit $ .ajaxSetup mit Ereignissen ajaxStart ajaxStop Pop, aber seine bis zu Ihnen

5

Der folgende Code wird getestet und bricht Alle ausstehenden jQuery ajax-Anforderungen beim Entladen der Seite in Chrome, aber sie werden auch von Edge und IE ohne Probleme mit Clients verwendet.

die folgenden als erste jQuery ready Handler Put:

$(onPageLoaded) 

Und setzen diese irgendwo zugänglich:

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

Das funktioniert super. Ihre ajax 'error' Funktion wird immer noch für den Abbruch aufgerufen, also stellen Sie sicher, dass Sie nach' textStatus! = 'Abort'' suchen, wenn Sie Konsolenfehler usw. protokollieren. – dhc

+0

Ich habe die neueste Version hinzugefügt . Der ursprüngliche Code hatte eine while() - Schleife und wurde erst beendet, als keine xhr-Objekte mehr übrig waren. Dies würde jedoch Null-Xhr-Einträge in der Liste finden und würde in einigen Fällen einen Fehler ergeben. – yourpublicdisplayname

Verwandte Themen