Activating OnBeforeUnload ONLY when field values have changed

后端 未结 7 1962
暗喜
暗喜 2020-12-31 01:27

What I\'m trying to achieve is to Warn the user of unsaved changes if he/she tries to close a page or navigate away from it without saving first.

I\'ve managed to g

相关标签:
7条回答
  • 2020-12-31 02:11
    $(window).bind('beforeunload',function() {
     return "'Are you sure you want to leave the page. All data will be lost!";
    });
    
    $('#a_exit').live('click',function() {
        $(window).unbind('beforeunload');
    });
    

    Above works For me.

    0 讨论(0)
  • 2020-12-31 02:17

    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;
    });
    
    0 讨论(0)
  • 2020-12-31 02:21

    Try your logic in a different manner. Meaning, put the logic for checking the value of the input field in your onbeforeunload method.

    window.onbeforeunload = function () { 
        if ($("#is_modified").val() == 'true') { 
            return "You have unsaved changes."; 
        } else { 
            return true; // I think true is the proper value here 
        } 
    };
    
    0 讨论(0)
  • 2020-12-31 02:22

    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."  
    }
    
    0 讨论(0)
  • 2020-12-31 02:22

    in IE9 you can use simple return statement (re) which will not display any dialogue box. happy coding..

    0 讨论(0)
  • 2020-12-31 02:23

    why not have the onbeforeunload call a function that checks if the values have changed, and if so return the "unsaved changes" confirm?

    0 讨论(0)
提交回复
热议问题