PDA

Просмотр полной версии : Остановить (найти) интервал в подгружаемом клипе?


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?p=636116&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
А мне нужно после того, как она выгрузится из моей, поубивать все интервалы, которые она создала.
Тоже самое не забудьте предусмотреть для листенеров.

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
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
А если в подгружаемом swf есть такие строчки:

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


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

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