我有一个问题,由于我对 js 不是很熟练,我会很感激任何建议。
基本上,我在文章页面上每 x 秒执行一次 ajax 调用,它连接到数据库并检查评论编号。
现在,在每次通话后,我需要检查最后一次通话返回的号码是否大于上一次通话(检查号码评论是否增加)。
我无法弄清楚如何正确存储单个呼叫的数据,这些数据在与下一个呼叫比较后将被删除,当然会被新数据覆盖。
现在,我可以使用并且知道如何使用两种方法:cookie 和将数据存储在不可见元素内部的 dom 中,但这是最佳解决方案吗?
您不需要使用 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
。
使用超出评论获取/呈现函数范围的变量:
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
本地存储:
localStorage.setItem('lastUpdate','2013-02-04');
var lastUpdate = localStorage.getItem('lastUpdate');
或使用您评论的数据属性,例如:
$('#comments').data('lastUpdate', '2013-02-04');
您提到的两种方法是正确的 - 我通常将数据存储在 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 调用返回时,您可以将结果变量与之前的计数变量进行比较。如果可能的话,我会选择这个解决方案。
您可以使用此代码。它需要 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*/