Форум 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=83548)

zhalexei 08.08.2006 14:28

Запуск функции после загрузки ХML-файла
 
Во внешнем скрипте(php,JS - не принципиально) формируется массив. Как этот массив загрузить во флеш-файл?
в каком виде он должен выводится в скрипте и как читаться флеш-файлом?
Для обычных переменных(строковых, числовых) вроде понятно, а для массива не могу сделать..

wvxvw 08.08.2006 16:21

Флеш принимает либо стринг либо ХМЛ, так что вариантов не много... формируй либо то либо другое. Если массив относительно небольшой, то можно передавать его одним стрингом с каким-нибудь символом разделяющим элементы массива, если нет - строй ХМЛ...
Пример:
html
Код:

my.swf?myArr=1%23%456%2%45
flash
Код:

var myArr_arr:Array = myArr.split["%"]

zhalexei 08.08.2006 21:02

Пришлось делать через XML.
Парсинг полчается нормально, вычисляет что нужно правильно(делал по одному из примеров на flasher.ru)
но вот в чем проблема

Код:

myArray = new Array();

doc = new XML();
doc.load("doc.xml");
doc.onLoad = function (success) {
        if (success) {
                ...
                        myArray.push(value);
                ...
        }
}

trace(myArray.length);

На выходе получаю 0.
По всей видимости дело либо в области видимости переменной, либо скорее всего во времени подгрузки файла.
как быть?

KidsKilla 08.08.2006 21:04

1) сначала doc.onLoad а уж потооооом doc.load("doc.xml");
2) где у тя value?

zhalexei 08.08.2006 21:27

1)перестановка мест, вполне естессно ничего не дала
2)value находится в XML-файле

пробовал играть с _global.. не выходит ничего.
может и правда влияет время на загрузку файла?

wvxvw 09.08.2006 03:51

Опиши подробнее, что такое value, а еще лучше - дай один нод ХМЛя и полностью функцию, которая его разбирает (парсит), иначе тяжело что-то сказать.
_global тут ни при чем. время никак не влияет, функция прописанная\вызывающаяся в onLoad вызывается тогда, когда весь ХМЛ уже загружен.
Вот тебе рабочий пример, если нужно:
Код:

var mainXML:XML = new XML();
mainXML.ignoreWhite = true;
mainXML.onLoad = function() {
        parseXML_fn(this);
};
mainXML.load("xml2load.xml");
var _arr:Array = [[],[]];
var parseXML_fn = function () {
        var _xml:XML = arguments[0];
        for (var i:XMLNode = _xml.childNodes[0].firstChild; i != null; i=i.nextSibling) {
                _arr[0].push(i.attributes.z);
                _arr[1].push(i.attributes.c);
        }
        trace("Loaded array contains these values: "+_arr);
};

XML
Код:

<m>
<n z="1" c="2"/>
<n z="3" c="4"/>
<n z="5" c="6"/>
<n z="7" c="8"/>
<n z="9" c="0"/>
</m>


RomanASDF 09.08.2006 10:04

zhalexei, если ты засунешь
Код:

trace(myArray.length);
в doc.onLoad, после всех твоих пушей , то я думаю что будет не 0.
Дело во времени загрузки xml файла - onLoad срабатывает позже чем trace

zhalexei 09.08.2006 12:56

Цитата:

Сообщение от RomanASDF
zhalexei, если ты засунешь
Код:

trace(myArray.length);
в doc.onLoad, после всех твоих пушей , то я думаю что будет не 0.
Дело во времени загрузки xml файла - onLoad срабатывает позже чем trace

пробовал.давно уже. поэтому и подумал на время загрузки. проблем а в том что в том месте где я поставил
Код:

trace(myArray.length);
должен стоять код который обрабатывает этот массив, а обработаться он не успевает..

zhalexei 09.08.2006 20:16

ну есть же наверное какие то способы задержать начало выполнения проги пока не загрузится xml-файл?

wvxvw 10.08.2006 01:22

2 zhalexei:
самое простое - поставь все скрипты на второй кадр, а в doc.onLoad пропиши gotoAndStop(2); =) хотя, это некрасивое решение =) правильно - написать изначально так, чтобы функции читающие что-либо из ХМЛя не вызывались до его загрузки =)

zhalexei 10.08.2006 07:30

Цитата:

Сообщение от wvxvw
правильно - написать изначально так, чтобы функции читающие что-либо из ХМЛя не вызывались до его загрузки =)

вот это я имел ввиду. как это можно реализовать?

KidsKilla 10.08.2006 15:03

Код:

XML.onLoad = function(){
//blah-blah...
traceArray()
}
function traceArray(){
trace(myArray.length)
}


zhalexei 10.08.2006 15:49

Цитата:

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

XML.onLoad = function(){
//blah-blah...
traceArray()
}
function traceArray(){
trace(myArray.length)
}


пробовал в первую очередь..но видимо traceArray() у меня слишком большая, потому что при нажатии TestMovie в такой ситуации флэш просто виснет.. хотя когда функцию выношу за пределы onload а массив создаю вручную, не из xml-файла, а указывая явным образом все работает нормально..

KidsKilla 10.08.2006 15:54

Код:

XML.onLoad = function(){
//blah-blah...
trace('Начинаем парсинг!')
traceArray()
}
function traceArray(){
trace(myArray.length)
trace('Кончаем парсинг!')
}

ну и следи где-то...

zhalexei 10.08.2006 20:49

а что это даст? функция работает правильно, парсинг XML тоже правильный.
все что мне нужно это запустить мою функцию ПОСЛЕ полной загрузки XML, не помещая её в onLoad и не пользуясь переходом на следующий кадр

KidsKilla 10.08.2006 20:53

почему "не помещая её в onLoad"??? ты сам понимаешь чего ты хочешь то???

zhalexei 10.08.2006 21:55

да. понимаю. помещая в onLoad
Код:

XML.onLoad = function(){
//blah-blah...
trace('Начинаем парсинг!')
traceArray()
}

таким образом флэш попросту виснет!
а вот в таком случае
Код:

XML.onLoad = function(){
//blah-blah...
trace('Начинаем парсинг!')
}
traceArray()

работает и парсинг и функция по отдельности, но массив, заполняемый во время парсинга к моменту начала работы функции traceArray() еще ПУСТ

KidsKilla 10.08.2006 22:20

а это рой уже свою ф-цию. онЛоад тут ни разу ни при чём.

zhalexei 10.08.2006 22:36

факт есть факт. вне онЛоада функция работает. оптимизировал на мой взгляд по максимуму :)
судя по форуму не я один с такой проблемой сталкивался, вот только решения я не нашел..

KidsKilla 10.08.2006 23:25

Цитата:

Сообщение от zhalexei
факт есть факт. вне онЛоада функция работает. оптимизировал на мой взгляд по максимуму :)
судя по форуму не я один с такой проблемой сталкивался, вот только решения я не нашел..

факт есть факт уже 3 года кажись онЛоад устраивает всех и вся в мире и делают что угодно...

+ тут не форум телепатов и почему у тя так пашет а так нет вряд ли кто скажет.

zhalexei 10.08.2006 23:35

я не спрашиваю почему так я спрашиваю как сделать так чтобы функция начала выполняться ПОСЛЕ загрузки ХМЛя но не в онЛоаде..вот и всего...

KidsKilla 10.08.2006 23:36

Цитата:

Сообщение от zhalexei
я не спрашиваю почему так я спрашиваю как сделать так чтобы функция начала выполняться ПОСЛЕ загрузки ХМЛя но не в онЛоаде..вот и всего...

никак. как можно поменять обивку машины, не открыв её? =)))

zhalexei 10.08.2006 23:39

решения не может не быть :)
подождем других вариантов :)

KidsKilla 10.08.2006 23:40

Цитата:

Сообщение от zhalexei
решения не может не быть :)
подождем других вариантов :)

сейчас ты противоречишь логике, хотя этого и не понимаешь.

wvxvw 11.08.2006 03:05

Код:

var sender:LoadVars = new LoadVars();
var receiver:LoadVars = new LoadVars();
sender.sendAndLoad("xml2load.xml", receiver);
var mainXML:XML = new XML();
mainXML.ignoreWhite = true;
AsBroadcaster.initialize(receiver);
var parseXML_obj:Object = new Object();
receiver.addListener(parseXML_obj);
receiver.onData = function(text:String) {
        mainXML.parseXML(text);
        this.broadcastMessage("XMLloaded");
};
parseXML_obj.XMLloaded =  function () {
        var _arr:Array = [[],[]];
        var _xml:XML = mainXML;
        for (var i:XMLNode = _xml.childNodes[0].firstChild; i != null; i=i.nextSibling) {
                _arr[0].push(i.attributes.z);
                _arr[1].push(i.attributes.c);
        }
        trace("Loaded array contains these values: "+_arr);
};

Для любителей небанально усложнить примитивную задачу %)
Не смотря на то, что приведенный выше код работает, рекомендую использовать это только чтобы пугать знакомых =)
Зато onLoad не используется %)

KidsKilla 11.08.2006 03:17

Цитата:

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

.....
Для любителей небанально усложнить примитивную задачу %)
Не смотря на то, что приведенный выше код работает, рекомендую использовать это только чтобы пугать знакомых =)
Зато onLoad не используется %)

ты даже не представляешь, какое зло ты ща вытащил на свет...

wvxvw 11.08.2006 17:44

2 KidsKilla:
Это про эзброадкастер чтоли? Та ну... прям такое уж и зло... была еще задуамка переписать все то же самое в командах ассамблера (под компайлер от Флазма), но я сломался %)

Да, вот еще есть смешное решение - создаем мувик из двух кадров, кладем его на главную сцену и на обоих кадрах пишем скрипт проверяющий статус загружаемого ХМЛя (я уже не помню, то ли 6 то ли 0 - загружен без ошибок), как только статус нас устраивает - переходим у выполнению всего остального =) сейчас попробую сделать пример, посмотрим, как оно будет работать =)

KidsKilla 11.08.2006 17:51

зло не в асБродкастер, а в том что ты это вываливаешь на обозрение неподготовленным умам =)))

wvxvw 11.08.2006 18:13

Код:

if (_root.myXML_xml.status == 0 && _root.myXML_xml.toString().length>1) {
        _root.parseXML_fn(_root.myXML_xml);
        this.stop();
}

это помещаем в мувик из двух кадров, на главной сцене
Код:

var myXML_xml:XML = new XML();
myXML_xml.ignoreWhite = true;
myXML_xml.load("xml2load.xml");
var _arr:Array = [[],[]];
var parseXML_fn = function () {
        var _xml:XML = arguments[0];
        for (var i:XMLNode = _xml.childNodes[0].childNodes[0]; i != null; i=i.nextSibling) {
                _arr[0].push(i.attributes.z);
                _arr[1].push(i.attributes.c);
        }
        trace("Loaded array contains these values: "+_arr);
};

Ну и это - на главной временной диаграмме =)

Даже не знаю, какой способ более извращенный %)

ЗЫ. для неподготовленных умов был нормально работающий скрипт еще на первой странице - а если кому-то хочется извращенных отношений со своим ХМЛем - так я не против =)

ЗЫЫ. Даже обшивку в машине можно поменять не открывая, например так:
1. откутить заднее колесо
2. снять колпак
3. похудеть на столько, чтобы можно было пролезть через получившееся отверстие в багажник
4. вскрыть консервным ножем перегородку между багажником и салоном...

KidsKilla 11.08.2006 18:30

Цитата:

Сообщение от wvxvw
ЗЫЫ. Даже обшивку в машине можно поменять не открывая, например так:
1. откутить заднее колесо
2. снять колпак
3. похудеть на столько, чтобы можно было пролезть через получившееся отверстие в багажник
4. вскрыть консервным ножем перегородку между багажником и салоном...

так вот твои 2 варианта это как раз "похудеть на столько, чтобы можно было пролезть через получившееся отверстие в багажник" и "сделать операцию на гландах паяльником через ж..."


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

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