2009-12-11 23 views
64

Ich habe ein kleines Problem. Ich versuche, das OnUnLoad-Ereignis des Fensters abzufangen und eine Bestätigungsfrage zu stellen. Wenn der Benutzer entscheidet, dass er bleiben möchte, ist es in Ordnung, und wenn er die Seite verlassen möchte, werden alle nicht gespeicherten Daten gelöscht. Hier sind die Probleme ...jQuery UI Dialog OnBeforeUnload

Ich benutze eine jQuery UI Dialog und wenn ich den folgenden Code auf meiner Seite, habe ich den Dialog geöffnet, und wenn ich auf die Zurück-Schaltfläche im Browser klicken, erscheint es nie die msgbox. Es erfrischt nur die Seite:

<script type="text/javascript"> 
    $(window).bind('beforeunload', function() { 
      alert('you are an idiot!'); 
     } 
    ); 
</script> 

Und die Lösung, die ich benutze einen Beitrag here war. Auch hier wird die msgbox angezeigt, wenn das Dialogfeld jQuery UI nicht geöffnet ist. Wenn ich das tue, dann zeigt es die msgbox nicht an und aktualisiert nur die Seite.

Irgendwelche Ideen?

+1

Welchen Browser verwenden Sie? Das 'onbeforeunload'-Ereignis ist in w3-Standards nicht angegeben, daher unterstützen einige Standard-strikte Browser es nicht. Das bekannte Beispiel ist Opera. – BalusC

+0

IE8, und versuchte es im Kompatibilitätsmodus und hat auch nicht funktioniert ... – Keith

+0

Wie kann ich einen Qualifier hinzufügen? Ich möchte, dass diese Nachricht nur angezeigt wird, wenn der Benutzer einige Änderungen am Text der Seite vorgenommen hat. – Nicholas

Antwort

111

Die korrekte Art, die Warnung anzuzeigen, besteht darin, einfach eine Zeichenfolge zurückzugeben. Rufen Sie nicht die alert() Methode selbst auf.

<script type="text/javascript"> 
    $(window).on('beforeunload', function() { 
     if (iWantTo) { 
      return 'you are an idiot!'; 
     } 
    }); 
</script> 

Siehe auch: https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

+1

Also wenn ich Ich gebe eine Zeichenfolge zurück. Wie kann ich sagen, ob sie Ok oder Abbrechen gesagt haben? oder spielt es eine Rolle? Ich möchte eigentlich eine Bestätigung ("Bist du ein Idiot?"); und dann erfassen, welches Ergebnis sie gewählt haben. Hast du eine Ahnung, wo ich damit anfangen würde? – Keith

+4

Wenn sie auf Abbrechen klicken, bleiben sie auf der Seite. Wenn sie auf Ok klicken, verlassen sie die Seite. –

+0

Aber lesen Sie mein aktuelles Problem. Dies funktioniert einwandfrei, wenn der jQuery-Dialog nicht geöffnet ist. Wenn es geöffnet ist, wird die Bestätigung nicht angezeigt und die Seite wird nur aktualisiert ... – Keith

14

das funktioniert für mich

$(window).bind('beforeunload', function() { 
     return 'Do you really want to leave?' ; 
}); 
1

jQuery API sagt ausdrücklich nicht beforeunload zu binden, und stattdessen sollten direkt an die window.onbeforeunload binden, ich lief nur über einen ziemlich schlechten Speicher teilweise wegen der Bindung an beforeunload mit jQuery.

+16

Sie sollten Ihre Referenz mit dieser Antwort verknüpfen, es würde Leuten einen Platz geben, um tiefer in das Problem zu graben. –

+6

Soweit ich sehen kann, sagt jQuery's Dokumentation nur: Das beforeunload Ereignis wird browserübergreifend in jQuery 1.5 unterstützt .1 und 1.6+, aber wird nicht in IE für jQuery 1.5.2 aufgrund einer Regression unterstützt .. – StriplingWarrior

+11

-1 weil keine Quelle/Verweis für "die jQuery API .. sagt" verknüpft wurde. –

43

Sie auch eine Ausnahme für das Verlassen der Seite über die Einreichung einer bestimmten Form machen:

$(window).bind('beforeunload', function(){ 
    return "Do you really want to leave now?"; 
}); 

$("#form_id").submit(function(){ 
    $(window).unbind("beforeunload"); 
}); 
1

Dies funktioniert für mich:

window.addEventListener("beforeunload", function(event) { 
 
    event.returnValue = "You may have unsaved Data"; 
 
});

0

für ASP.NET MVC Wenn Sie eine Ausnahme für das Verlassen der Seite über das Senden eines bestimmten Formulars machen möchten:

Legen Sie eine Formular-ID:

@using (Html.BeginForm("Create", "MgtJob", FormMethod.Post, new { id = "createjob" })) 
{ 
    // Your code 
} 



<script type="text/javascript"> 

    // Without submit form 
    $(window).bind('beforeunload', function() { 
     if ($('input').val() !== '') { 
      return "It looks like you have input you haven't submitted." 
     } 
    }); 

    // this will call before submit; and it will unbind beforeunload 
    $(function() { 
     $("#createjob").submit(function (event) { 
      $(window).unbind("beforeunload"); 
     }); 
    }); 

</script>