у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет. Вопрос знатокам, что не так? |
Движемся дальше
- Чтобы увидеть все это, создадим цикл, проходящий все параметры объекта.
function parseMe() { } function parseMe() { for (var i in this) { trace ("property - "+i+" : value - "+this[i]); } }
Этот цикл будет возвращать в окне Output следующий результат.
Итак, с помощью функции parseMe нам нужно перейти к узлу pictures и пройти циклом через его дочерние узлы (узлы picture), выбирая атрибуты каждого изображения и сохраняя их в массиве.
При вызове функции parseMe мы находимся внутри документа XML в корне документа, т.е. на уровень выше узла pictures.
Для обращения к узлу изображений вводим следующее.
this.firstChild;
Это выражение ссылается на первый дочерний узел главного узла. Теперь узлы каждого отдельного изображения сохраняются внутри массива childNodes узла pictures - это узлы, существующие в иерархии внутри узла pictures. Для обращения к этому массиву вводим следующее. Это выражение ссылается на первый дочерний узел главного узла. Теперь узлы каждого отдельного изображения сохраняются внутри массива childNodes узла pictures - это узлы, существующие в иерархии внутри узла pictures. Для обращения к этому массиву вводим следующее.
this.firstChild.childNodes;
- Это и есть массив, который мы будем обрабатывать циклом, поэтому нужно настроить сам цикл примерно так.
function parseMe() { var pictures = this.firstChild.childNodes; // loop through child nodes for (var i in pictures) { populate the array } }
- Внутри цикла каждым отдельным узлом рисунка будет pictures[i]. Информация, которую мы хотим получить, содержится внутри объекта attributes узла picture. Этот объект является стандартным объектом с параметром для каждого из атрибутов, поэтому мы можем просто копировать его в массив с использованием Array.push, чтобы он добавлялся в конец массива.
function parseMe() { var pictures = this.firstChild.childNodes; for (var i in pictures) { var obj = pictures[i].attributes; pictureObjects.push(obj); } }
- Можно сократить.
function parseMe() { var pictures = this.firstChild.childNodes; for (var i in pictures) { pictureObjects.push(pictures[i].attributes); } }
Проблема заключается в том, что мы не создаем новый объект в массиве, а просто создаем ссылку на объект attributes в объекте XML. Если объект attributes в узле XML изменится, то же самое произойдет и с объектом в нашем массиве.
- Посмотрите на этот код и приведите ваш код в соответствие.
function parseMe(){ var pictures = this.firstChild.childNodes; for (var i in pictures) { pictureObjects.push(pictures[i] .attributes); } // add an attribute "hello" to the first childNode this.firstChild.childNodes[0].attributes.hello = true; }
- Теперь запустите код и выберите Debug > List Variables. В нашем массиве отобразится значение hello.
- Чтобы предотвратить это, будем обрабатывать объект attributes и копировать все параметры.
function parseMe() { // this is the entire document // this.firstChild is the first node, ie our pictures node // this firstChiId.childNodes is the list of individual documents var pictures = this.firstChild.childNodes; for (var i in pictures) { var obj = {}; // loop through and copy attributes for (var j in pictures[i].attributes) { obj [j] = pictures [i] .attributes [j]; } pictureObjects.push(obj); } this.firstChild.childNodes[0].attributes.hello = true; }
- Сохраните файл под именем bringInXML.fla и при его запуске выберите List Variables. hello больше не отображается в массиве.
В данном случае это не очень важно, так как мы не собираемся в дальнейшем осуществлять управление документом XML, но нужно понимать, что происходит, когда объекты определяются посредством ссылки на другие объекты, а не в своих собственных терминах. Наш исходный массив содержал только указатель на объект атрибутов в узле XML, так что мы просто скопировали в него все параметры. Другой способ - удалить объект myXml, чтобы разрушить исходный объект attributes и оставить значение в массиве в виде единственной ссылки на этот объект.