TIPS OF FLASH: В ЛЕСУ РОДИЛАСЬ ЕЛОЧКА Iv (dembicki@narod.ru) Спецвыпуск Xakep, номер #026, стр. 026-104-3 TIPS 8 Не сноси авторов функций. В том, что ты пользуешь чужие функции, нет ничего позорного, скорее наоборот, умение использовать в своих целях бесплатные разработки других людей - серьезное достоинство любого программиста. Присваивать себе авторство чужих работ смешно и бессмысленно. Авторы функций указывают себя не для достижения всемирной славы, а для того, чтобы человек, использующий функцию, в случае обнаружения ошибки мог об этом ему сообщить, и если ошибка уже исправлена, то и получить исправленную версию. Ты не потерял тему за моими советами? Если нет, то продолжим. Зададим узлам уникальный идентификатор вот этой функцией: this.input_xml.addID = function() { var nod, i = 0; nod = this.firstChild; while (nod) { nod.attributes.ID = i++; nod = nod.nextNode(); } this.parseXML(this); }; Эту функцию мы можем написать после уже написанного скрипта, поскольку событие onLoad произойдет не ранее второго кадра. Вызываем эту функцию только в том случае, если произошла успешная загрузка xml и он не содержит синтаксических ошибок. А именно перед строкой trace(this). Заодно и изменим этот трейс, чтобы продемонстрировать возможность обращения к узлу xml через его ID: trace(this[0].attributes.header); В результате в окне вывода должны увидеть: "Анализ цен на елки". TIPS 9 В данном примере глубина вложенности узла не важна, поскольку у всех узлов она одинакова (за исключением первого). Однако при генерации различных меню структура и вложенность будут играть очень важную роль. Для определения глубины нужно добавить соответствующий счетчик в функции nextNode, который бы увеличивался при переходе на дочерние узлы и уменьшался при переходе на родительские. Значение глубины узла советую сохранить в самом узле как его атрибут. СОЗДАЕМ ОБЪЕКТЫ И КОПИРУЕМ В НИХ ДАННЫЕ ИЗ XML Итак, что мы имеем. К любому узлу можем обратиться через его идентификатор. Первый узел, содержащий все остальные узлы, имеет нулевой идентификатор. Давай это использовать. Создадим функцию, которая, имея на входе только идентификатор узла, добавит мувиклип на сцену и передаст атрибуты в переменные этого мувиклипа. Начнем опять с посещения www.layer51.com, а именно: http://www.layer51.com/proto/d.aspx?f=361 И возьмем там вот эту функцию: // (c) Ivan Dembicki 2002 dembicki@narod.ru XMLNode.prototype.copyAttributes = copyAttributes function copyAttributes (to) { var a = this.attributes; var b = eval(to); for (var vars in a) {b[vars] = a[vars];} } Поместим функцию в наше хранилище прототипов после функции nextNode. Затем создадим функцию добавления мувиклипов в указанное место: this.input_xml.addMCs = function(targ) { var mc, i; while (this[++i]) { mc = targ.attachMovie("el_mc", "el"+i+"_mc", i); this[i].copyAttributes(mc); mc._x = i*mc._width; mc._y = 400; mc._height = mc.price; } }; Вызовем функцию в событии onLoad (после вызова функции addID и трейса) с указанием, куда их размещать: this.addMCs(_root) delete this Теперь можно и тестануть. (Рис. 3) |