В вашем коде нет первого звонка на test()
.Так что либо вы забыли написать это в вопросе, либо у вас его нет в коде.Кто-то должен вызвать test()
в первый раз, прежде чем начнется этот вечный цикл с setTimeout
.
Я добавил фрагмент кода, который вы можете запустить, он содержит вставленный вами HTML, а также JavaScript,Единственная разница в том, что я позвонил test()
после вашего var now
, чтобы начать.
Пара вещей:
- Я переместил
setTimeout
из for loop
, так как его размещение там будет означать, что вы будете вызывать его с каждой итерацией, а не с каждойвторой.Кроме того, вы не можете иметь переменную now
в качестве глобального значения, ее нужно получать каждый раз, когда вы хотите вычислить разницу внутри функции.Если вы посмотрите на документы , вы увидите:
Создает экземпляр даты JavaScript, который представляет один момент времени.Объекты даты основаны на значении времени, которое является числом миллисекунд с 1 января 1970 года по Гринвичу.var date1 = новая дата ('17 декабря 1995 г. 03:24:00');// Солнце 17 декабря 1995 03:24:00 GMT ...
Это означает, что когда вы создаете дату, она представляет единственный момент времени , это как если быВы сделали снимок того времени и сохранили его в замороженном виде.
- Вторая проблема связана с тем, как вы отображаете информацию.Если у вас есть переменные, которые вы изменяете в этой области видимости цикла , после выхода из этой итерации значения исчезают навсегда.Если вы отображаете только эту информацию ( дни, минуты, часы, дни ) после вашего
for loop
, то в этих переменных будет сохранено последнее значение.Не совсем то, что вы ищете.Чтобы исправить это, все, что вам нужно сделать, это переместить x[i].innerHTML = days + " days " + hours + " hours " + minutes + " minutes " + seconds + " seconds";
в тот же цикл, в котором вы рассчитываете значения. - В качестве примечания, вы можете оформить
setInterval()
, так как это в значительной степени то, что вы хотите.
var exp = document.getElementById('tab').getElementsByClassName('exp1');
var x = document.getElementById('tab').getElementsByClassName('demo');
test();
function test() {
var now = new Date();
for (i = 0; i < exp.length; i++) {
var e = new Date(exp[i].innerHTML);
var timeDiff = e.getTime() - now.getTime();
var seconds = Math.floor(timeDiff / 1000);
var minutes = Math.floor(seconds / 60);
var hours = Math.floor(minutes / 60);
var days = Math.floor(hours / 24);
hours %= 24;
minutes %= 60;
seconds %= 60;
x[i].innerHTML = days + " days " + hours + " hours " + minutes + " minutes " + seconds + " seconds";
}
var timer = setTimeout("test()", 1000);
}
<html>
<body>
<table style="width:50%" id="tab">
<tr>
<th>Name</th>
<th>Exp</th>
<th>Count Down</th>
</tr>
<tr>
<td> A</td>
<td class='exp1'> 09/08/2019</td>
<td class='demo'> </td>
</tr>
<tr>
<td> B</td>
<td class='exp1'> 09/08/2020</td>
<td class='demo'> </td>
</tr>
</table>
</body>
</html>