我有一个问题因为我对js不是很熟练,所以我很感激你的建议。
基本上,我在文章页面上每隔x秒执行一次ajax调用,连接到数据库并检查注释编号。
现在,在每次通话之后,我需要检查最后一次通话是否返回大于前一次通话的号码(以检查号码评论是否增加)。
我无法确定如何正确存储与下一次调用比较后将被删除的单个调用的数据,当然还会被新数据覆盖。
现在,有两种方法我可以使用并知道如何:cookie和将数据存储在不可见元素内的dom中,但这是最佳解决方案吗?
答案 0 :(得分: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
函数中的外部$.get
var。
答案 1 :(得分: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
答案 2 :(得分:1)
localStorage的:
localStorage.setItem('lastUpdate','2013-02-04');
var lastUpdate = localStorage.getItem('lastUpdate');
或使用评论的数据属性,例如:
$('#comments').data('lastUpdate', '2013-02-04');
答案 3 :(得分: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调用返回时,您可以比较结果变量与先前的计数变量。如果可能的话,我会选择这个解决方案。
答案 4 :(得分:0)
您可以使用此代码。它需要JQuery for 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*/