It is a common practice to handle the 'unsaved data on page' scenario by means of handling 'window.onbeforeunload' event. A typical way of handling this event would be like this.
window.onbeforeunload = handleUnsavedData;
function handleUnsavedData()
{
if (pageUpdated)
{
return 'You have unsaved data on the page. Are you sure you want to navigate away from the page?';
}
}
This works, but you may have noticed that the 'onbeforeunload' event is getting fired twice, effectively executing the function 'handleUnsavedData' twice!
Well, there is a work around for this. The solution is to disable the event handler. So the code would look like below.
function handleUnsavedData()
{
if(pageUpdated)
{
event.returnValue = 'You have unsaved data on the page. Are you sure you wan to navigate away from the page?';
window.onbeforeunload = null;
}
}
Now this makes sure that the event is not fired twice - only to introduce a new problem!
Imagine that you have chosen not to exit the page when you were warned. Now you are back in your page (without a post-back ofcourse).
If you try to navigate away from the page again, will it warn you? Of
course not, because you have nullified the event handler.
Luckily there is a work around for that too :-)
The
idea is to temporarily disable the event handler and then enable it
later(within few milliseconds). The modified code would look like below.
function handleUnsavedData()
{
if(pageUpdated)
{
event.returnValue = 'You have unsaved data on the page. Are you sure you wan to navigate away from the page?';
window.onbeforeunload = null;
setTimeout("enableBeforeUnloadHandler()", "100");
}
}
function enableBeforeUnloadHandler() { window.onbeforeunload = confirmExit; }
In this case, the event handler would be reinstated shortly after returning to the page. You may want to play with the '100 ms' a little bit to suit your requirements.
Happy coding,