Просмотр полной версии : почему не работает setInterval в цикле?
soldatoff
01.02.2009, 23:41
Помогите пожалуйста разобраться с задержкой показа.
Делаю текстовый баннер.
У меня есть файл vars.htm, его содержимое:
myVar01=первый текстRRвторой текст RRну и конечно третий&myVar02=RR&myVar03=3000
Из него забираются данные во флешку:
var data_lv:LoadVars = new LoadVars ();
data_lv.onLoad = function (success) {
if(success) {
var texts:Array = this.myVar01.split(this.myVar02);
var len:Number = texts.length;
for (var i:Number = 0; i < len; i++) {
setInterval((_root.klip.text = texts[i].toString()), this.myVar03);
}
}
}
data_lv.load("vars.htm");
во самой флешке есть только одно текстовое поле с именем klip, по идее - при проходе по массиву texts, при каждой передаче в _root.klip.text, должна происходить задержка в 3 сек. Но в итоге флешка мне показывает только последнее значение из переменной myVar01 ("ну и конечно третий").
Пробовал делать еще так:
var data_lv:LoadVars = new LoadVars ();
data_lv.onLoad = function (success) {
if(success) {
var texts:Array = this.myVar01.split(this.myVar02);
var len:Number = texts.length;
for (var i:Number = 0; i < len; i++) {
setInterval(function(klip, texts, i){_root.klip.text = texts[i].toString()}, this.myVar03);
}
}
}
data_lv.load("vars.htm");
тут вообще пишет undefined.
Я не бог весть какой спец в actionscript, но стараюсь хотябы научиться простым вещам.
Подскажите, плиз, что я делаю не так?
chingachgoog
01.02.2009, 23:48
Посмотрите на синтаксис setInterval - он трех видов.
Особенности:
1) Не надо писать оператор вызова функции ()
2) Ссылка this правильно работать не будет - воспользуйтесь третим видом синтаксиса или другой ссылкой.
chingachgoog, подскажите, как выглядит третий вид setInterval
chingachgoog
02.02.2009, 11:56
chingachgoog, подскажите, как выглядит третий вид setInterval
Третий - когда вначале указывается путь objectReference.
Но я так понимаю вас смутило, то что их три, а не два?
Это потому, что по сути первый синтаксис представлен двумя видами:
ссылкой на функцию и возможностью задать литерал непосредственно.
ссылкой на функцию и возможностью задать литерал непосредственно.Не котируется. Синтаксиса два.
chingachgoog
02.02.2009, 14:58
Не котируется. Синтаксиса два.
Хорошо. Если код
setInterval(моя_функция, 100)
function моя_функция(){
trace("!")
}
и код
setInterval(function(){
trace("!")
}, 100)
"котируются" как один и тот же синтаксис - то я не спорю.
Но замечу, что разница между этими двумя записями есть.
А есть еще один вариант записи - т.н. "второй синтаксис".
Итого я вижу три различных варианта записи setInterval.
DarkLight
02.02.2009, 15:22
chingachgoog, для Вас
trace("aa");
и
var s:String = "aa";
trace(s);
2 разных синтаксиса?
chingachgoog
02.02.2009, 15:36
DarkLight, вы правы - я различаю эти два варианта записи.
Для того, кого скоро забанят. Вот это синтаксис:
setInterval(functionReference:Function, interval:Number, [param1:Object, param2, ..., paramN]) : Number
setInterval(objectReference:Object, methodName:String, interval:Number, [param1:Object, param2, ..., paramN]) : Number
В приведенном выше примере, в обоих случаях для первого синтаксиса первым аргументом является Function, в не зависимости от того в каком виде оно туда попало.
2 chingachgoog
Синтаксис и способы написания, это разные вещи. Можно придумать 100 способов передачи параметров в функцию например, но то что в нее нужно передать лишь определенное количество параметров определенного типа, это и есть синтаксис.
trace ( "aa" );
и
var s:String = "aa";
trace ( s );
В обоих случаях синтаксис записи "trace" верен, синтаксических ошибок нет. В обоих случаях отдается String, в качестве параметра, значит оба примера синтаксически одинаковы. Сама запись кода, конечно разная, но не путайте одно с другим.
chingachgoog
02.02.2009, 16:41
iNils, я же не спорю со святым хелпом (http://flasher.ru/forum/showthread.php?p=791224#post791224) от адоба.
Но скажи: ты видишь разницу между
trace("aa");
и
s = "aa";
trace(s);
?
В этом примере от DarkLight разница даже больше, чем в моем примере с литералом в интервале. У меня хоть можно извернуться и добраться-таки потом до анонимной функции, если потребуется. А в случае с trace("aa") - все - уже никак не добраться.
add
ALiEN_, если вы о слове "синтаксис", то как я уже сказал, с этой терминологией я не спорю.
Мне по барабану, что там в трейсе. Речь шла о синтаксисе. Если ты признаешь, что синтаксиса два, то вопрос закрыт.
soldatoff
07.02.2009, 16:43
Народ, спасибо за советы
я кое что сделал, но теперь у меня другая проблема
var data_lv:LoadVars = new LoadVars ();
data_lv.load("vars.htm");
data_lv.onLoad = function() {
var texts:Array = this.myVar01.split(this.myVar02);
var delay:Number = this.myVar03*1000;
var count:Number = 0;
var timerID = setInterval(createTxt,delay,this);
function createTxt(){
trace("texts[" + count.toString() + "] = " + texts[count].toString()); //данные
createTextField(texts[count],count,0,0,200,16);
var w = eval(texts[count]);
w.text = texts[count];
w.background = "#FFF;"
count++;
trace(count); //count
if(count >= texts.length){
// clearInterval(timerID);
count = 0;
}
}
}
trace показывает, что переменная count обнуляется по условию if(count >= texts.length), также trace показывает, что проход по массиву начинается сначала, но в самой флешке происходит проход только один раз.. т.е. первый текст -> второй -> третий.. и всё. А в output'е trace показывает, что проход продолжается.
Короче мне надо чтобы проход по массиву отображался визуально, т.е. чтобы баннер работал.
Где я в коде накосячил, не подскажите? Пожалуйста..
chingachgoog
07.02.2009, 22:17
Не пойму в чем проблема? clearInterval не срабатывает?
Попробуйте написать
var timerID = setInterval(createTxt,delay,this);
без var
timerID = setInterval(createTxt,delay,this);
или так:
var timerID = setInterval(createTxt,delay,this);
....
clearInterval(this.timerID); // не уверен, что сработает
или так
createTxt.timerID = setInterval(createTxt,delay,this);
...
clearInterval(createTxt.timerID);
soldatoff
07.02.2009, 22:41
2 chingachgoog:
на самом деле, я зря оставил эти строчки :)
код выглядит так:
var data_lv:LoadVars = new LoadVars ();
data_lv.load("vars.htm");
data_lv.onLoad = function() {
var texts:Array = this.myVar01.split(this.myVar02);
var delay:Number = this.myVar03*1000;
var count:Number = 0;
setInterval(createTxt,delay,this);
function createTxt(){
trace("texts[" + count.toString() + "] = " + texts[count].toString()); //данные
createTextField(texts[count],count,0,0,550,100);
var w = eval(texts[count]);
w.text = texts[count];
w.background = "#FFF;"
count++;
trace(count); //count
if(count >= texts.length){
count = 0;
}
}
}
А проблема в том, что когда я нажимаю Ctrl+Enter, компилируется флешка и показывает только один проход по массиву с фразами (с указанной задержкой между фразами), а в окне Output, трейс показывает что проход продолжается, что мне собственно и надо!
Т.е. мне надо, чтобы флешка бесконечно показывала по-очереди фразы из массива texts, а она один раз как бы отрабатывает и все.. попробуйте проверить этот код во флеше?
Я не знаю какими словами объяснить :( ну не специалист я пока еще во флеше!... Помогите пожалуйста разобраться!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.