我正在尝试使用这些example中的timeAgo函数。我把它放在一个文件中,我在我的视图中这样称呼它:
<script src="{{ asset('js/landing-page/jquery.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/landing-page/bootstrap.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/landing-page/material.min.js') }}"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.0/js/swiper.min.js"></script>
<script type="text/javascript" src="{{ asset('js/slider.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/timeago.js') }}"></script>
<!-- Include AlgoliaSearch JS Client and autocomplete.js library -->
<script src="https://cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js"></script>
<script src="https://cdn.jsdelivr.net/autocomplete.js/0/autocomplete.min.js"></script>
<script type="text/javascript" src="{{ asset('js/autocomplete.js') }}"></script>
<!-- Control Center for Material Kit: activating the ripples, parallax effects, scripts from the example pages etc -->
<script src="{{ asset('js/landing-page/material-kit.js') }}" type="text/javascript"></script>
Algolia自动填充模板的部分脚本如下所示:
{
source: autocomplete.sources.hits(videos, { hitsPerPage: 5 }),
displayKey: 'title',
templates: {
header: '<div class="aa-suggestions-category">Videos</div>',
suggestion: function(suggestion) {
return '<span>'
+ '<a href="/player/' + suggestion.id + '">'
+ '<div class="media">'
+ '<div class="media-left">'
+ '<img class="media-object" src="https://s3.eu-central-1.amazonaws.com/myUrl/' + suggestion.video_id + '_1.jpg">'
+ '</div>'
+ '<div class="media-body">'
+ '<p>' + suggestion._highlightResult.title.value + '<small><abbr class="timeago" title="' + suggestion.created_at + '">' + suggestion.created_at + '</abbr></small>' + '</p>'
+ '<small> ' + '</small>'
+ '</div>'
+ '</div>'
+ '</a>'
+'</span>';
}
但是时间戳仍然可见而且不久前。控制台中未显示任何错误。我做错了什么?
答案 0 :(得分:1)
自动完成功能在DOM准备好后很长时间内添加了html代码,因此在没有任何自动完成代码时会执行timeago.js
代码。
您必须在使用timeAgo
事件渲染新代码后立即再次调用autocomplete:updated
函数,而不是等待60或10秒。
//attach custom event handler - autocomplete:updated triggers when dataset is rendered
autocomplete('#search-input', { hint: false }, [
{
source: ...,
displayKey: ...,
templates: {
suggestion: function(suggestion) {
...
}
}
}
]).on('autocomplete:updated', function(event, suggestion, dataset) {
timeAgo('.timeago');
});
此解决方案可导致timeAgo
javascript超时的许多瞬间。在timeAgo之前使用全局timeAgoTimeout = setTimeout(timeAgo, 60000);
和clearTimeout(timeAgoTimeout)
修复此问题。
适用于您可以在小提琴中找到的动态元素的示例 - http://jsfiddle.net/mge45ugr/
答案 1 :(得分:0)
您需要在
上再次初始化timeagoapp_user_id
自动完成后,因为它是在页面加载后生成的。 Jquery&#34; onload&#34;函数不能处理ajax生成的html代码。
答案 2 :(得分:0)
在example中,请注意启动DOM的功能更改是在计时器上。它每60秒运行一次,这意味着所有timeago
元素每60秒刷新一次。
在您的情况下,您可能只在页面加载时调用timeago
一次。当Algolia运行时,它会生成新的DOM元素(根据您的模板),其中包含具有timeago
类的元素。但是当渲染这些新元素时,timeago驱动已经完成并且没有再次运行。
您基本上需要告诉timeago函数再次运行,以便它可以转换那些新的timeago
元素。您可以将该函数放在计时器上,例如您的示例,也可以在模板完成DOM渲染后触发该函数。在应用程序中呈现元素之后,我无法告诉您如何触发它,因为我看不到足够的代码。但是如果你想把它放在计时器上,它就是这样的:
// update time every 10 seconds
setTimeout(timeAgo, 10000);
这是我根据你的例子创建的一个改进的小提琴。
http://jsfiddle.net/mspinks/hkvjkbd0/2/
它模拟了你想要做的事情的基本思路。计时器设置为每10秒运行一次。在页面加载5秒后,我将一些文本注入DOM(使用class=timeago
)。当计时器在5秒后启动时,文本将被正确转换。
在您的情况下,您需要调整计时器设置,或者更好的解决方案是在元素渲染到DOM后触发timeago执行器执行。