"Объясните, есть ли разница
между _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".
[новое окно]>