正在检查用户是否在 JQuery 中有未保存的数据?

Checking if user has unsaved data in JQuery?

我有以下代码...

    var leave_page_confirm=false;

    if ($(':input.common_class').val().length !== 0) {

        var leave_page_confirm=true;

    }

    window.onbeforeunload = save_data_check;

      function save_data_check()
      {

        if (leave_page_confirm) {
          return "You have unsaved information on the page.";

        }

      }

我正在尝试查看页面上的任何输入是否有价值。如果他们不这样做,那么您可以在不留言的情况下离开页面。如果他们这样做,则会有一条消息询问您是否要离开该页面。我页面上的所有输入都有一个共同的 class。

一种粗略的方式

var leave_page_confirm=false;
$('input').each(
    function(){
        if($(this).val()){
        leave_page_confirm = true;
        }
    });

因为您正在使用 jQuery 已经使用了每个。

var leave_page_confirm = true;

$('.common_class').each(function(){
    if($(this).val().length == 0)
        leave_page_confirm = false
});

如果其中任何一个为假,还要检查是否为假,它将始终 return 为假,而不用担心检查每个并设置真或假。 1 空总是 false。

试试这个

var changesSaved =true;
    function hasPendingChanges()
    {
    changesSaved=$(':input.common_class').val().length == 0;
    }
    window.onbeforeunload = save_data_check;
    function save_data_check()
          {

            if (!changesSaved) {
              return "You have unsaved information on the page.";

            }
}

关于我遵循的逻辑的一些信息:
这段代码不保存任何东西,如果你只需要用JS存储一些信息,那么在客户端计算机上,这将取决于缓存,你可以使用cookie(信息是临时的,因为依赖于可以删除的cookie ,所以也许您可以存储未保存的值以等待用户提交它们)。
第一个片段基于这样的想法,即一旦您保存了信息,输入将不会被清除(它们将保留信息),这意味着 js 检查用户是否对它们进行了任何更改(可以更聪明,也许检查是否value 确实与开始的不同)并将 var 设置为 true/false,一旦用户离开页面,就会检查 var。

第二个脚本基于输入是表单或类似内容的一部分的想法,因此一旦提交,输入将被清除。 如果用户离开页面,代码会检查是否有任何非空(已保存)值。

总结一下:

  • 第一个检查是否对输入
  • 进行了任何更改
  • 第二个检查输入是否包含一个值


我不明白未保存的数据:未保存的数据还是空值?我的意思是如果用户保存一个非空值然后清除输入?

这就是我的想法:基本上每次输入更改时,它都会将 saved var 设置为 false,一旦你点击按钮保存(或所有其他逻辑),它会将值设置为 true ,否则一旦您卸载页面,脚本就会检查 var 以查看它是 true 还是 false
HTML:

<input type='input' class='test' />
<input type='input' class='test' />
<input type='input' class='test' />
<input type='input' class='test' />
<input type='input' class='test' />
<input type='input' class='test' />
<button class='save'>Save</button>  

JQUERY

var saved= true;

window.onbeforeunload = function () {
    if (!saved) {
        return 'Would you like to save?';
    }
};

$('.test').on('input', function(){
    saved=false;
 });

$('.save').click(function(){
    saved=true;
});

如果您只需要检查输入值:

window.onbeforeunload = function () {
    var saved= true;
    $('.test').val(function(e,v){
            //This check if the value is not empty
            //if you want any kind of value use if(v)
            if(v.trim()!=""){
                saved=false;
                return;
            }
        });
    if(!saved)
        return 'Would you like to save?';
};

即使使用纯 js 也可以实现:

window.onbeforeunload = function () {
    var saved= true,
        items= document.getElementsByClassName('test'),
        count= items.length;

    for(i=0;i<count;i++){
        if(items[i].value!=""){ //if(items[i].value)
                saved=false;
                break;
            }
        };
    if(!saved)
        return 'Would you like to save?';
};

编辑 Cookie 部分 - 已修复 - 有效

$(document).ready(function() {
            var cookieVal = getCookie('formValue');
            if(cookieVal){
                var list=$.parseJSON(cookieVal);
                $('.test').each(function(){
                    if($(this).attr('name') in list)
                        $(this).val(list[$(this).attr('name')]);
                });
                document.cookie = 'formValue=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
            }
        });

        window.onbeforeunload = function () {
            var saved= true;
            $('.test').each(function(){
                    if($(this).val().trim()!=""){
                        saved=false;
                        return;
                    }
                });
            if(!saved){
                var itemObj= new Object,
                    d = new Date();
                d.setTime(d.getTime() + (30*24*60*60*1000));

                var expires = "expires="+d.toUTCString();
                $('.test').val(function(e,v){
                    if($(this).attr('name'))
                        itemObj[$(this).attr('name')]=v;
                });
                itemObj=JSON.stringify(itemObj);
                document.cookie = 'formValue=' + itemObj + "; " + expires;

                return 'Would you like to save?';
            }
        };

        function getCookie(cname) {
            var name = cname + "=";
            var ca = document.cookie.split(';');
            for(var i=0; i<ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1);
                if (!Array.prototype.indexOf) {
                    Array.prototype.indexOf = function(obj, start) {
                        for (var i = (start || 0), j = this.length; i < j; i++) {
                            if (this[i] === obj) { return i; }
                        }
                        return -1;
                    }
                }
                if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
            }
            return "";
        }

我通常使用更改事件来跟踪任何输入的更改,

var leave_page_confirm = false;
    $(function() {
        $(':input.common_class').change(function(){             
            leave_page_confirm = true;
            if(!leave_page_confirm)
            window.onbeforeunload = save_data_check;
        });
    });

    function save_data_check(){        
          return "You have unsaved information on the page.";
    }