Вы не описываете реальную проблему, поэтому я не совсем уверен, что ответить, но вот несколько потенциально полезных замечаний.
Функция timedCount является квазисинхронно-рекурсивной. Это здорово, если вы используете стиль передачи продолжения , но это не обязательно, возможно, немного более запутанно, чем нужно для JavaScript, и будет тратить некоторые ресурсы (фреймы стека) на языки, которые не У него нет хвостовой рекурсивной очистки стека (не знаю, есть ли у JS это или нет).
Поскольку это повторяющееся выполнение функции, вы можете использовать setInterval
вместо setTimeout
и иметь один повторный вызов функции, который проверяет, следует ли увеличивать и повторно отображать счетчик. ... как то так:
var c=0;
var timer_is_on=false;
function displayCount() {
document.getElementById('txt').value=c;
}
function count() {
if(timer_is_on) {
c=c+1;
displayCount();
}
}
var interval = setInterval(count,1000);
Теперь, чтобы решить однокнопочную часть проблемы. Допустим, есть одна кнопка:
<input type="button" value="Start count!" onclick="toggle" />
Когда мы щелкаем по нему, мы хотим, чтобы этот атрибут «value» изменился, и мы хотим, чтобы он перевернул переменную timer_is_on
. Давайте создадим функцию, которая делает все это:
function toggle() {
if(timer_is_on) {
timer_is_on = false;
this.value = "Start count!"; // `toggle` is invoked by the button's event handler, so `this` is the button
} else {
timer_is_on = true;
this.value = "Stop count!";
}
}
Итак ... count всегда выполняется каждые 1000 мсек, но он делает все, только если timer_is_on, и независимо от того, является ли timer_is_on true или false, контролируется toggle
, который присоединен к нашей кнопке. Я думаю, немного проще.
UPDATE
Что, если бы мы хотели, чтобы не всегда включали функцию count
в фоновом режиме? Как отмечает Том Ту, это может означать нагрузку на процессор. Я не уверен, что это измеримый (или что он представляет какие-либо накладные расходы помимо таймера, который браузер, вероятно, запускает для выполнения своих собственных обновлений пользовательского интерфейса), но это может быть важно на некоторых платформах, и, возможно, к нему стоит обратиться.
Пока мы полируем, мне не очень нравится присоединять обработчики событий через атрибуты тегов или помещать переменные в глобальную область / область видимости, если я могу избежать этого, поэтому я, вероятно, оберну все наши соответствующие настройки счетчика / обработка JavaScript внутри одной большой функции setupCounter
, а также присоединение функции toggle
к событию onclick
кнопки ввода с использованием выбора DOM и JavaScript. Вероятно, я бы тоже попытался запускать document.getElementById
поиски по одному разу.
Итак, допустим, кнопка ввода имеет идентификатор startstop
, но в остальном предполагается аналогичная разметка. Я бы, наверное, сделал что-то вроде этого:
function setupCounter() {
var c=0,
interval,
counter_display = document.getElementById('txt'),
button = document.getElementById('startstop');
function display_count() {
counter_display.value = c;
}
function count() {
c=c+1;
display_count();
}
function toggle() {
if(!interval)
interval = setInterval(count,1000);
button.value = "Stop count!";
else {
clearInterval(interval);
interval = false;
button.value = "Start count!";
}
}
button.onclick = toggle;
}
Затем вы должны вызвать setupCounter
либо когда-нибудь в документе после того, как будут объявлены элементы counter_display и starttop, либо назначить его для события window.onload
или передать его как-нибудь наподобие jQuery $(document).ready()
.