2014-12-17 6 views
5

Ich benutze onbeforeunload Ereignis, um ajax Anfrage zu senden, um etwas Säuberungsaufgabe durchzuführen.Unterdrückungsbestätigungsdialog während onbeforeunload

Wenn ich onbeforeunload verwende, wird beim Schließen der Registerkarte der Bestätigungsdialog angezeigt. Was ich will, ist kein Bestätigungsdialog anzuzeigen und nur die Bereinigungsanfrage zu senden. Folgendes ist das Skript, das ich verwende.

window.onbeforeunload = unloadFunction; 
    function unloadFunction() { 
     var test_id = $('#test_id').val(); 

     jQuery.ajax({ 
      url: "/test/cleanup/" + test_id, 
      cache: false 
     }).done(function() { 
      return false; 
     }); 
     return false; 
    } 

Gibt es eine Möglichkeit, den Bestätigungsdialog zu unterdrücken?

Wie einige Vorschläge, habe ich versucht, Return-Anweisung zu return ; anstelle von return false; zu ändern. Aber das funktioniert auch nicht.

+0

Gibt 'null zurück;' tun, wonach Sie suchen? – Delorian

+0

Rückgabewert null; zeigt den Dialog nicht an, sendet aber den Ajax-Ruf nicht an den Server. –

+1

Dies könnte daran liegen, dass Sie nach dem Ajax-Anruf zurückrufen. Denken Sie daran, dass Ihr Ajax-Aufruf standardmäßig asynchron ist, sodass die Rückgabe aufgerufen wird, bevor der Ajax-Aufruf abgeschlossen wurde. Übergeben Sie in Ihren Ajax-Anrufeinstellungen async: false, und Sie können die Funktion done entfernen. Sie sollten dann die Rückgabe null nicht treffen, bis der synchrone Ajax-Aufruf abgeschlossen ist. – Delorian

Antwort

2

Wie pro meine Kommentare auf der ursprünglichen Nachricht, die Antwort durch Zugabe von async: false in den Ajax-Aufruf Einstellungen den Anruf synchron zu machen, ändern Sie die letzte Rückkehr falsch return null;, und entfernen Sie die getan Funktion:

window.onbeforeunload = unloadFunction; 
function unloadFunction() { 
    var test_id = $('#test_id').val(); 

    jQuery.ajax({ 
     url: "/test/cleanup/" + test_id, 
     cache: false, 
     async: false 
    }); 

    return null; 
} 
1

Wenn der Benutzer die Seite schließt, ist das Dokument tot, die Skripts sind leer. Sie erwarten, dass das Skript nach dem Schließen ausgeführt wird. Wenn sich die Registerkarte nicht schließt, fühlt es sich an, als wäre sie erstarrt und wartet darauf, dass Ihre Funktion beendet wird. Das bedeutet, dass es nicht möglich ist. Ich glaube, das ist was du willst? Die Bereinigungsanforderung wird nicht gesendet, da das Dokument geschlossen ist.

+1

Derzeit wird mit dem obigen Code die Bereinigungsanforderung gesendet, da sie vor dem Entladen vorliegt. Aber es zeigt den Bestätigungsdialog an, ob der Benutzer die Seite verlassen möchte oder nicht. Ich möchte nicht, dass dieser Dialog angezeigt wird. –

+0

Die Bereinigungsanforderung wird nicht gesendet, wenn das Popup nicht angezeigt wird, da das Popup das Schließen des Dokuments und die Ausführung der Bereinigungsanforderung verhindert –

Verwandte Themen