2 回答
TA贡献1851条经验 获得超3个赞
您有一些嵌套问题(脚本标记需要退出for循环),重复的id和不正确的计时系统。如果您需要将事情更新为实时,请使用时间戳记和系统时钟来确定实际剩余时间。
首先,向您的实体添加方法以获取到期时间戳(以秒为单位)
class Voiture
{
...
public function getExpiresAt()
{
$gareele = $this->getGareele();
$expires = clone $gareele;
$expires->modify('+' . $this->getTime() . ' min');
return $expires->format('U');
}
}
然后在模板中,将计时器范围更改为具有class="timer"(不需要id),并添加带有过期时间戳记的data属性。该脚本将遍历所有.timers并更新文本以反映该时间点的剩余天数,小时数,分钟数和秒数。在这里,我通过使用setTimeout()函数内部每100毫秒更新一次文本。
{% extends 'Agent/Baseagent.html.twig' %}
{% block title %}Parking index{% endblock %}
{% block body %}
{% for parking in user.parkings %}
<h2>Parking</h2>
{{ parking.libelle }}
<h2>voitures</h2>
<table id="file_export" class="table table-striped table-bordered">
<thead></thead>
<tbody>
{% if parking.voitures|length > 0 %}
{% for voitures in parking.voitures %}
<tr>
<td>
{{ voitures.matricule }}
</td>
<td class="center">
<span class="timer" data-expires="{{ voitures.getExpiresAt() }}"></span>
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="6">no records found</td>
</tr>
{% endif %}
</tbody>
</table>
{% endfor %}
<script>
var timers = document.querySelectorAll('.timer')
function updateTimers () {
var rightNow = Math.floor(Date.now()/1000) // in seconds
timers.forEach(function (timer) {
var expires = parseInt(timer.dataset.expires) // in seconds
if (rightNow > expires) {
// Time expired
timer.innerText = 'Expired'
} else {
var seconds = expires - rightNow
var minutes = Math.floor(seconds/60)
var hours = Math.floor(minutes/60)
var days = Math.floor(hours/24)
seconds = ('0' + String(seconds%60)).slice(-2)
minutes = ('0' + String(minutes%60)).slice(-2)
hours = ('0' + String(hours%24)).slice(-2)
timer.innerText = days + 'd ' + hours + 'h ' + minutes + 'm ' + seconds + 's'
}
})
setTimeout(function () {
updateTimers()
}, 100)
}
updateTimers()
</script>
{% endblock %}
笔记
如果要通过ajax添加更多计时器(在页面加载后),则应放置以下行:
var timers = document.querySelectorAll('.timer')
在功能块内部,可以在每次调用时搜索新的计时器。
TA贡献1827条经验 获得超9个赞
有重复的ID(“ test”,“ demo”),每个文件一个。
id全局属性定义一个唯一标识符(ID),该标识符在整个文档中必须是唯一的。其目的是在链接(使用片段标识符),脚本或样式(使用CSS)时标识元素。
这document.getElementById("demo")
将返回一个结果,可能是DOM中的第一个结果。(我怀疑这也是对的,var test = $('#test').data("isTest");
但我不太熟练使用jQuery)。
也许您可以通过“名称”属性进行选择,然后将代码更改为具有一个<script>
可迭代所需节点的元素。
- 2 回答
- 0 关注
- 182 浏览
添加回答
举报