Во-первых, у вас есть аргументы setInterval
.
$(function() {
var i = 0;
setInterval(function() {
i++;
$('#timer').val(i);
}, 1000);
});
Во-вторых, вы полагаетесь на setInterval
, чтобы обеспечить надежное подсчет. Вы должны использовать монотонные часы; performance.now()
обеспечивает это в современных браузерах. Решения на основе Date.now()
или new Date()
могут вызывать нежелательное поведение при настройке системных часов.
$(function() {
var start = performance.now();
setInterval(function() {
var elapsed = (performance.now() - start)/1000; $('#timer').val(Math.floor(elapsed));
}, 1000);
});
В-третьих, type
для текстового поля <input>
s является text
, не textbox
.
<input type="text" id="timer" />
В-четвертых, вы используете редактируемое текстовое поле для отображения изменяющегося значения, не используя его в качестве какой-либо вход. Это не относится к пользователю; попробуйте <span>
вместо этого, при необходимости подойдет к стилю. Вы можете приостановить подсчет, если номер должен когда-либо быть выбран.
$(function() {
var start = performance.now();
setInterval(function() {
var elapsed = (performance.now() - start)/1000;
$('#timer').text(Math.floor(elapsed));
}, 1000);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<span id="timer"></span>
В-пятых, вы используете устаревшую версию JQuery. Поскольку вы используете performance.now()
, jQuery 2.1.x будет правильным, но в-шестых, никакой jQuery вообще не будет лучше.
document.addEventListener('DOMContentLoaded', function() {
var start = performance.now();
setInterval(function() {
var elapsed = (performance.now() - start)/1000;
document.getElementById('timer').textContent = Math.floor(elapsed);
}, 1000);
});
Теперь вы можете удалить элемент, содержащий jQuery. Теперь это показывает неэффективность, которая была менее очевидна при использовании jQuery; вы запрашиваете элемент таймера каждую секунду. Итак, седьмой: отслеживайте это в другом месте.
document.addEventListener('DOMContentLoaded', function() {
var timer = document.getElementById('timer');
var start = performance.now();
setInterval(function() {
var elapsed = (performance.now() - start)/1000;
timer.textContent = Math.floor(elapsed);
}, 1000);
});
восьмых, переместить <script>
блок под нагревательным элементом и вам не придется тратить время на ожидание DOMContentLoaded
или набрав его слушателя событий. Не забудьте также находиться в строгом режиме.
(function() {
'use strict';
var timer = document.getElementById('timer');
var start = performance.now();
setInterval(function() {
var elapsed = (performance.now() - start)/1000;
timer.textContent = Math.floor(elapsed);
}, 1000);
})();
<span id="timer"></span>
<script src="timer.js" async></script>
Теперь это порядочный.
Мне не нужен текстовое поле, чтобы иметь точное представление количества прошедших секунд, просто увеличивая счет (реальный код делает что-то немного другое, я просто хотел опубликовать минимальный тестовый файл). Это очень интересно! –