Livestamp.js 通过 jQuery 手动触发
Livestamp.js trigger manually via jQuery
我正在使用一个名为 Livestamp.js (http://mattbradley.github.io/livestampjs/) 的自动 timeago 插件。好像是配合moment.js自动转换这个:
<span data-livestamp="1488615741"></span>
对此:
<span>8 minutes ago</span>
在每个时间间隔。
但我不喜欢这样,因为在 <span>
最终自动转换之前的几毫秒内就会观察到故障。因此,我想通过 jQuery 手动完成,所以如果我完成 .append()
,我希望立即转换 <span>
。
我试过这样做
$('div').append(data).promise().done(function() {
$(this).find('span[data-livestamp]').livestamp($(this).data('livestamp'));
});
但它不起作用。 <span>
确实是立即转换,但是"a few seconds ago",而实际上是6天前。
如何实现?
更新 更改了代码,使其更易于理解。
在$(this).data('livestamp')
中,$(this)
引用了错误的对象。相反,使用 .each
遍历生命戳。在 .each(function () {...})
中,this
将引用 Livestamp 跨度:
$('div').append(data).promise().done(function() {
$(this).find('span[data-livestamp]').each(function () {
$(this).livestamp($(this).data('livestamp'));
});
});
上一个答案(不相关,如评论所示):
如果您有延迟,jQuery 在应用代码之前也会有类似的延迟。
所有客户端 JavaScript 都是这样工作的:JavaScript 嵌入到页面中,因此,浏览器首先加载页面,然后加载,然后 运行 JavaScript 在那个页面上。在 JavaScript 成为 运行 之前,您会注意到事物的旧状态。
相反,为避免延迟,请通过您的服务器端语言提供默认值,以便提供此 HTML:
<span data-livestamp="1488615741">8 minutes ago</span>
当然,你不能只写'8分钟前',你需要使用像PHP这样的服务器端语言来生成一个预定义的值。例如,如果您的页面是在 PHP 中生成的,您的变量名为 $time
,而您使用的是 php-time-ago,则可以这样写:
<?php $timeAgo = new Westsworld\TimeAgo(); ?>
<span data-livestamp="<?= $time; ?>"><?= $timeAgo->inWords('@' . $time); ?></span>
这样,PHP 生成的文本将在 Livestamp 开始工作之前显示,JavaScript 代码将负责保持时间参考最新。
当然,您可能会使用不同的服务器端语言、不同的变量名和不同的库,这只是一个示例。
我正在使用一个名为 Livestamp.js (http://mattbradley.github.io/livestampjs/) 的自动 timeago 插件。好像是配合moment.js自动转换这个:
<span data-livestamp="1488615741"></span>
对此:
<span>8 minutes ago</span>
在每个时间间隔。
但我不喜欢这样,因为在 <span>
最终自动转换之前的几毫秒内就会观察到故障。因此,我想通过 jQuery 手动完成,所以如果我完成 .append()
,我希望立即转换 <span>
。
我试过这样做
$('div').append(data).promise().done(function() {
$(this).find('span[data-livestamp]').livestamp($(this).data('livestamp'));
});
但它不起作用。 <span>
确实是立即转换,但是"a few seconds ago",而实际上是6天前。
如何实现?
更新 更改了代码,使其更易于理解。
在$(this).data('livestamp')
中,$(this)
引用了错误的对象。相反,使用 .each
遍历生命戳。在 .each(function () {...})
中,this
将引用 Livestamp 跨度:
$('div').append(data).promise().done(function() {
$(this).find('span[data-livestamp]').each(function () {
$(this).livestamp($(this).data('livestamp'));
});
});
上一个答案(不相关,如评论所示):
如果您有延迟,jQuery 在应用代码之前也会有类似的延迟。
所有客户端 JavaScript 都是这样工作的:JavaScript 嵌入到页面中,因此,浏览器首先加载页面,然后加载,然后 运行 JavaScript 在那个页面上。在 JavaScript 成为 运行 之前,您会注意到事物的旧状态。
相反,为避免延迟,请通过您的服务器端语言提供默认值,以便提供此 HTML:
<span data-livestamp="1488615741">8 minutes ago</span>
当然,你不能只写'8分钟前',你需要使用像PHP这样的服务器端语言来生成一个预定义的值。例如,如果您的页面是在 PHP 中生成的,您的变量名为 $time
,而您使用的是 php-time-ago,则可以这样写:
<?php $timeAgo = new Westsworld\TimeAgo(); ?>
<span data-livestamp="<?= $time; ?>"><?= $timeAgo->inWords('@' . $time); ?></span>
这样,PHP 生成的文本将在 Livestamp 开始工作之前显示,JavaScript 代码将负责保持时间参考最新。
当然,您可能会使用不同的服务器端语言、不同的变量名和不同的库,这只是一个示例。