у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет. Вопрос знатокам, что не так? |
XML
Доступ к XML из Flash
Вы, вероятно, захотите воспользоваться файлом XML для фильма Flash. Сначала нужно создать объект, который будет содержать этот файл и осуществлять доступ к нему. Скорее всего вам потребуется, чтобы программа-считыватель игнорировала любые дополнительные отступы, имеющиеся в файле.
//create the object var myXML = new XML(); //ignore white space myXML.ignoreWhite = true;
Так как загрузка XML-файла может занять некоторое время, Flash позволяет нам перезаписывать управляющий элемент события, сообщающий о полной загрузке файла XML. Очень часто для нашего фильма имеет смысл находиться в состоянии ожидания во время загрузки файла. Возможно, что способом, с помощью которого мы реализуем поддержку завершения загрузки, является переход к другому кадру и продолжение воспроизведения фильма. В некоторых случаях в нашем файле XML будут присутствовать какие-либо ошибки, и обработчик будет получать ошибку, с которой нам предстоит иметь дело.
myXML.ignoreWhite = true; myXML.onLoad = function(success) { if (success) { gotoAndPlay("someFrame"); } else { trace("failure loading xml file"); } };
Последним шагом расположения файла XML в фильме Flash является его непосредственная загрузка. Мы выполняем этот шаг в последнюю очередь, чтобы обеспечить поддержку файла объектом перед его непосредственным запросом.
//load the file myXML.load("someFile.xml");
Когда у нас будет вся необходимая информация, понадобится получить к ней доступ. Из любого узла объекта XML следующие десять свойств могут иметь доступ к любой части информации в документе:
- childNodes используется для поиска массива вложенных узлов.
- Attributes указывает на объект, содержащий параметры узла.
- nextSibling используется для нахождения следующего узла в массиве.
- previousSibling используется для нахождения предыдущего узла в массиве.
- parentNode используется для продвижения вверх по иерархии.
- lastChild указывает на последний узел массива childNodes.
- firstChild указывает на первый узел массива childNodes.
- nodeName сообщает имя узла, например, "message" или "NAVIGATION".
- nodeType сообщает о том, является узел элементом разметки или текстом.
- nodeValue сообщает, каким является текст в случае текстового элемента.
Важно знать, с какого места вы начинаете. Объект XML на самом деле представляет весь документ, что означает, что корневой узел любого файла будет непосредственно представлен в виде дочернего узла объекта XML. Так как у документа XML должен быть один и только один корневой узел, то его очень просто выяснить. Следующие три выражения находят корневой узел XML-объекта myXML.
var rootNode = myXML.firstChild; var rootNode = myXML.lastChild; var rootNode = myXML.childNodes[0];
Следует запомнить, что при поиске в объекте XML совершенно не обязательно проделывать все одновременно. Несмотря на то, что можно написать одну строку кода для поиска любой информации в объекте, это не всегда бывает только полезно. Лучше ознакомившись с объектом XML, более уплотненные выражения понять гораздо легче. Однако, как начинающий, вы будете гораздо меньше путаться, если попытаетесь делать все максимально просто.
//this line of code is difficult to understand someTextField = myXML.firstNode.childNodes[i].firstChild.nodeValue; //while these are clearer var rootNode = myXML.firstNode; var messageArray = rootNode.childNodes; var messageNode = messageArray [i]; var textNode = messageNode.firstChild; someTextField = textNode.nodeValue;
Обновляемая отмеченная область: возврат
XML весьма удобен для чтения. Вспомните следующую строку из "Интеграция динамических данных" , когда вы в первый раз создали отмеченную область (файл message3.txt в папке лекции 15 на компакт-диске).
message1=Sales+hit+3+million&message2=New+product+launch+delayed& Кmessage3=New+positions+available&message4=Finance+Director+retires& Кmessage5=New+catalogue+out+next+month
Возьмем такую же отмеченную область и изменим ее, получая данные не из message3.txt, а из message3.xml.
<messagelist> <message> Sales hit 3 million </message> <message> New product launch delayed </message> <message> New positions available </message> <message> Finance Director retires </message> <message> New catalogue out next month </message> </messagelist>
Это намного компактнее и легче для организации.
- Откройте файл dynamicText4.fla, использованный нами в
"Интеграция динамических данных"
, и сохраните его заново под именем marquee_revisited.fla. Откройте действия в кадре 1 главной временной шкалы и отредактируйте messageURL для указания на message3.xml (все эти файлы находятся на компакт-диске в папке этой лекции).
// the location of our XML file var messageURL = "messages.xml";
- Измените counter так, чтобы начальным значением был 0. Это нужно для того, что бы использовать массив, первым элементом которого является число 0.
// the index of the message node that we will display var counter = 0;
- Измените myVars_obj с объекта loadVars на объект XML.
// the Flash representation of our XML document var myVars_obj = new XML();
- Добавьте строку, сообщающую считывателю XML о необходимости игнорировать любые отступы.
//ignore the spaces we added to make the file human-readable myVars_obj.ignoreWhite = true;
- Оставьте без изменений остальной код в первом кадре.
myVars_obj.onLoad = function() { gotoAndPlay("offscreen"); }; myVars_obj.load(messageURL); stop();
- Теперь перейдите в кадр 2 слоя actions и удалите весь имеющийся код. Затем создайте переменную для корневого узла нашего документа, после чего создайте другую переменную, в которой будут содержаться дочерние узлы корня.
//the root node is the messagelist node. It will be the first К// (and only) node in the XML document var rootNode = myVars_obj.firstChild; //the nodes that we are interested in are the children of the root К//node. This is the array that holds all the message nodes. var messageArray = rootNode.childNodes;
- Введите следующий код для того, чтобы counter содержал номер одного из наших узлов сообщений. Если счетчик вышел за пределы допустимого, установите его обратно на значение 0.
//if we've gone through all of our messages then start over if (counter>=messageArray.length) { counter = 0; }
- Создайте переменную, в которой будет содержаться сам узел сообщения.
//get the current message node from the array of message nodes var messageNode = messageArray[counter];
- Вспомните, что любой текст, не являющийся узлом элемента в документе XML, является текстовым узлом. Используйте следующий код для получения текстового узла из узла сообщения.
//get the text node in the current message node var textNode = messageNode.firstChild;
- Ниже приведен последний фрагмент кода. Установите сообщение на текст внутри текстового узла.
//set the marquee to the value of the text node in the current //message node. message = textNode.nodeValue;
- Наконец, убедитесь, что message3.xml (на компакт-диске) находится в той же директории на вашем жестком диске, что и файл marquee_revisited.fla, и запустите фильм.
Все остальные изменения проводить необязательно. Все будет работать точно так же, как и в упражнении "Интеграция динамических данных" - динамический текст будет "скользить" из правой части экрана. Разница здесь заключается в использованном источнике информации.
Теперь рассмотрим более сложный материал, прибегнув на этот раз к помощи PHP.