<div class="gmail_quote">On Fri, Dec 12, 2008 at 12:55 AM, Ian Hickson <span dir="ltr"><ian@hixie.ch></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="Ih2E3d">On Sun, 16 Nov 2008, ddailey wrote:<br>
><br>
> Here's the sitch: because of an extensive use of CTRL sequences in the<br>
> interface, the user will sometimes accidentally do something like CTRL R<br>
> (which the browser thinks is a refresh command). In a regular app, if<br>
> users stand in jeopardy of losing all their work, the app usually warns<br>
> them before quitting. The way I found to work around it (that used to<br>
> work) was to use onunload="confirm('save before quitting?'). Currently,<br>
> however, IE seems to have removed my ability to intervene before it<br>
> erases all work. onbeforeunload=function (){ fix(everything)} doesn't<br>
> seem to help either.<br>
><br>
</div><div class="Ih2E3d">> So the question: how does HTML 5 currently address the issue and do<br>
> browsers actually implement something along this line these days?<br>
<br>
</div>I just went ahead and specced out the 'onbeforeunload' feature that most<br>
browsers support today that handles this case.<br>
<br>
Basically you just need to do<br>
<br>
   onbeforeunload="if (dirty) return 'You have unsaved work. Are you sure you want to close this page?'"<br>
<br>
...or some such.<br>
<div class="Ih2E3d"></div></blockquote><div><br></div><div>If we're going for matching what browsers do, there's a number of cases (different in each browser) where the confirm doesn't popup. In Chrome, for example, if the beforeunload handler takes too long, we kill it and navigate away. Similarly, in Firefox, if the beforeunload handler hits the limit for script execution and the user stops the script, the beforeunload handler never fires.</div>
<div><br></div><div>Not sure what the right language for that is. But developers try to do things like using beforeunload/unload to release locks, make server requests, etc. and it's just not a very reliable thing to do in any browser. It's really just useful for the quick prompt for the user as to things like unsaved changes. </div>
<div><br></div><div>Ojan</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="Ih2E3d">On Mon, 17 Nov 2008, Thomas Broyer wrote:<br>
><br>
> I'm not sure you can automatically save but what you can do is cancel<br>
> the unload with a prompt.<br>
><br>
</div><div class="Ih2E3d">> window.onbeforeunload = function() {<br>
>   return "Your unsaved changes will be lost. Are you sure you want to leave?";<br>
> };<br>
><br>
> The browser will prompt the user with the returned string. Clicking "no"<br>
> or "cancel" (depends on the browser) will cancel the "unload". If you<br>
> don't want the prompt, just return "undefined" (beware, returning null<br>
> in IE6 is equivalent to returning the string "null").<br>
><br>
> window.onbeforeunload = function() {<br>
>  if (unsavedChanges) {<br>
>    return "You have unsaved changes.";<br>
>  }<br>
>  // return nothing, i.e. return undefined<br>
> };<br>
<br>
</div>Right.<br>
<div class="Ih2E3d"><br>
<br>
> HTML5 is almost silent about beforeunload and unload (and many other)<br>
> events re. their properties (cancelable in this case). unload is defined<br>
> in DOM3-Events (as non-cancelable) but AFAICT beforeunload is not spec'd<br>
> anywhere.<br>
<br>
</div>Fixed.<br>
<div class="Ih2E3d"><br>
<br>
On Mon, 17 Nov 2008, Philipp Serafin wrote:<br>
><br>
> What you can do for an "emergency save" is to fire a *synchronous* XHR during<br>
> the unload event. This will freeze the UI but since the user was about to<br>
> close the page anyway, this shouldn't matter much.<br>
<br>
</div>The other alternative is to be always saving state on the server (or in<br>
a local database, cookie, or equivalent).<br>
<font color="#888888"><br>
--<br>
Ian Hickson               U+1047E                )\._.,--....,'``.    fL<br>
<a href="http://ln.hixie.ch/" target="_blank">http://ln.hixie.ch/</a>       U+263A                /,   _.. \   _\  ;`._ ,.<br>
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'<br>
</font></blockquote></div><br>