#javascript #setinterval #timing
#javascript #setinterval #время
Вопрос:
Я работаю над этим уже довольно долгое время. Я пытаюсь создать простой таймер, который ведет обратный отсчет. Я заставил alert () работать, но, к сожалению, textToChange не меняется. Я воспроизвел копию своего кода ниже. Буду признателен за любую помощь! Спасибо.
<script type="text/javascript">
var timeLeft = 0;
var changingTextElement;
var changingText = new Array();
var ctr = 0;
function timeMsg(thing)
{
var length = thing.inputbox.value*1000;
var t = setTimeout("alertMsg()",length);
timeLeft = length/1000;
initChangeText();
}
function alertMsg()
{
alert("Alert!");
}
function initChangeText(){
changingTextElement = document.getElementById("textToChange");
changingText[ctr] = changingTextElement.innerHTML;
ctr ;
while(timeLeft > 0){
changingText[ctr] = timeLeft;
timeLeft--;
ctr ;
}
ctr = 0;
setInterval("changingText()",1000);
}
function changingText() {
ctr ;
if(ctr >= changingText.length){
changingTextElement.innerHTML = 0;
}
else{
changingTextElement.innerHTML = changingText[ctr];
}
}
</script>
Комментарии:
1. Не могли бы вы также опубликовать свой HTML-код, чтобы мы могли проверить идентификаторы, элементы и т.д.?
2. Нет причин создавать
changingText
массив (он может стать потенциально огромным). Вы можете вычислить нужное значение для отображения «на лету»…3. @Томас: Нет,
changingTextElement
определяется в глобальной области видимости в верхней части блока сценария. Если вы добавитеvar
, это никак не будет работать.4. @Thomas — почему, они определены глобально, поэтому изменять нужно только с точки зрения чистоты, а не с точки зрения функциональности
Ответ №1:
Вы используете changingText
функцию и changingText
массив …
Видите конфликт?
В качестве дополнительной информации,
не используйте строки в качестве имен функций в setInterval
методе. Используйте ссылку на метод напрямую
setInterval(changingText, 1000);
Комментарии:
1. Мне потребовалось слишком много времени, чтобы разобраться с этим. Какая пустая трата скрипки : (
Ответ №2:
Для простого таймера обратного отсчета этот код слишком большой. В принципе, то, что вы должны делать, это:
- Установите количество секунд, с которого следует отсчитывать
- Запустите таймер, используя
setInterval
который уменьшает счетчик и отображает его
Это может быть просто, как:
var countFrom;
var timer;
function run_timer() {
document.getElementById("textToChange").innerHTML = --countFrom;
// !0 evaluates to true, if the counter reaches 0 (wait 0 seconds) ...
if (!countFrom) {
clearInterval(timer);
alert("Timer finished!");
}
}
function init_timer () {
// stop previous timers if any
clearInterval(timer);
// start counting from 30 seconds
countFrom = 30;
timer = setInterval(run_timer, 1000);
}
Ответ №3:
Ваша версия в скрипте. Я изменил название функции