我创建了以下代码来每分钟更新所有跨度的文本内容。页面上有许多这些跨度都需要每分钟更新一次:
<span data-unix="1372263005" class="time_ago">4 minutes ago</span>
代码如下:
window.setInterval(function(){
$(".time_ago").each(function(i, elem) {
var unix = $(elem).attr("data-unix")
var now = new Date().getTime();
now = parseInt(now) / 1000;
var amount = 0;
var difference = 0;
difference = parseInt(now) - parseInt(unix);
if (difference < 60)
{
$(elem).html('a few seconds ago');
}
else if (difference < 120)
{
$(elem).html('a minute ago');
}
else if (difference < 3600)
{
amount = Math.floor(difference / 60);
$(elem).html(amount + ' minutes ago');
}
else if (difference < 7200)
{
$(elem).html('an hour ago');
}
else if (difference < 86400)
{
amount = Math.floor(difference / 3600);
$(elem).html(amount + ' hours ago');
}
else if (difference < 172800)
{
$(elem).html('a day ago');
}
else if (difference < 2635200)
{
amount = Math.floor(difference / 86400);
$(elem).html(amount + ' days ago');
}
else if (difference < 5270400)
{
$(elem).html('a month ago');
}
else if (difference < 31622400)
{
amount = Math.floor(difference / 2635200);
$(elem).html(amount + ' months ago');
}
else if (difference < 63244800)
{
$(elem).html('a year ago');
}
else
{
amount = Math.floor(difference / 31622400);
$(elem).html(amount + ' years ago');
}
});
return false;
}, 60);
EDIT1)好的,现在我已经对你的建议做了一些修改,但它正在将范围文本改为43351年。任何想法为什么这样做?
EDIT2)好的,现在我有/ 1000,所以php unix时间与js getTime()匹配。唯一的问题是现在它将它应用于所有值。 ie)对于.time_ago的所有实例,我得到31分钟 - 我如何让它一次只应用于一个,所以每个实例得到不同的时间?
EDIT3)添加了正确的代码,以防有人发现它有用..
答案 0 :(得分:2)
您遇到此错误,因为 floor()不是JS中的函数。
每次使用
floor()
使用
Math.floor()
代替。
答案 1 :(得分:2)
floor()
是Math
对象上的一个函数,因此要调用它,您需要使用Math.floor()
。
您可以考虑在每个if / else块中设置一条消息,并在函数末尾设置一次。这样,如果您需要更改任何类或属性,您只需要在一个地方进行。
其他一些注意事项:使用html()代替text()设置HTML内容;你应该在使用parseInt()时使用基数,否则任何带前导0的东西都会被解析为八进制数,而不是十进制数。
您需要使用以unix
开头的HTML5约定设置data-
属性,然后您可以使用jQuery的data()
或attr()
函数来检索值。如果使用data()
函数,jQuery会将值转换为整数。
window.setInterval(function(){
var unix = $(".time_ago").data('unix');
var now = new Date().getTime();
var amount = 0;
var difference = now - unix;
var message = "";
if (difference < 60)
{
message = 'a few seconds ago';
}
else if (difference < 120) {
message = 'a minute ago';
}
...
//just do this once
$(".time_ago").html('<span data-unix="' + unix + '" class="time_ago">' + message + '</span>');
return false;
}, 60);