V browseru, na stránkách, kde dochází k editaci záznamů, či jiné aktivitě, kterou je potřeba zakončit uložením či volbou nějakého tlačítka, se nám může hodit využít události onBeforeUnload k zobrazení potvrzovacího dialogu s dotazem, zde si uživatel opravdu přeje stránku opustit.
<html> <head> <script type="text/jscript"> // inicializace g_blnCheckUnload = true; function RunOnBeforeUnload() { if (g_blnCheckUnload) { window.event.returnValue = 'Text, který bude přidán do confirmačního dialogu'; } } function bypassCheck() { g_blnCheckUnload = false; } </script> </head> <body onBeforeUnload="RunOnBeforeUnload();"> <a href="http://www.havit.cz">dotaz zobrazen</a> <a href="http://www.havit.eu" onClick="bypassCheck">dotaz nezobrazen</a> </body> </html>
Událost onBeforeUnload se volá nejenom na odkazech a tlačítkách, ale i při zavírání okna prohlížeče a prakticky veškerých událostech, kde by mělo dojít k opuštění stránky.
Funguje to minimálně v Internet Exploreru a FireFoxu.
Modifikace s hlídáním změn
Nakonec se mi podařilo rozchodit i rozumnou podobu výše uvedeného, kdy je potvrzovací dotaz zobrazen jen při změně formulářových dat (a je tedy potřeba změny uložit):
<html> <head> <script type="text/jscript"> // inicializace g_blnCheckUnload = false; function RunOnBeforeUnload() { if (g_blnCheckUnload) { window.event.returnValue = 'Text, který bude přidán do confirmačního dialogu'; } } function bypassCheck() { g_blnCheckUnload = false; } function setupCheck() { g_blnCheckUnload = true; } registerEvents() { for (i = 0; i < document.forms[0].elements.length; i++) { document.forms[0].elements[i].onchange = setupCheck; } } </script> </head> <body onLoad="registerEvents();" onBeforeUnload="RunOnBeforeUnload();"> <form ...> <input .../> ... </form> <a href="http://www.havit.cz">dotaz zobrazen, jsou-li změny</a> <a href="http://www.havit.eu" onClick="bypassCheck">dotaz nezobrazen</a> </body> </html>
…další vylepšování je samozřejmě možné.
Update (PetrF): Pokud nějaké existující události onChange chceme zachovat
function registerEvents() { for (i = 0; i < document.forms[0].elements.length; i++) { var elem = document.forms[0].elements[i]; var fnOnChangeOld = (elem.onchange) ? elem.onchange : function () {}; elem.onchange = function () { fnOnChangeOld(); setupCheck() }; } }
…nebo přes jQuery.