Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Остановить (найти) интервал в подгружаемом клипе? (http://www.flasher.ru/forum/showthread.php?t=95064)

wvxvw 26.04.2007 22:25

Остановить (найти) интервал в подгружаемом клипе?
 
Вот, такая ситуация:
Подгружается SWF (в один и тот же клип), в нем setIntervalom вызывается какая-то функция. Один раз - все хорошо, второй раз - интервалов становится 2, третий раз - 3, ну и так далее. Просто clearInterval() перед setInterval() не помогает... почему-то после того, как клип выгружается, интервал остается... и достать его уже не знаю как =/

Molecula 26.04.2007 22:47

Посмотреть бы на это.

wvxvw 26.04.2007 22:55

Вот, упрощенный пример.
Код в loaded.swf
Код:

var itr:Number;
onEnterFrame = function(){
        clearInterval(itr);
        itr = setInterval(counter, 1000);
        delete this.onEnterFrame;
}
function counter(){
        trace(getTimer()+" interval call");
}

код в loader.swf
Код:

b_mc.onPress = function(){
        _root._mc.loadMovie("loaded.swf");
}


lowka 26.04.2007 23:07

Вам нужно перед загрузкой нового мувика удалять интервал внутри старого.

Kikasso 26.04.2007 23:10

setTimeout.
или очищайте интервал ВНУТРИ самой функции. Передать можно параметром..
Код:

function f(intId){
clearInterval(intId);
trace ("called and killed");
}
intId = setInterval( f, 1000, intId );


wvxvw 26.04.2007 23:13

Ну, это хорошо, если интервал можно найти. А если клип с сетИнтервалом не мой, и я вообще не знаю/не уверен есть ли он там. Как тогда?

Kikasso 26.04.2007 23:18

http://flasher.ru/forum/showpost.php...16&postcount=5

wvxvw 26.04.2007 23:28

2 Kikasso:
Не... меня вполне устраивает наличие интервала, пока флешка загружена. Хотелось бы какой-то способ поудалять _любые_ интервалы которые она понасоздавала после того, как она выгрузилась...
Хотя... что-то в этом есть... можно попробовать изменить прототип так, чтобы он проверял наличие переменной, к которой был привязан.

Kikasso 26.04.2007 23:31

Юзай таймауты, и сажай их каждый раз заново, если надо.

etc 27.04.2007 01:23

Можно хранить номер интервала в _global (предварительно убедившись, что ролики одной версии).

wvxvw 27.04.2007 01:35

__etc:
В том то вся и фишка, что номер интервала каждый раз меняется.
Ну, вот чего наворотил. Страшно, конечно, но, вроде как работает...
Код:

var intervalWatcher:Function = function (obj, itr2clear) {
        trace("watcher called "+obj._width);
        if (obj._width == 0) {
                clearInterval(itr2clear);
                clearInterval(++itr2clear);
                trace("Interval "+itr2clear+" cleared");
        }
        return itr2clear;
};
Object.prototype.setInterval1 = function(o:Object, f:Function, t:Number) {
        var i = ASnative(250, 0)(f, t);
        ASnative(250, 0)(intervalWatcher, t, o, i);
        return i;
};
Object.prototype.setInterval = function() {
        if (typeof (arguments[0] == "function")) {
                setInterval1(this, arguments[0], arguments[1]);
        }
};
b_mc.onPress = function() {
        _root._mc.loadMovie("loaded.swf");
};
c_mc.onPress = function() {
        _root._mc.unloadMovie();
};

Только нужно придумать более универсальный способ проверки исчезновения объекта, который вызвал setInterval. Если вам прийдет в голову как - пожалуйста, не стесняйтесь =)

etc 27.04.2007 01:44

Что это? Зачем это? Зачем хаки? Чем не устроил _global? Зачем вообще интервал?

wvxvw 27.04.2007 02:17

__etc:
а как узнать, что это тот же интервал? а не другой, но нужный, вызваный из того же места? и, в догонку, почему такая штука не работает?
Код:

var __obj:Object = new Object(_root._mc);
trace(__obj._width);
__obj.watch("_width", widthWathcer);
var widthWathcer:Function = function(){
        trace("widthWathcer");
}


Kikasso 27.04.2007 04:11

ну во-первых там 3 параметра должно быть, во-вторых, поменяйте местами объявление функции и watch или пишите
Код:

function widthWathcer(p, o, n){
 trace( p + " " + o + " " + n);
 return n;
}

вместо var что-то = function(){}
а в третьих, геттер/сеттер на watch не поймаешь, и наконец на обжекте это сработает, при учете пп 1, 2 и 3. Достаточно п. 3

Совет прежний - передавай id интервала параметром функции.

wvxvw 27.04.2007 04:31

третий параметр у watch не обязательный, а вот про геттер/сеттер не знал, спасибо.
Цитата:

Совет прежний - передавай id интервала параметром функции.
Да как же я его узнаю, если, теоретически, его может даже и не быть? Задача в том, чтобы убрать любые интервалы, когда объект, который их созал исчез. При этом, ни их количество, ни путь к объекту, который их создавал не известны.
Т.е. представим ситуацию:
существует банерная програма, она загружает в себя SWF, и после того, как выгружает, должна удалить все, что может быть с ним связано. SWF может содержать какие угодно setInterval'ы вызванные где угодно. Как их все удалить, когда он выгрузится?

Kikasso 27.04.2007 04:50

Третий параметр надо вернуть, иначе свойство будет undefined. Так-то и первый необязательный, смысла только в этом мало.
Код:

prop = "test1";
trace( prop );
this.watch("prop", trace );
prop = "test2";
trace( prop );
this.watch("prop", function(){ trace ("ep, I watch it"); } );
prop = "test3";
trace( prop );
this.watch("prop", function(p,o,n){return n;} );
prop = "test4";
trace( prop );
this.watch("prop", function(){return "it's me";} );
prop = "test5";
trace( prop );

А интервалы.. Да сажай таймауты, и продлевай.
Ну или массив ссылок на таймауты в подгружаемом клипе, а убивая клип, вызываешь что-то вроде
Код:

while ( intToKill = inrArr.pop() ) clearInterval ( intToKill );

wvxvw 27.04.2007 06:13

эм... тут какое-то жестокое недопонимание =) Ну не могу я ничего сделать в подгружаемой флешке, я ее вообще не делал и не хочу. Мне готовую принесли =) А мне нужно после того, как она выгрузится из моей, поубивать все интервалы, которые она создала. Конечно. я могу попросить человека, который ее делал переписать что-то, чтобы мне было проще... но не хочется, чужая работа - все-тки деньги =)

Kikasso 27.04.2007 06:19

Код:

_global.idsArray = [];
ASSetPropFlags(_global, [setInterval], 0, 7); //оказалось - не нужно
_global.oldI = _global.setInterval;
_global.setInterval = function(){
        trace(arguments);
        var i = oldI.apply( null, arguments);
        idsArray.push( i );
        return(i);
}
ASSetPropFlags(_global, ["setInterval", "oldI"], 7, 7);//можно и не делать
setInterval ( trace, 1000, "interval");
setInterval ( trace, 1100, "interval2");
function f(){
  trace ( arguments.join("") );
        }
setInterval(this, "f", 5000, "син", "так", "сис", "2" );
function xMan(){
        var i;
        while(  i = idsArray.pop() )clearInterval( i );
        trace ("мусорщик пришел и все смел");       
        }
var i1 = oldI( trace, 2000, "а это наш интервал, его пока не убиваем" );
var i2;
var temp = function(){
        clearInterval(i1);
        clearInterval(i2);
        trace ("ну и наших убъем");       
}
var i2 = oldI( temp, 10000 );
setInterval ( xMan, 5500 );
trace( idsArray );

:bye:
PS> тоже хак, конечно, но поддерживает оба синтаксиса и переменное число аргументов userData. Enjoy, короче.

this.create 27.04.2007 10:18

Цитата:

Сообщение от wvxvw
А мне нужно после того, как она выгрузится из моей, поубивать все интервалы, которые она создала.

Тоже самое не забудьте предусмотреть для листенеров.

etc 27.04.2007 13:11

Я не понимаю, чего машает:

Код:

clearInterval(_global.id)
_global.id = setInterval(…)

Ролик хоть обзапускайся.

Molecula 27.04.2007 14:45

А если в подгружаемом swf есть такие строчки:
Код:

setInterval(Zer, 200);
function Zer()
{
  trace("Yo!")
}

И всё, т.е. трейсит "Уо".

Как убрать (очстить) такой интервал в swf, в которую подгрузили?

etc 27.04.2007 14:50

Код:

var int = setInterval(function() {},200);
for (var i = 0;i<=int;i++) {
    clearInterval(i);
}


Molecula 27.04.2007 15:08

Да нет.
Цитата:

А если клип с сетИнтервалом не мой, и я вообще не знаю/не уверен есть ли он там. Как тогда?
Просто в 2005 году, криворукое тело написало такое...код рабоает? работает...ну так что ещё надо. А теперь wvxvw в 2007 году пытается удалить эту конитель.

Как остановить, очистить Интервал Криворукого Дегроида, пример которого описан выше?

Код:

clearInterval(_global.id)
тут подойдет?

etc 27.04.2007 15:39

Если решение из 20-го поста, то нет. Если из 22-го, то скорее всего да.

Molecula 27.04.2007 15:48

Понял.

wvxvw 27.04.2007 15:58

Цитата:

Сообщение от __etc
Код:

var int = setInterval(function() {},200);
for (var i = 0;i<=int;i++) {
    clearInterval(i);
}


Ну, только это кроме всего остального угробит твины (если такие были) использовавшие setInterval, и возможно, запущенные вовсе не из загруженного клипа.
Вобщем, я больше склоняюсь к решению Kikasso, но еще надо будет немного поэксперементировать.

etc 27.04.2007 16:30

Я предложил убивать вообще все интервалы. К тому же, твины без FPS не используют интервал.

Kikasso 27.04.2007 16:43

Цитата:

Сообщение от Molecula
А если в подгружаемом swf есть такие строчки:
Код:

setInterval(Zer, 200);
function Zer()
{
  trace("Yo!")
}

И всё, т.е. трейсит "Уо".

Как убрать (очстить) такой интервал в swf, в которую подгрузили?

Читайте пост №18. Все работает. Если в мой мувик загружать другие, он все id интервалов будет собирать в мешок.
Если твин с FPS, он работает на интервале. Если без, на ентерфрейме - и сам удалится.
Я понял, wvxvw хочет подстраховаться от криворуких баннероделальщиков.
__etc, ваш вариант убъет все интервалы, в том числе и ваши, посаженные до этого.


Часовой пояс GMT +4, время: 19:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.