Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.03.2011, 12:37
Кандидат Javascript-наук
Отправить личное сообщение для ArmagedDance Посмотреть профиль Найти все сообщения от ArmagedDance
 
Регистрация: 07.12.2009
Сообщений: 147

Как выполнить ClearInterval из вложенного clearinterval
Есть следующий скрипт ниже (упрощенный). Подскажите, как в нем полностью остановить animate и state из gameover?
animate заставляет двигаться объект, state - проверяет состояние в определенный момент после переноса объекта мышью и вызывает движение снова, gameover - останавливает игру по истечении определенного времени.
var state = setInterval(function() { 
var animate = setInterval(function() { 

$("#playobject").animate({ 
left: '+=15px'}, 80);

$("#playobject").mousedown(function(event){
$(this).stop();
clearInterval(animate);
});

$("#playobject").mouseup(function(event){
$("#playobject").offset().top = event.pageY;
$("#playobject").offset().left = event.pageX;
});

$("#playobject").mouseover(function(){
$("#playobject").css('cursor','pointer');
});


},80);

$("#playobject").mouseup(function(){
clearInterval(animate);
});

},2000);


Скрипт, из которого нужно остановить два верхних таймера:

var i = 0;
var gameover = setInterval(function() {
if(i==40){
clearInterval(gameover);
clearInterval(animate);
clearInterval(state);
alert("Вы выиграли! Ура!");
}
i++; 
},1000);


Вроде все работает как надо, но после остановки игры память все равно жрется в диких количествах, особенно в IE. Я подозреваю это происходит потому, что не все таймеры отключаются.

Последний раз редактировалось ArmagedDance, 22.03.2011 в 12:43.
Ответить с цитированием
  #2 (permalink)  
Старый 22.03.2011, 12:54
Кандидат Javascript-наук
Отправить личное сообщение для ArmagedDance Посмотреть профиль Найти все сообщения от ArmagedDance
 
Регистрация: 07.12.2009
Сообщений: 147

Может быть, чтобы управлять таймерами state и animate, их нужно сделать вложенными в таймер gameover?
Ответить с цитированием
  #3 (permalink)  
Старый 22.03.2011, 13:05
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

ArmagedDance,
а ты проверь. продолжают ли выполняться действия по таймеру после их остановки. запуск по таймеру ты то остановил-но ты не можешь отменить действия по таймеру какие уже стали в очередь. возникает если выполнение функции занимает больше времени чем её последующий вызов через заданный интервал времени
Ответить с цитированием
  #4 (permalink)  
Старый 22.03.2011, 13:17
Кандидат Javascript-наук
Отправить личное сообщение для ArmagedDance Посмотреть профиль Найти все сообщения от ArmagedDance
 
Регистрация: 07.12.2009
Сообщений: 147

dmitriymar, верно, как оказалось, таймеры не останавливаются.
Я то просто присваивал .hide();в таймере gameover игровым объектам и думал что все отлично, а .show(); дало понять что никакой остановки не происходит. Точнее, останавливается лишь таймер state, animate продолжает вызывать движение. Итак, как остановить этот таймер?

Последний раз редактировалось ArmagedDance, 22.03.2011 в 14:04.
Ответить с цитированием
  #5 (permalink)  
Старый 22.03.2011, 15:20
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

ArmagedDance,
та нет-таймеры ты как раз останавливаешь,но есть вызовы функций уже поставленные в очередь таймером
что таймер ты останавливаешь-но уже в очереди стоят выполнения поставленные по таймеру и им фиолетово что ты его остановил.
как вариант использовать не setInterval а setTimeout

Последний раз редактировалось dmitriymar, 22.03.2011 в 16:07.
Ответить с цитированием
  #6 (permalink)  
Старый 22.03.2011, 15:37
Кандидат Javascript-наук
Отправить личное сообщение для ArmagedDance Посмотреть профиль Найти все сообщения от ArmagedDance
 
Регистрация: 07.12.2009
Сообщений: 147

извините, не соглашусь с вами. У меня в анимации идет относительное приращение анимации параметра left, а не абсолютное, то есть, каждый сдвиг обьекта вызывается именно таймером каждые 80 миллисекунд.
Ответить с цитированием
  #7 (permalink)  
Старый 22.03.2011, 15:53
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

ArmagedDance,
думать над алгоритмом-вкладывать таймер на выполнение функции другой в функцию вызываемую по таймеру-это плохая практика-и ведут себя совместно они непредсказумо.причём на разных компах(зависит от навороченности и подобного)-будут вести себя по разному.
я уже назвал причину-причина в очереди(в случае с вложенными она вообще перекосяченая выйдет)-и когда функция может запустить саму себя по новой и соответственно опять запустить таймер-пусть даже таймер выключен уже-это плохой путь
state-сколько раз в очередь становиться за время выполнения вложенной? и от того что таймер остановлен-из очереди выполнение функции по нему никто не убирал.тоже касается и остальных таймеров

http://javascript.ru/tutorial/events...chered-sobytiy
http://javascript.ru/tutorial/events...noe-vypolnenie




var state = setInterval(function() {
var animate = setInterval(function() {-косяк номер раз

var animate = setInterval(function() {

$("#playobject").animate({
left: '+=15px'}, 80);-косяк номер два .анимейт 80 милисикунд и функция его вызывающая тоже 80 милисекунд,но в функции кроме анимейта ещё есть код-итого пока она выполниться пройдёт больше 80 милисекунд,и она не успев отработать уже в очередь станет-так что фиолетово что ты таймер отключаешь после
итого -с учётом анимат - минимум 3 вложенных таймера

а в сочетании с этим -вообще......40 проходов по нему ну ни как в сочетании с остальным кодом не дадут 40 сек,а если это чтото другое по замыслу то это полная.....
var i = 0;
var gameover = setInterval(function() {
if(i==40){
clearInterval(gameover);
clearInterval(animate);
clearInterval(state);
alert("Вы выиграли! Ура!");
}
i++;
},1000);

Последний раз редактировалось dmitriymar, 22.03.2011 в 17:09.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Как получить значение аттрибута вложенного тэга по id losk Events/DOM/Window 4 21.11.2009 10:08
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20
Как выполнить функцию с задержкой? AlexMak Events/DOM/Window 6 11.12.2008 11:53
как выполнить движение объекта scuter Элементы интерфейса 5 08.06.2008 23:57