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

XML

  1. Даем команду fileStructDoc на загрузку contents.php. Сценарий onLoad вызваем после загрузки.
    fileStructDoc.load ('contents.php');
  2. Добавляем функциональность как открытым, так и закрытым директориям и закрываем уже открытые директории для поддержки взаимодействия с пользователем.
    function toggleDirectory(item, index) {
      //isOpen is an attribute that we add when we open a 
      К//directory. It will be null to start 
      if (item.attributes.isOpen == 'true') {
    
        //user must click twice in order to close a directory 
        if (lastDirectorySelected == item) { 
          closeDirectory(item, index);
        } 
      } else {
        openDirectory(item, index); 
      }
    
      //keep track of user's last selection 
      lastDirectorySelected = item; 
    }
  3. Далее добавляем функциональность, которая будет поддерживать открытие директорий с помощью функции openDirectory.
    function openDirectory(item, index) { 
      item.attributes.isOpen = 'true'; 
      for (var i = 0; i<item.childNodes.length; i++) {
        var node = item.childNodes[i];
        var name = node.attributes.name;
  4. Теперь добавляем узлы категорий в список directories, выделяя заголовки по мере их углубления в структуру директорий. Цикл for в функции начинает работу на уровне узла из массива item.childNodes. Затем он переходит к его родительскому узлу, затем к родительскому узлу этого узла и т.д. до тех пор, пока не достигнет корневого узла с именем NAVIGATION. При каждой итерации он выделяет отступом запись, которая будет добавлена: чем глубже находится узел, тем больше будет смещена запись.
    if (node.nodeName == 'CATEGORY') { 
      //go up until we find the root
      for (var tempNode = item.childNodes[i]; tempNode.nodeName!=
      К'NAVIGATION'; tempNode = tempNode.parentNode) {
        //indent the entry
        name = ' ' + name; 
      }
  5. Здесь мы располагаем наш узел на следующей позиции в списке директорий.
    index++;
          directories.addltemAt(index, name, node); 
        } 
      } 
    }
  6. Вводим код для закрытия директорий функцией closeDirectory.
    function closeDirectory(item, index) 
      { item.attributes.isOpen = 'false';
  7. Сначала проходим через каждый элемент, являющийся подкатегорией закрываемого.
    for(var i = 0; item == item.childNodes[i].parentNode; i++) { 
      var node = item.childNodes[i]; 
      var name = node.attributes.name;
  8. Удаляем все подкатегории перед удалением категории рекурсивным вызовом функции closeDirectory.
    if(node.attributes.isOpen == 'true') { 
          closeDirectory( node, index + 1)
        }
        directories.removeItemAt(index + 1);
      } 
    }
  9. Выполняем инициализацию списка files в функции для поддержки ввода пользователем, когда он происходит.
    files.setChangeHandler('handleFilesSelection'); 
    function handleFilesSelection(component) {
      var item = component.getSelectedltem().data;
      updatePath(item.parentNode);
      var name = item.attributes.name;
      var extension = item.attributes.extension;
      url = path + name + ' . ' + extension;
      getURL(url, '_blank');
    }

    Поддержку файлов можно осуществлять многими способами. Можно загружать JPG и SWF в текущий фильм, либо загружать документы XML в другой объект XML, однако, для простоты, мы загружаем все файлы в новое окно браузера.

  10. Нужно создать функцию для поддержки добавления любых файлов, которые могут существовать в данной категории.
    function displayFiles (item) {
  11. Начнем с чистого листа.
    files.removeAll(); 
      Обрабатываем каждый из полученных узлов.
    for( var i = 0; i < item.childNodes.length; i++) {
      var node = item.childNodes[i]; 
      var name = node.attributes.name; 
      var extension = node.attributes.extension;
      Добавляем их в список files, если это файлы.
        if (node.nodeName == 'FILE') {
          files.addltem(name + ' .' + extension, node); 
        } 
      } 
    }
  12. Наконец, нам необходима функция для отслеживания пути выбранной директории из той директории, в которой мы находимся в данный момент. Цикл for в функции выступает в том же качестве, что и код смещения, рассмотренный в шаге 13. Он начинает работу с уровня выбранного узла и затем идет вверх до достижения корневого узла. Для каждого встречающегося узла он строит путь из корня к выделенному элементу.
    function updatePath(selectedNode) { 
      //first clear the path 
      path = ' ';
    
      //go up until we find the root
      for (var tempNode = selectedNode; tempNode.nodeName !=
      К'NAVIGATION'; tempNode = tempNode.parentNode) {
    //prepend the parent root name and a slash to the front
        К//of the path
        path = tempNode.attributes.name + V + path; 
      } 
    }

Вот и все! Ваш фильм Flash должен выглядеть примерно так.


Разумеется, фильм будет отображать содержимое папок вашего компьютера, а не то, что показано на рисунке. Помните, что запускать его нужно с сервера, и запускать так, чтобы работал PHP-сценарий. Несомненно, вы можете изменить и настроить результат вашей работы согласно вашим нуждам и требованиям. После вам уже не придется снова к этому возвращаться. Единственное, что вам понадобится делать для управление содержимым - это добавлять или удалять директории или файлы.

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

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

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

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

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