Опубликован: 07.11.2006 | Уровень: специалист | Доступ: свободно
Лекция 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 и оставить значение в массиве в виде единственной ссылки на этот объект.

Игорь Хан
Игорь Хан
След не остается
Александр Коргапольцев
Александр Коргапольцев
Вопрос по содержанию лекции №2, курс Flash MX Studio
Михаил Васильев
Михаил Васильев
Россия, г. Санкт-Петербург