1

我有一个问题,由于我对 js 不是很熟练,我会很感激任何建议。

基本上,我在文章页面上每 x 秒执行一次 ajax 调用,它连接到数据库并检查评论编号。

现在,在每次通话后,我需要检查最后一次通话返回的号码是否大于上一次通话(检查号码评论是否增加)。

我无法弄清楚如何正确存储单个呼叫的数据,这些数据在与下一个呼叫比较后将被删除,当然会被新数据覆盖。

现在,我可以使用并且知道如何使用两种方法:cookie 和将数据存储在不可见元素内部的 dom 中,但这是最佳解决方案吗?

4

5 回答 5

6

您不需要使用 cookie 或 dom 来存储这些数据。只需使用闭包*!

var old = null;

$.get(url, function(d){
   if(old == null){
     old = d;
   }
   if(old.something > d.something){
      //do something else
   }
});

闭包是它起作用的原因,如果 javascript 没有它们,你将无法修改函数old中的外部 var $.get

于 2013-02-04T15:54:26.220 回答
2

使用超出评论获取/呈现函数范围的变量:

var CommentsModule = (function(){
    var me = {},
        numComments = null;

    function renderComments(comments){
        //render logic here
        for(i=numComments || 0; i<comments.length;i++){ //the || 0 handles the initial load when the numComments === null
            //append new comments
        }
        //reset your 'cached' variable to the current # of comments
        numComments = comments.length;
    }

    me.getComments = function() {
        //do $.get or $.ajax
        $.ajax("myURL",
            success: function(msg) { 
                if(msg.length > numComments) {
                    renderComments(msg);
                }
            }
        });
    }

    return me;
}());

在您的页面中:

setInterval(CommentsModule.getComments, 5000);
//....or something
于 2013-02-04T15:59:14.503 回答
1

本地存储:

localStorage.setItem('lastUpdate','2013-02-04');

var lastUpdate = localStorage.getItem('lastUpdate');

或使用您评论的数据属性,例如:

$('#comments').data('lastUpdate', '2013-02-04');
于 2013-02-04T16:01:46.023 回答
0

您提到的两种方法是正确的 - 我通常将数据存储在 DOM 中的一个不可见元素中。

您可能想要研究的另外三个:

1) 现代浏览器现在有 HTML5 本地存储,它在功能上等同于 cookie,除了它存储在浏览器存储中。这在 IE9 中不存在,并且仍在现代浏览器中开发,所以不要使用它,除非您知道用户的浏览器有这个(IE9 还不支持它)。http://www.w3schools.com/html/html5_webstorage.asp

2) 如果您使用 jQuery,则有 jQuery 数据:http ://api.jquery.com/jQuery.data/ ,它允许您将数据附加到特定元素。该链接比我在这里解释得更好。

3)根据您的javascript设置方式,您可以简单地将先前评论的数量存储在javascript中的变量中吗?然后,当您的 AJAX 调用返回时,您可以将结果变量与之前的计数变量进行比较。如果可能的话,我会选择这个解决方案。

于 2013-02-04T15:57:05.183 回答
0

您可以使用此代码。它需要 JQuery 的 cookie 插件。它不用于临时存储。

    function GetData(key)
    {
        var sonuc = "";
        if (typeof (localStorage)!="undefined")
        {
            //İkinci html5 localStorage desteği varmı ona bakılır
            if (localStorage[key] != null)
            {
                sonuc= localStorage[key];
            }
        }
        else
        {
            //son olarak cookie desteği varmı ona bakılır
            sonuc=$.cookie(key);
        }
        return sonuc;
    }

    function SetData(key,value)
    {
        if (typeof (localStorage) != "undefined")
        {
            //ikinci önce html5 localStorage desteği varmı ona bakılır
            try
            {
                localStorage.setItem(key, value);
                return true;
            } catch (e)
            {
                return false;
            }

        }
        else
        {
            //son olarak cookie desteği varmı ona bakılır
            try
            {
                $.cookie(key, value);
                return true;
            } catch (e)
            {
                return false;
            }
        }
    }

    /*this plugin is to add cookie function to jquery*/
    /*Copyright (c) 2006 Klaus Hartl (stilbuero.de)*/
    jQuery.cookie = function (name, value, options) {
        if (typeof value != 'undefined') { // name and value given, set cookie
            options = options || {};
            if (value === null) {
                value = '';
                options.expires = -1;
            }
            var expires = '';
            if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
                var date;
                if (typeof options.expires == 'number') {
                    date = new Date();
                    date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
                } else {
                    date = options.expires;
                }
                expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
            }
            var path = options.path ? '; path=' + (options.path) : '';
            var domain = options.domain ? '; domain=' + (options.domain) : '';
            var secure = options.secure ? '; secure' : '';
            document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
        } else { // only name given, get cookie
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
    };
    /*end of jquery plugin*/
于 2014-05-23T00:35:10.087 回答