Activating OnBeforeUnload ONLY when field values have changed Activating OnBeforeUnload ONLY when field values have changed javascript javascript

Activating OnBeforeUnload ONLY when field values have changed


I had a similar requirement so came up with following jQuery script:

$(document).ready(function() {    needToConfirm = false;     window.onbeforeunload = askConfirm;});function askConfirm() {    if (needToConfirm) {        // Put your custom message here         return "Your unsaved data will be lost.";     }}$("select,input,textarea").change(function() {    needToConfirm = true;});

The above code checks the needToConfirm variable, if its true then it will display warning message.Whenever input, select or textarea elements value is changed, needToConfirm variable is set to true.


PS: Firefox > 4 don't allow custom message for onbeforeunload.
Reference: https://bugzilla.mozilla.org/show_bug.cgi?id=588292


UPDATE: If you are a performance freak, you will love @KyleMit's suggestion. He wrote a jQuery extension only() which will be executed only once for any element.

$.fn.only = function (events, callback) {    //The handler is executed at most once for all elements for all event types.    var $this = $(this).on(events, myCallback);    function myCallback(e) {        $this.off(events, myCallback);        callback.call(this, e);    }    return this};    $(":input").only('change', function() {    needToConfirm = true;});


We just use Window.onbeforeunload as our "changed" flag. Here's what we're doing, (using lowpro):

Event.addBehavior({  "input[type=radio]:change,input[type=text]:change,input[type=checkbox]:change,select:change": function(ev) {       window.onbeforeunload = confirmLeave;  }  ".button.submit-button:click": function(ev) {       window.onbeforeunload = null;  },});function confirmLeave(){    return "Changes to this form have not been saved. If you leave, your changes will be lost."  }


The following works well in jQuery:

var needToConfirm = false;$("input,textarea").on("input", function() {  needToConfirm = true;});$("select").change(function() {  needToConfirm = true;});window.onbeforeunload = function(){          if(needToConfirm) {    return "If you exit this page, your unsaved changes will be lost.";          }}   

And if the user is submitting a form to save the changes, you might want to add this (change #mainForm to the ID of the form they're submitting):

$("#mainForm").submit(function() {  needToConfirm = false;});