自定义格式不适用
Custom format not applying
我开发了一个显示实时提要并使用 livestamp + moment 以类似于 Whosebug 对其消息所做的格式更新时间的小型应用程序。
现在我想稍微更改一下,以不同的格式显示过去 24 小时的内容。
I found this thread which was exactly what I was looking for
不幸的是它不适用于我的情况,我的元素示例如下:
<div id="container">
<div something else>
</div>
<div id="feed">
<div class="timestamp" title="Less than 1 minute ago">7 minutes ago</div>
</div>
</div>
当然上面是livestamp修改后的,因为我的feed是用jquery/ajax动态添加的。
因此,考虑到上述情况,我将代码更改如下:
$('.timestamp').on('change.livestamp', function(event, from, to)
{
event.preventDefault(); // Stop the text from changing automatically
// Get the original timestamp out of the event
var originalTS = event.timeStamp;
// Make a new moment object to compare the timestamp to
var newDate = moment();
// Use moment's .diff method to get the ms difference between timestamps
var delta = newDate.diff(originalTS);
// If the difference is less than a day's worth of ms
if (delta < 86400000){
// Use formatted text provided by the change event
console.log("if: " + newDate.format("dddd M/D/YYYY"));
$(this).html(to);
}
else {
// Format the moment object with whatever moment format you want
console.log("Else: " + newDate.format("dddd M/D/YYYY"));
$(this).html( newDate.format("dddd M/D/YYYY") );
}
}).livestamp();
并将它添加到我的 $(document).ready(function()
中,但是由于我的 .timestamp 是动态添加的(我相信),onchange 永远不会触发。
如果我改用 #container
,它会触发,我假设我必须遍历所有项目才能手动更新它,问题是,我不能,因为时间戳是在这种情况下仅针对 1 个项目(不是每个项目)显示,因此我无法知道要为其余部分更新哪个时间戳,因为 livestamp 在第一次迭代后将其删除。
有什么方法可以让它正确识别动态元素并对每个元素执行 onchange,就像在这种情况下建议的上述代码一样?还是我忽略了什么?
或者直接在 livestamp.js 上设置自定义格式?
类似于:
var newDate = moment();
var delta = newDate.diff(to);
if (delta >= 86400000)
{
to = to.format("dddd M/D/YYYY");
}
如您所见in line 59 of livestamp code, the library uses moment fromNow
格式化相对时间。
Moment 有一个 API 来自定义它显示相对时间的方式,如文档的 Relative time 部分所述。
在你的情况下,你可以使用类似下面的代码:
const CUSTOM_FORMAT = 'dddd M/D/YYYY';
moment.updateLocale('en', {
relativeTime : {
future: function (number, withoutSuffix, key, isFuture){
if( moment(number, CUSTOM_FORMAT, true).isValid() ){
return number;
}
return "in " + number;
},
past: function (number, withoutSuffix, key, isFuture){
if( moment(number, CUSTOM_FORMAT, true).isValid() ){
return number;
}
return number + " ago";
},
dd: function (number, withoutSuffix, key, isFuture){
var day = moment();
if(isFuture){
day.add(number, 'd');
} else {
day.subtract(number, 'd')
}
return day.format(CUSTOM_FORMAT);
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/livestamp/1.1.2/livestamp.min.js"></script>
<div id="container">
<div> something else
</div>
<div id="feed">
<div class="timestamp" data-livestamp="2017-02-26T00:29:22+01:00"></div>
<div class="timestamp" data-livestamp="2017-02-20T00:29:22+01:00"></div>
<div class="timestamp" data-livestamp="2017-02-28T05:26:22+01:00"></div>
</div>
</div>
它应该管理过去和未来的日期,但它可能需要一些更改才能正确处理大于 1 个月的差异。
我开发了一个显示实时提要并使用 livestamp + moment 以类似于 Whosebug 对其消息所做的格式更新时间的小型应用程序。
现在我想稍微更改一下,以不同的格式显示过去 24 小时的内容。
I found this thread which was exactly what I was looking for
不幸的是它不适用于我的情况,我的元素示例如下:
<div id="container">
<div something else>
</div>
<div id="feed">
<div class="timestamp" title="Less than 1 minute ago">7 minutes ago</div>
</div>
</div>
当然上面是livestamp修改后的,因为我的feed是用jquery/ajax动态添加的。
因此,考虑到上述情况,我将代码更改如下:
$('.timestamp').on('change.livestamp', function(event, from, to)
{
event.preventDefault(); // Stop the text from changing automatically
// Get the original timestamp out of the event
var originalTS = event.timeStamp;
// Make a new moment object to compare the timestamp to
var newDate = moment();
// Use moment's .diff method to get the ms difference between timestamps
var delta = newDate.diff(originalTS);
// If the difference is less than a day's worth of ms
if (delta < 86400000){
// Use formatted text provided by the change event
console.log("if: " + newDate.format("dddd M/D/YYYY"));
$(this).html(to);
}
else {
// Format the moment object with whatever moment format you want
console.log("Else: " + newDate.format("dddd M/D/YYYY"));
$(this).html( newDate.format("dddd M/D/YYYY") );
}
}).livestamp();
并将它添加到我的 $(document).ready(function()
中,但是由于我的 .timestamp 是动态添加的(我相信),onchange 永远不会触发。
如果我改用 #container
,它会触发,我假设我必须遍历所有项目才能手动更新它,问题是,我不能,因为时间戳是在这种情况下仅针对 1 个项目(不是每个项目)显示,因此我无法知道要为其余部分更新哪个时间戳,因为 livestamp 在第一次迭代后将其删除。
有什么方法可以让它正确识别动态元素并对每个元素执行 onchange,就像在这种情况下建议的上述代码一样?还是我忽略了什么?
或者直接在 livestamp.js 上设置自定义格式?
类似于:
var newDate = moment();
var delta = newDate.diff(to);
if (delta >= 86400000)
{
to = to.format("dddd M/D/YYYY");
}
如您所见in line 59 of livestamp code, the library uses moment fromNow
格式化相对时间。
Moment 有一个 API 来自定义它显示相对时间的方式,如文档的 Relative time 部分所述。
在你的情况下,你可以使用类似下面的代码:
const CUSTOM_FORMAT = 'dddd M/D/YYYY';
moment.updateLocale('en', {
relativeTime : {
future: function (number, withoutSuffix, key, isFuture){
if( moment(number, CUSTOM_FORMAT, true).isValid() ){
return number;
}
return "in " + number;
},
past: function (number, withoutSuffix, key, isFuture){
if( moment(number, CUSTOM_FORMAT, true).isValid() ){
return number;
}
return number + " ago";
},
dd: function (number, withoutSuffix, key, isFuture){
var day = moment();
if(isFuture){
day.add(number, 'd');
} else {
day.subtract(number, 'd')
}
return day.format(CUSTOM_FORMAT);
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/livestamp/1.1.2/livestamp.min.js"></script>
<div id="container">
<div> something else
</div>
<div id="feed">
<div class="timestamp" data-livestamp="2017-02-26T00:29:22+01:00"></div>
<div class="timestamp" data-livestamp="2017-02-20T00:29:22+01:00"></div>
<div class="timestamp" data-livestamp="2017-02-28T05:26:22+01:00"></div>
</div>
</div>
它应该管理过去和未来的日期,但它可能需要一些更改才能正确处理大于 1 个月的差异。