Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.03.2013, 19:49
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 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/
Ответить с цитированием
  #2 (permalink)  
Старый 04.03.2013, 19:57
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Все, дошло. Просто уже плохо соображаю к вечеру. Извиняюсь. Тему можно удалить. Вот ответ:
if(x){return false;}
Ответить с цитированием
  #3 (permalink)  
Старый 05.03.2013, 13:24
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Вопрос снова открыт. Метод clearInterval() как выяснилось не очищает переменную с интервалом, а записывает туда какие-то числовые значения. Что они означают я так и не понял. При чем как до очистки интервала так и после, значение тоже самое. С каждым новым запуском таймера, это значение увеличивается на единицу. Но у меня на сервере это значение по какой-то причине увеличивается на 2, а не на 1. Что означают эти цифры?
Ответить с цитированием
  #4 (permalink)  
Старый 05.03.2013, 13:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

это идентификатор таймера. clearInterval ничего туда не записывает, и вобще не меняет саму переменную (с чего бы, да и невозможно это)
Ответить с цитированием
  #5 (permalink)  
Старый 05.03.2013, 13:32
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Сообщение от danik.js Посмотреть сообщение
это идентификатор таймера. clearInterval ничего туда не записывает, и вобще не меняет саму переменную (с чего бы, да и невозможно это)
Если не записывает тогда почему я не могу запустить таймер заново? Делаю проверку
if(x){return false;}
Условие всегда истинно, даже после окончания отсчета и очистки интервала. console.log(x) выводит как раз таки эти числа.
Ответить с цитированием
  #6 (permalink)  
Старый 05.03.2013, 13:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Dimaz
Условие всегда истинно
Ну да, а почему оно должно быть ложным? Вы наверно не читаете что вам пишут. В x содержится идентификатор таймера (возвращенный функцией setInterval). То есть число. И оно больше нуля. Проверка if (x) выполнится. clearIterval число не изменяет как я говорил.
Ответить с цитированием
  #7 (permalink)  
Старый 05.03.2013, 13:50
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Т.е. после clearInterval() нужно поставить x=""?
Да, кстати еще на счет моего первого поста. Просто ради интереса, почему функция зациклилась? Я же каждый раз очищаю интервал. Интервалы где-то в глобальной области сохраняются?
Ответить с цитированием
  #8 (permalink)  
Старый 05.03.2013, 13:57
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Dimaz
Т.е. после clearInterval() нужно поставить x=""?
Ну как вариант. Только принято писать x = null;
Код по ссылке нигде не зацикливается, не знаю о чем вы. Считает до 0 и останавливается.
Ответить с цитированием
  #9 (permalink)  
Старый 05.03.2013, 14:34
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Сообщение от danik.js Посмотреть сообщение
Ну как вариант. Только принято писать x = null;
Код по ссылке нигде не зацикливается, не знаю о чем вы. Считает до 0 и останавливается.
А вы нажмите два раза на кнопку и посмотрите в консоли. Будет выводиться бесконечно сообщение error.
Ответить с цитированием
  #10 (permalink)  
Старый 05.03.2013, 14:43
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Как я понимаю это. Вы сказали, что каждый раз присваивается новый id интервала. Двойное нажатие кнопки запускает два интервала где-то в глобальной области. Затем clearInterval очищает второй запущенный интервал, а первый остается рабочим навсегда. Правильное мышление?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двойной вызов функции Tmin10 jQuery 8 08.12.2011 15:19
вызов функции при смене url vvsh Events/DOM/Window 4 11.08.2011 19:01
Вызов функции (Sandr) AJAX и COMET 12 16.03.2011 10:43
непонятный вызов функции hedgi Общие вопросы Javascript 2 05.08.2010 11:55
вызов функции из функции sharp_007 Общие вопросы Javascript 2 03.04.2010 21:13