2013-10-09 10 views
5

In meiner Anwendung gibt es ein Objekt, das auf den Server zurückgelenkt werden muss, bevor der Benutzer zu einer anderen Seite wechselt oder seinen Browser schließt.einen Ajax-Aufruf auf window.unload

Im Moment bin ich mit so etwas wie dies:

$(window).on('unload', function() { 
    $.ajax(....);  
}); 

die Ajax-Aufruf Feuer wird in allen Browsern oder gibt es Situationen, in denen dies nicht funktionieren und wo diese Situation anders behandelt werden muss? Ich muss mich mit nichts in Bezug auf eine Erfolgsfunktion befassen, ich bin nur besorgt über die Information, die es zum Server bringt.

Danke.

+1

Sie können sich nicht darauf verlassen, dass ein "unload" -Ereignis generiert wird, bevor eine Seite gelöscht wird. Dies geschieht durch den Browser unter * normalen * Umständen, aber nicht, wenn der Browser nichts dagegen tun kann (plötzliches Herunterfahren des Systems zum Beispiel). – Pointy

+0

Sie können sich auf nichts von diesem Logi verlassen ... * zieht Kraftakkord * –

Antwort

3

Wenn Sie jQuery verwenden, können Sie im Ajax-Aufruf async auf false setzen. Und es könnte funktionieren, aber Ihre Ergebnisse können je nach Browser variieren. Hier ist ein JsFiddle-Beispiel. http://jsfiddle.net/jtaylor/wRkZr/4/

// Note: I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload. Keep an eye on this. 
//  http://vidasp.net/jQuery-unload.html 
//  https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery 

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload. This variable is used to prevent us from showing both messages during a single event. 


var doAjaxBeforeUnload = function (evt) { 
    if (!doAjaxBeforeUnloadEnabled) { 
     return; 
    } 
    doAjaxBeforeUnloadEnabled = false; 
    jQuery.ajax({ 
     url: "/", 
     success: function (a) { 
      console.debug("Ajax call finished"); 
     }, 
     async: false /* Not recommended. This is the dangerous part. Your mileage may vary. */ 
    }); 
} 

$(document).ready(function() { 
    window.onbeforeunload = doAjaxBeforeUnload; 
    $(window).unload(doAjaxBeforeUnload); 
}); 

In Google Chrome schließt der Ajax-Aufruf immer, bevor ich von der Seite verlassen.

Allerdings würde ich sehr viel nicht empfehlen diese Route gehen. Das "a" in Ajax ist für "asynchron", und wenn Sie versuchen, zu zwingen, wie ein synchroner Anruf zu fungieren, bitten Sie um Probleme. Dieses Problem manifestiert sich in der Regel als das Einfrieren des Browsers - was passieren kann, wenn der Ajax-Anruf lange gedauert hat.

Wenn möglich, sollten Sie den Benutzer vor der Navigation von der Seite abfragen, wenn die Seite Daten enthält, die über Ajax veröffentlicht werden müssen. Ein Beispiel finden Sie in dieser Frage: jquery prompt to save data onbeforeunload

1

Nein, leider wird Ihr Ajax-Anruf nicht abgeschlossen, da das Dokument während des Async-Aufrufs entladen wird. Sie können nicht viele Dinge tun, wenn der Benutzer das Fenster schließt.

0

Sie müssen das onbeforeunload-Ereignis verwenden und einen synchronen AJAX-Aufruf durchführen.

$.ajax({ 
    ... 
    "url": "http://www.example.com", 
    "async": false, 
    ... 
}); 
0

Statt einen Ajax-Sync-Aufruf zu tun (veraltet auf neuesten Browser und kann Ausnahme erhalten), können Sie ein Popup öffnen:

$(window).on('unload', function() { 
    window.open("myscript.php"); 
}); 

Sie können offensichtlich Parameter in den Der Link und Sie können das Popup automatisch schließen, wenn Sie möchten. Der Popup-Blocker muss in den Browseroptionen für Ihre Domain deaktiviert werden.