|
04.03.2013, 19:49
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Бесконечный вызов функции
Приветствую всех. Столкнулся с такой проблемой. Написал скрипт таймера, активирующийся по нажатию на кнопку. Но если не дождавшись окончания отсчета, второй раз нажать по кнопке, функция будет вызываться бесконечно.
var x;
$('button').click(function(){
var y = 5;
x = setInterval(function(){$('p').text(y); if(y>0){y--} else{Run()}},1000);
});
function Run(){
clearInterval(x);
console.log("error");
}
Вот ссылка на скрипт http://jsfiddle.net/nCT3B/
|
|
04.03.2013, 19:57
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Все, дошло. Просто уже плохо соображаю к вечеру. Извиняюсь. Тему можно удалить. Вот ответ:
if(x){return false;}
|
|
05.03.2013, 13:24
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Вопрос снова открыт. Метод clearInterval() как выяснилось не очищает переменную с интервалом, а записывает туда какие-то числовые значения. Что они означают я так и не понял. При чем как до очистки интервала так и после, значение тоже самое. С каждым новым запуском таймера, это значение увеличивается на единицу. Но у меня на сервере это значение по какой-то причине увеличивается на 2, а не на 1. Что означают эти цифры?
|
|
05.03.2013, 13:27
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
это идентификатор таймера. clearInterval ничего туда не записывает, и вобще не меняет саму переменную (с чего бы, да и невозможно это)
|
|
05.03.2013, 13:32
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Сообщение от danik.js
|
это идентификатор таймера. clearInterval ничего туда не записывает, и вобще не меняет саму переменную (с чего бы, да и невозможно это)
|
Если не записывает тогда почему я не могу запустить таймер заново? Делаю проверку
if(x){return false;}
Условие всегда истинно, даже после окончания отсчета и очистки интервала. console.log(x) выводит как раз таки эти числа.
|
|
05.03.2013, 13:41
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Dimaz
|
Условие всегда истинно
|
Ну да, а почему оно должно быть ложным? Вы наверно не читаете что вам пишут. В x содержится идентификатор таймера (возвращенный функцией setInterval). То есть число. И оно больше нуля. Проверка if (x) выполнится. clearIterval число не изменяет как я говорил.
|
|
05.03.2013, 13:50
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Т.е. после clearInterval() нужно поставить x=""?
Да, кстати еще на счет моего первого поста. Просто ради интереса, почему функция зациклилась? Я же каждый раз очищаю интервал. Интервалы где-то в глобальной области сохраняются?
|
|
05.03.2013, 13:57
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Dimaz
|
Т.е. после clearInterval() нужно поставить x=""?
|
Ну как вариант. Только принято писать x = null;
Код по ссылке нигде не зацикливается, не знаю о чем вы. Считает до 0 и останавливается.
|
|
05.03.2013, 14:34
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Сообщение от danik.js
|
Ну как вариант. Только принято писать x = null;
Код по ссылке нигде не зацикливается, не знаю о чем вы. Считает до 0 и останавливается.
|
А вы нажмите два раза на кнопку и посмотрите в консоли. Будет выводиться бесконечно сообщение error.
|
|
05.03.2013, 14:43
|
Профессор
|
|
Регистрация: 25.12.2009
Сообщений: 222
|
|
Как я понимаю это. Вы сказали, что каждый раз присваивается новый id интервала. Двойное нажатие кнопки запускает два интервала где-то в глобальной области. Затем clearInterval очищает второй запущенный интервал, а первый остается рабочим навсегда. Правильное мышление?
|
|
|
|