Ich muss Benutzer vor nicht gespeicherten Änderungen warnen, bevor sie eine Seite verlassen (ein ziemlich häufiges Problem).
window.onbeforeunload=handler
Dies funktioniert, aber es wird ein Standarddialog mit einer irritierenden Standardnachricht ausgelöst, die meinen eigenen Text umschließt. Ich muss entweder die Standardnachricht vollständig ersetzen, damit mein Text klar ist, oder (noch besser) den gesamten Dialog durch einen modalen Dialog mit jQuery ersetzen.
Bisher habe ich versagt und ich habe niemanden gefunden, der eine Antwort zu haben scheint. Ist es überhaupt möglich?
Javascript auf meiner Seite:
<script type="text/javascript">
window.onbeforeunload=closeIt;
</script>
Die Funktion closeIt ():
function closeIt()
{
if (changes == "true" || files == "true")
{
return "Here you can append a custom message to the default dialog.";
}
}
Mit jQuery und jqModal habe ich Folgendes versucht (mithilfe eines benutzerdefinierten Bestätigungsdialogs):
$(window).beforeunload(function() {
confirm('new message: ' + this.href + ' !', this.href);
return false;
});
was auch nicht funktioniert - ich kann mich anscheinend nicht an das Ereignis beforeunload binden.
quelle
Antworten:
Sie können den Standarddialog für nicht ändern
onbeforeunload
, daher ist es möglicherweise am besten, damit zu arbeiten.Hier ist ein Verweis von Microsoft:
Das Problem scheint zu sein:
onbeforeunload
es aufgerufen wird, wird der Rückgabewert des Handlers als angenommenwindow.event.returnValue
.false
es als Zeichenfolge analysiert wird, wird das Dialogfeld ausgelöst, das dann ein entsprechendestrue
/ übergibtfalse
.Das Ergebnis ist, es scheint keine Möglichkeit der Zuordnung zu sein ,
false
umonbeforeunload
es aus dem Standard - Dialog zu verhindern.Zusätzliche Hinweise zu jQuery:
onbeforeunload
Ereignisse auftreten können. Wenn Sie nur möchten, dass Ihr Entladeereignis auftritt, würde ich mich an das einfache alte JavaScript halten.jQuery hat keine Verknüpfung für,
onbeforeunload
daher müssten Sie die generischebind
Syntax verwenden.Bearbeiten 2018.09.04 : benutzerdefinierte Nachrichten in onbeforeunload Dialoge sind veraltet , da Chrom-51 (siehe dazu : Release-Info )
quelle
Was für mich mit jQuery funktioniert und in IE8, Chrome und Firefox getestet wurde, ist:
Es ist wichtig, nichts zurückzugeben, wenn keine Eingabeaufforderung erforderlich ist, da hier Unterschiede zwischen dem IE und anderen Browserverhalten bestehen.
quelle
event.returnValue
ist die einzige "genehmigte" Methode im IE. Der IE fährt fort: "Der Wert dieser Eigenschaft hat Vorrang vor den von der Funktion zurückgegebenen Werten, z. B. über eine Microsoft JScript-Rückgabeanweisung." .. es wäre schön, eine garantierte Korrelation zwischenreturn
(vom Ereignis) undevent.returnValue
..Obwohl Sie unter bestimmten Umständen nichts gegen die Box unternehmen können, können Sie jemanden abfangen, der auf einen Link klickt. Für mich war dies für die meisten Szenarien die Mühe wert und als Fallback habe ich das Entladeereignis verlassen.
Ich habe Boxy anstelle des Standard-jQuery-Dialogs verwendet. Es ist hier verfügbar: http://onehackoranother.com/projects/jquery/boxy/
Sie können an ein anderes Ereignis anhängen und mehr nach der Art des Ankers filtern, auf den geklickt wurde. Dies funktioniert jedoch für mich und meine Aufgaben und dient anderen als Beispiel für die Verwendung oder Verbesserung. Ich dachte, ich würde dies für diejenigen teilen, die diese Lösung wollen.
Ich habe Code ausgeschnitten, daher funktioniert dies möglicherweise nicht so wie er ist.
quelle
1) Verwenden Sie onbeforeunload, nicht onunload.
2) Wichtig ist, dass keine return-Anweisung ausgeführt wird. Damit meine ich nicht, dass Sie nicht von Ihrem Handler zurückkehren. Sie geben alles in Ordnung zurück, aber Sie tun dies, indem Sie sicherstellen, dass Sie das Ende der Funktion erreichen und KEINE return-Anweisung ausführen. Unter diesen Bedingungen tritt der integrierte Standarddialog nicht auf.
3) Wenn Sie onbeforeunload verwenden, können Sie einen Ajax-Aufruf in Ihrem unbforeunload-Handler ausführen, um den Server aufzuräumen. Er muss jedoch synchron sein, und Sie müssen auf die Antwort in Ihrem onbeforeunload-Handler warten und sie verarbeiten (immer noch respektierend) Bedingung (2) oben). Ich mache das und es funktioniert gut. Wenn Sie einen synchronen Ajax-Anruf tätigen, wird alles angehalten, bis die Antwort zurückkommt. Wenn Sie eine asynchrone Aktion ausführen und der Meinung sind, dass Ihnen die Antwort vom Server egal ist, wird das Entladen der Seite fortgesetzt und Ihr Ajax-Aufruf wird durch diesen Vorgang abgebrochen - einschließlich eines Remote-Skripts, falls es ausgeführt wird.
quelle
Versuchen Sie, eine
return;
anstelle einer Nachricht zu platzieren. Dies funktioniert in den meisten Browsern für mich. (Dies verhindert nur wirklich die Geschenke des Dialogs)quelle
null
wird ein Dialogfeld mit dem Text "null" geöffnet. Derreturn void(0);
Dialog wird jedoch nicht geöffnet.Dies kann jetzt nicht in Chrome durchgeführt werden, um Spam zu vermeiden. Weitere Informationen finden Sie in Javascript onbeforeunload, in dem keine benutzerdefinierte Nachricht angezeigt wird .
quelle
Sie können erkennen, welche Taste (OK oder Abbrechen) vom Benutzer gedrückt wurde, da die Onunload-Funktion nur aufgerufen wird, wenn der Benutzer die Seite verlässt. Obwohl in dieser Funktion die Möglichkeiten begrenzt sind, weil das DOM zusammengebrochen wird. Sie können Javascript ausführen, aber der Ajax-POST macht nichts, daher können Sie diese Methode nicht für die automatische Abmeldung verwenden. Dafür gibt es aber eine Lösung. Die window.open ('logout.php') wird in der Onunload-Funktion ausgeführt, sodass sich der Benutzer mit einer neuen Fensteröffnung abmeldet.
Dieser Code wird aufgerufen, wenn der Benutzer die Seite verlässt oder das aktive Fenster schließt und sich mit 'logout.php' abmeldet. Das neue Fenster wird sofort geschlossen, wenn Logout-PHP aus Code besteht:
quelle
Ich hatte das gleiche Problem, ich war in Ordnung, ein eigenes Dialogfeld mit meiner Nachricht zu erhalten, aber das Problem, mit dem ich konfrontiert war, war: 1) Es gab eine Nachricht bei allen Navigationen, die ich nur zum Schließen möchte. 2) Wenn der Benutzer mit meiner eigenen Bestätigungsnachricht Abbrechen auswählt, wird weiterhin das Standarddialogfeld des Browsers angezeigt.
Es folgt der Lösungscode, den ich gefunden habe und den ich auf meiner Masterseite geschrieben habe.
quelle
Weitere Informationen finden Sie unter http://www.codeprojectdownload.com
quelle
Was ist mit der speziellen Version des Befehls "bind" "one"? Sobald der Ereignishandler das erste Mal ausgeführt wird, wird er automatisch als Ereignishandler entfernt.
quelle
.one()
- das fügt einen Ereignis-Listener hinzu, um darauf zu warten, dass das Ereignis nur einmal auftritt: "Hängen Sie einen Handler an ein Ereignis für die Elemente an. Der Handler wird höchstens einmal pro Element und Ereignistyp ausgeführt." api.jquery.com/oneWinkel 9 Ansatz:
Browserunterstützung und Entfernen der benutzerdefinierten Nachricht:
quelle