Лого Флэша Потрошителя
 
Новости · Статьи · Прототипы · Компоненты · Персоналии · Глоссарий · Идеальный клип · Что делать  

_level0 против _root

24.07.2002 25.10.2002

"Объясните, есть ли разница
между _level0  и _root,
и если есть, то какая?"
Часто задаваемый вопрос

Чистота стиля: теория и практика

Определение _levelN:
Глобальное свойство проигрывателя Flash Player для хранения ссылки на главную временную диаграмму .swf-документа, загруженного на уровень N проигрывателя. Синоним термина "мувиклип".

Определение _root:
Свойство .swf-документа, хранящее ссылку на его главную временную диаграмму.

Разница состоит в том, что ссылка _root уникальна, но только в рамках содержащего ее .swf-файла. А ссылка _levelN глобальна в пределах проигрывателя и может указывать на главные временные диаграммы (таймлайны) разных .swf-документов.

Рассмотрим распространенный случай, когда в проигрыватель загружен только один(!) документ, например пусть это будет "a.swf". В этом случае и _root, и _level0, используемые внутри этого документа, указывают на одно и то же место. Почему? Потому, что документ всегда загружается на первый свободный уровень проигрывателя; а в данном случае это нулевой уровень, так как на момент загрузки "a.swf" проигрыватель был пуст. Рассмотрим код в документе "a.swf":

_root.stop(); // Смысл: остановить движение на главном таймлайне .swf-документа, содержащего данную строку кода.
Этот документ — "a.swf"

_level0.stop(); // Смысл: остановить документ (клип), загруженный на нулевой уровень проигрывателя.
Этот клип — "a.swf"

Обе строки кода в этом примере дают одинаковые результаты, обладая при этом различными внутренними смыслами. Здесь кроется источник неприятностей, потому что:

Если клип "a.swf" будет загружен не на нулевой уровень проигрывателя, то выполнение первой строки кода в вышеприведенном примере даст результат, отличный от результата выполнения второй строки. Первая строка будет выполняться успешно, так как ссылка _root продолжает указывать на главный таймлайн содержащего ее документа "a.swf". Результат выполнения второй строки непредсказуем и зависит от содержания документа, загруженного на нулевой уровень проигрывателя. Такой код нельзя назвать переносимым.

И это — только начало разговора о мобильности кода. Следующая тема этого разговора — _root против _parent. Откажитесь и от _root, используйте только относительную адресацию.

Немного истории

Поддержка _levelN появилась в третьей версии проигрывателя, а _root — в пятой. В четвертой версии был заменитель _root в виде символа "/" (есть гурманы, употребляющие его до сих пор), но это быстро закончилось с появлением в Flash 5 точечной нотации путей, пришедшей на смену слэш-нотации.

C появлением Flash 3 появилась и возможность грузить разные .swf на разные _level, говорить им "stop" или "play", и т.д. — это был прорыв того времени. Первопроходцы Flash 3 использовали _levelN на все сто процентов, пока не произошел следующий революционный шаг вперед[1] — возможность вкладывать в любой мувиклип .swf-документа до 16 000 слоев, на которые можно загружать другие .swf-документы, что до этого мог позволить себе только Flash Player. А теперь — любой мувиклип может содержать в себе множество слоев, на каждом из которых можно разместить множество мувиклипов, содержащих собственные множества слоев — до 16 000 уровней вложенности![2]. И зачем ограничивать свой код использованием _levelN, если можно загружать все, что нужно, в свои клипы?

Вывод

Если в коде присутствует ссылка типа _level1, это указывает на недостаточную продуманность работы. Какой-то клип разработчику пришлось просто "впихнуть" на свободный уровень (_level1) поверх уже имеющихся, это следствие лени или неопытности. Вместо загрузки новых клипов на свободные уровни проигрывателя, спроектируйте для них место в своем документе, — и вы будете знать, что и где происходит с вашими клипами.

Чистота вашего стиля неотделима от ясности используемых методов.

Отказ от _levelN избавляет от путаницы, связанной с непониманием различий между _root и _level0, а это случается и с опытными флэшерами. Не всегда можно предсказать, в каком контексте будет употреблен однажды написанный вами код, и что произойдет в случае его переноса в другую иерархию.

Читайте также: "Стандарты ActionScript: _root против _global".

[новое окно]>

Дэдлайн

 

Примечания:
[1] Происходила эта революция весьма постепенно, Macromedia, наверное, не подозревала, как далеко все может зайти :)
[2] Очевидно, число 16 000 является магическим для Macromedia — это и максимальное количество кадров в одном таймлайне, и максимальное количество символов в одной библиотеке, и много чего еще — они сами об этом довольно подробно пишут.


Статус документа
: в процессе
>>> Статьи · Прототипы · Компоненты · Персоналии · Глоссарий · Что делатьНаверх
  © Разработка: Ростислав Сирык · О проекте "Флэш Потрошитель" · Архивы сайта
Flash MX

Стандарты Actionscript

Внутренняя архитектура Actionscript

Атрибуты тэгов OBJECT и EMBED

Метод LoadVars.decode

Свойство Stage.showMenu

System.security.allowDomain

System.showSettings

Динамическое присоединение компонентов

onKeyDown против onClipEvent(keyDown)

Модель событий Flash MX

ASBroadcaster — ядро модели событий Flash MX

Чтение ID3-тэгов из файла .mp3

ASSetPropFlags — функция защиты свойств объектов

Объект Local SharedObject

Удаление Local SharedObject

Глобальный путь к классам

Level против root

Dreamweaver

Создаем расширение для Dreamweaver MX

Настройка Dreamweaver MX

Длинное тире, короткое тире, дефис. Правописание и Dreamweaver

Illustrator

Растеризация текста
FlexiPedia