Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3398 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 6:

Движемся дальше

  1. Чтобы увидеть все это, создадим цикл, проходящий все параметры объекта.
    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;
  2. Это и есть массив, который мы будем обрабатывать циклом, поэтому нужно настроить сам цикл примерно так.
    function parseMe()  {
            var pictures = this.firstChild.childNodes;
            // loop through child nodes
            for (var i in pictures) {
                populate the array
            }
        }
  3. Внутри цикла каждым отдельным узлом рисунка будет 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);
            }
        }
  4. Можно сократить.
    function parseMe() {
            var pictures = this.firstChild.childNodes;
            for (var i in pictures) {
                pictureObjects.push(pictures[i].attributes);
            }
        }

    Проблема заключается в том, что мы не создаем новый объект в массиве, а просто создаем ссылку на объект attributes в объекте XML. Если объект attributes в узле XML изменится, то же самое произойдет и с объектом в нашем массиве.

  5. Посмотрите на этот код и приведите ваш код в соответствие.
    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;
        }
  6. Теперь запустите код и выберите Debug > List Variables. В нашем массиве отобразится значение hello.

  7. Чтобы предотвратить это, будем обрабатывать объект 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;
        }
  8. Сохраните файл под именем bringInXML.fla и при его запуске выберите List Variables. hello больше не отображается в массиве.

    В данном случае это не очень важно, так как мы не собираемся в дальнейшем осуществлять управление документом XML, но нужно понимать, что происходит, когда объекты определяются посредством ссылки на другие объекты, а не в своих собственных терминах. Наш исходный массив содержал только указатель на объект атрибутов в узле XML, так что мы просто скопировали в него все параметры. Другой способ - удалить объект myXml, чтобы разрушить исходный объект attributes и оставить значение в массиве в виде единственной ссылки на этот объект.

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip?