Potřebuji uživatele varovat před neuloženými změnami, než opustí stránku (docela běžný problém).
window.onbeforeunload = handler
Funguje to, ale vyvolává to výchozí dialog s obtěžující standardní zprávou, která zalamuje můj vlastní text. Potřebuji buď úplně nahradit standardní zprávu, aby byl můj text jasný, nebo (ještě lépe) nahradit celý dialog modálním dialogem pomocí jQuery.
Zatím jsem selhal a nenašel jsem nikoho jiného, kdo by na to měl odpověď. Je to vůbec možné?
Javascript na mé stránce:
<script type="text/javascript"> window.onbeforeunload = closeIt; </script>
Funkce closeIt():
function closeIt() { if (changes == "true" || files == "true") { return "Here you can append a custom message to the default dialog."; } }
Pomocí jQuery a jqModal jsem zkoušel něco podobného (pomocí vlastního dialogu pro potvrzení):
$(window).beforeunload(function () { confirm('new message: ' + this.href + ' !', this.href); return false; });
což také nefunguje – zdá se, že se nemohu vázat na beforeunload
událost.
Odpověď
Výchozí dialog pro onbeforeunload
nelze upravit , takže nejlepším řešením může být pracovat s ním.
window.onbeforeunload = function() { return 'You have unsaved changes!'; }
Zde je odkaz od společnosti Microsoft:
Když je řetězec přiřazen k vlastnosti returnValue okna.event, zobrazí se dialogové okno, které uživatelům dává možnost zůstat na aktuální stránce a zachovat řetězec, který jí byl přiřazen. Výchozí příkaz, který se objeví v dialogovém okně:„Opravdu chcete opustit tuto stránku? … Chcete-li pokračovat, stiskněte tlačítko OK nebo chcete-li zůstat na aktuální stránce, stiskněte tlačítko Zrušit.“, nelze odstranit ani změnit.
Zdá se, že problém je:
- Když
onbeforeunload
je volána, bude mít návratovou hodnotu handleru jakowindow.event.returnValue
. - Potom analyzuje vrácenou hodnotu jako řetězec (pokud není null).
- Od
false
je analyzován jako řetězec, spustí se dialogové okno, které poté předá odpovídajícítrue
/false
.
Výsledkem je, že se zdá, že neexistuje způsob, jak přiřadit false
na onbeforeunload
abyste mu zabránili ve výchozím dialogu.
Další poznámky k jQuery:
- Nastavení události v jQuery může být problematické, protože to umožňuje jiné
onbeforeunload
události, které také nastanou. Pokud si přejete, aby došlo pouze k události uvolnění, držel bych se pro to prostého JavaScriptu. -
jQuery nemá zkratku pro
onbeforeunload
takže budete muset použít obecnýbind
syntaxe.$(window).bind('beforeunload', function() {} );
Upravit 9. 4. 2018 :vlastní zprávy v dialogových oknech onbeforeunload jsou od verze chrome-51 zastaralé (srovnej:poznámka k vydání)