使用javascript定期更新发布评论的时间
我想定期更新在我的网站上发表的评论的时间。我感兴趣的格式,就像Facebook和其他网站所做的那样,帖子的时间是相对于当前时间列出的。例如,文章在第一次提交时应该说“刚刚……”,但在1分钟后应该说“1分钟前”,然后是“2分钟前”,依此类推 我发现这是一个很好的脚本: 我已经走了一半了 到目前为止,我的代码存在两个问题:使用javascript定期更新发布评论的时间,javascript,jquery,formatting,setinterval,Javascript,Jquery,Formatting,Setinterval,我想定期更新在我的网站上发表的评论的时间。我感兴趣的格式,就像Facebook和其他网站所做的那样,帖子的时间是相对于当前时间列出的。例如,文章在第一次提交时应该说“刚刚……”,但在1分钟后应该说“1分钟前”,然后是“2分钟前”,依此类推 我发现这是一个很好的脚本: 我已经走了一半了 到目前为止,我的代码存在两个问题: 报道的时间被搞砸了 即使setinterval()工作正常,时间也不会每秒更新一次 下面是一段代码,我将其全部放在JSFIDLE中:。我认为问题在于var-time $(docu
setinterval()
工作正常,时间也不会每秒更新一次var-time
$(document.body).on('click', 'button', function(){
var id= $(this).data('id'),
comment=$('textarea[data-id="'+id+'"]').val(),
start_timer = setInterval(function() {
var time = new Date();
time = time_since(time);
$('div[data-id="'+id+'"]').html(time);
},
1000);
$('#'+id).html(comment);
});
我已经测试过了,而且:
$(document.body).on('click','button',function()){
var id=$(this).data('id'),
comment=$('textarea[data id=“”+id+“]”)val();
变量时间=新日期();
启动计时器=设置间隔(函数(){
//变量时间=新日期();
var time2=自(time.getTime()/1000)起的时间;
$('div[data id=“”+id+“]”)html(time2);
},
1000);
$('#'+id).html(注释);
});
/**
*日期后缀()
*返回一个月中给定日期的日期后缀(st、nd、rd、th)
*
*@作者:安迪·托马斯(forrst@antom.co.uk)
*@日期:27/09/2010
*/
函数日期\后缀(日期){
如果(日期=1 | |日期=21 | |日期=31){
返回“st”;
}否则如果(日期==2 | |日期==22){
返回“nd”;
}否则,如果(日期==3 | |日期==23){
返回“rd”;
}否则{
返回“th”;
}
}
/**
*自()以来的时间
*返回自给定unix_时间戳以来经过的时间。
*10秒前、1小时前、9月10日等
*
*@作者:安迪·托马斯(forrst@antom.co.uk)
*@日期:27/09/2010
*/
功能时间\u自(原始){
原件=新日期(原件*1000);
var-str='';
风险值月份=[
“一月”,
二月,,
“三月”,
“四月”,
“五月”,
"六月",,
七月,,
"八月",,
"九月",,
“十月”,
十一月,,
“十二月”
];
变量块=[
[31536000000,‘年’,
[2592000000,‘月’],
[604800000,‘一周’,
[86400000,‘天’],
[3600000,‘小时’],
[60000,‘分钟’],
[1000,'秒'],
];
var today=新日期();
var-since=新日期(今天.getTime()-original.getTime());
如果(自.getTime()以来>604800000){
str=months[original.getMonth()]+''+original.getDate()+日期后缀(original.getDate());
如果(自.getTime()以来>31536000000){
str=str+','+original.getFullYear();
}
返回str;
}
var-ms=0;
var name=0;
var i=0;
var ic=chunks.length;
var计数=0;
对于(i=0;这很有帮助,现在它永久性地表示“0秒前”。但是您能解释一下为什么$('div[data id=“'+id+'']”)html(time);
不是每秒钟更新一次吗?你好,Marian,谢谢你,但问题是它没有更新
。对此有什么解决办法吗?最简单的方法是检查/更新JSFIDLE:谢谢你的回答,看起来关键是要在设置间隔()之外定义新日期
)
功能。我认为每10秒或15秒更新一次更好,因为每秒检查时间是没有用的,用户不关心“1分钟前”是否真的是1分钟(如果每10秒检查一次时间,则是“1分钟到1分钟加10秒前”)。我不知道,它也对我有用。@boudou抱歉,我说错了。忘了我说的话。让我们回到开头。它很有效。谢谢你关于减少更新频率的建议。是的,在我的实际应用程序中,我会这样做。我写了一条评论,点击了一次按钮,它每秒钟都会更新,所以我不明白发生了什么错。
$(document.body).on('click', 'button', function(){
var id= $(this).data('id'),
comment=$('textarea[data-id="'+id+'"]').val();
var time = new Date();
start_timer = setInterval(function() {
//var time = new Date();
var time2 = time_since(time.getTime()/1000);
$('div[data-id="'+id+'"]').html(time2);
},
1000);
$('#'+id).html(comment);
});
/**
* date_suffix()
* returns the date suffix (st,nd,rd,th) for a given day in a month
*
* @author: Andy Thomas (forrst@antom.co.uk)
* @date: 27/09/2010
*/
function date_suffix(date) {
if (date == 1 || date == 21 || date == 31) {
return 'st';
} else if (date == 2 || date == 22) {
return 'nd';
} else if (date == 3 || date == 23) {
return 'rd';
} else {
return 'th';
}
}
/**
* time_since()
* returns the time passed since a given unix_timestamp.
* eg. 10 seconds ago, 1 hour ago, 10th Sep etc
*
* @author: Andy Thomas (forrst@antom.co.uk)
* @date: 27/09/2010
*/
function time_since(original) {
original = new Date(original * 1000);
var str = '';
var months = [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
];
var chunks = [
[31536000000, 'year'],
[2592000000, 'month'],
[604800000, 'week'],
[86400000, 'day'],
[3600000, 'hour'],
[60000, 'minute'],
[1000, 'second'],
];
var today = new Date();
var since = new Date(today.getTime() - original.getTime());
if (since.getTime() > 604800000) {
str = months[original.getMonth()] + ' ' + original.getDate() + date_suffix(original.getDate());
if (since.getTime() > 31536000000) {
str = str + ', ' + original.getFullYear();
}
return str;
}
var ms = 0;
var name = 0;
var i = 0;
var ic = chunks.length;
var count = 0;
for (i=0;i<ic;i++) {
ms = chunks[i][0];
name = chunks[i][1];
count = Math.floor(since.getTime() / ms);
if (count != 0) {
break;
}
}
return count + ' ' + name + ((count == 1) ? '' : 's') + ' ago';
}