Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Action script 2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=49)
-   -   Как сложить команду? (http://www.flasher.ru/forum/showthread.php?t=58780)

Vit025 28.05.2004 20:39

Как сложить команду?
 
Подскажите плз можно ли заставить работать например такую строку:

i="play";
a=10;

"gotoAnd" + i + "(" + a + ");"

Спасибо.

TTS 28.05.2004 22:44

i="Play";
a=10;
this["gotoAnd"+i](a);
или mc["gotoAnd"+i](a), где mc - клип, который должен перескочить на 10-й кадр. Не забудь, что "Play" надо писать с большой буквы.

Vit025 28.05.2004 23:02

Хотел попроще. Но похоже не лучший пример привел...

А вот так:

nodesTest="";

for (i=1; i<=3; i++) { nodesTest=nodesTest+".childNodes[0]"; }

this.nodesTest.nodeName - не работает.
eval("this."+nodesTest+".nodeName") - тоже не хочет.

Или там все СОВСЕМ по другому надо?

TTS 29.05.2004 01:27

не хочет eval, собака, квадратные скобки обрабатывать как надо. Через точку работает (в 5-ке, 6-ке и 7-ке):

node1=new XML();
node2=new XML();
node3=new XML();
node4=new XML();
node1.nodeName="first";
node2.nodeName="second";
node3.nodeName="third";
node4.nodeName="fourth";
node2.appendChild(node1);
node3.appendChild(node2);
node4.appendChild(node3);

nodesTest="node4";
for (i=0; i<4; i++) {
trace(eval(nodesTest+".nodeName"));
nodesTest=nodesTest+".childNodes.0";
}

но выглядит как-то некорректно. И this[...] это не переваривает... Я бы так делать не стал, решил бы задачу как-то по-другому.

Ostgur 29.05.2004 20:52

Не понимаю
 
Не понимаю я вас что-то, а зачем ваще такие сложные пути нужны, понимаю если переменная это имя или номер кадра, а "PLAY" тут зачем ? :confused:

artfla$her 30.05.2004 00:38

Цитата:

Не понимаю я вас что-то, а зачем ваще такие сложные пути нужны, понимаю если переменная это имя или номер кадра, а "PLAY" тут зачем ?
Не-а, на самом деле очень важная штука - спасибо TTS, подсказал, а то я и сам не знал раньше, как ето делать - она необходима, например, при создании динамически какой-либо инструкции, выполняемой после ряда операций, когда точно не известно, что же выйдет, а if-ы писать порой очень громоздко выходит. И это не единственная ситуация, где используется метод преобразования строки в код.

Dindin 02.06.2004 02:24

Возможно, я не совсем срубил фишку, но по-моему, так - правильнее:
Код:

node1=new XML();
node2=new XML();
node3=new XML();
node4=new XML();
node1.nodeName="first";
node2.nodeName="second";
node3.nodeName="third";
node4.nodeName="fourth";
node2.appendChild(node1);
node3.appendChild(node2);
node4.appendChild(node3);

nodesTest="node4";
obj = this['node4']
for (i=0; i<4; i++) {       
trace(obj.nodeName);
obj =obj['childNodes'][0];
}

В любом случае преобразование строки вида 'obj.pole.subPole.subSubPole' можно преобразовать как this['ob'j]['pole1']['subPole']['subSubPole'] Разделитель жёстко задан - точка. Работа с регулярными выражениями - при помощи класса RegExp (http://www.jurjans.lv/flash/RegExp.html) Скобки формируются в цикле или (что еще правильнее) в цикле ассоциированного массива. Имхо этот способ хотя и более громоздок, но более корректен. Имхо.

TTS 02.06.2004 05:25

Не срубил.
Смысл был в том, чтобы сделать текстовую "насадку" и применять ее к разным нодам.

deepNode="";
for (i=0; i<depth; i++) deepNode=deepNode+".childNodes.0";

trace(eval("node1"+deepNode+".nodeName"));
trace(eval("node2"+deepNode+".nodeName"));
trace(eval("node3"+deepNode+".nodeName"));

Dindin 02.06.2004 09:30

1)
Код:

deepNode="";
for (i=0; i<depth; i++) deepNode=deepNode+".childNodes.0";

trace(eval("node1"+deepNode+".nodeName"));
trace(eval("node2"+deepNode+".nodeName"));
trace(eval("node3"+deepNode+".nodeName"));

Вывводит три таза undefined, возможно имелось в виду
Код:

node1=new XML();
node2=new XML();
node3=new XML();
node4=new XML();
node1.nodeName="first";
node2.nodeName="second";
node3.nodeName="third";
node4.nodeName="fourth";
node2.appendChild(node1);
node3.appendChild(node2);
node4.appendChild(node3);

deepNode=".childNodes.0";

trace(eval("node2"+deepNode+".nodeName"));
trace(eval("node3"+deepNode+".nodeName"));
trace(eval("node4"+deepNode+".nodeName"));

2) с тем же успехом:
Код:

node1=new XML();
node2=new XML();
node3=new XML();
node4=new XML();
node1.nodeName="first";
node2.nodeName="second";
node3.nodeName="third";
node4.nodeName="fourth";
node2.appendChild(node1);
node3.appendChild(node2);
node4.appendChild(node3);


function deepNode (obj:Object){
        return obj['childNodes'][0];
        }

trace(deepNode(this["node2"]).nodeName);
trace(deepNode(this["node3"]).nodeName);
trace(deepNode(this["node4"]).nodeName);

Или я опять чего-то не понимаю :(

TTS 04.06.2004 03:19

Мнэээээ... Как бы объяснить-то.... И надо ли....
Допустим, такая задачка. Пример дурацкий, конечно, но тут сложно придумать что-то подходящее.
Пусть надо написать ф-ю, которая вытаскивает имя нода из хмл элемента, причем заранее неизвестно с какой глубины вложенности и какой по счету нод. Принимаемые значения - XML-объект (пусть это будет корневой элемент) и путь к ноду:
function getNodeName(XMLrootelement, path){
...
}
path может быть и childNodes[0], и childNodes[3].childNodes[0], и childNodes[5].lastChild.previousSibling - какой угодно и заранее неизвестный.
Так вот задачка - что писать внутри фигурных скобок, чтобы присовокупить этот заранее неизвестный path к заранее неизвестному XMLrootelement.
По нашей методе получается так: return eval("XMLrootelement"+path+".nodeName"), причем path - текстовый, с точками вместо квадратных скобок у массивов. Из-за которых, собсно, весь сыр-бор.

Твоя задача - придумать более приличный вариант ;)


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

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