Как выполнить 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. Я подозреваю это происходит потому, что не все таймеры отключаются. |
Может быть, чтобы управлять таймерами state и animate, их нужно сделать вложенными в таймер gameover?
|
ArmagedDance,
а ты проверь. продолжают ли выполняться действия по таймеру после их остановки. запуск по таймеру ты то остановил-но ты не можешь отменить действия по таймеру какие уже стали в очередь. возникает если выполнение функции занимает больше времени чем её последующий вызов через заданный интервал времени |
dmitriymar, верно, как оказалось, таймеры не останавливаются.
Я то просто присваивал .hide();в таймере gameover игровым объектам и думал что все отлично, а .show(); дало понять что никакой остановки не происходит. Точнее, останавливается лишь таймер state, animate продолжает вызывать движение. Итак, как остановить этот таймер? |
ArmagedDance,
та нет-таймеры ты как раз останавливаешь,но есть вызовы функций уже поставленные в очередь таймером что таймер ты останавливаешь-но уже в очереди стоят выполнения поставленные по таймеру и им фиолетово что ты его остановил. как вариант использовать не setInterval а setTimeout |
извините, не соглашусь с вами. У меня в анимации идет относительное приращение анимации параметра left, а не абсолютное, то есть, каждый сдвиг обьекта вызывается именно таймером каждые 80 миллисекунд.
|
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); |
Часовой пояс GMT +3, время: 00:26. |