Добрый вечер (утро, день). Для начала небольшое отступление от темы. Как вы могли заметить,
оформление выпусков было каждый раз отличным, я думаю пока остановиться на текущем варианте.
Еще одно обстоятельство меня немного удивило. Выпуском рассылки я занялся впервые, я использую
в качестве почтового клиента The Bat, как оказалось поддержка html у него довольно сильно
страдает. Особая проблема с отступами. При желании конечно можно не использовать списки,
заголовки, или применить метод "тыка" и с помощью css подобрать все-таки приемлемые параметры.
Но я не стал этого делать, мне как-то в свое время хватило конфликтов браузеров, тем более
ради интереса я восстановил у себя Outlook Express, и посмотрел, как выглядят выпуски там
(естественно все в порядке, так как думается для отображения он использует ИЕ, отмечу, что
я не поклонник данного браузера). Так как все проблемы касаются отступов, то ничего страшного
в этом нет, разницу можете посмотреть самостоятельно. Я все это написал к тому, чтобы вы не
винили автора в кривизне рук. После всего этого вернемся к тематике рассылки. В последнем
выпуске мы положили начало обзора компонентов в Macromedia Flash, этим мы будем заниматься и
сегодня.
Компоненты пользовательского интерфейса представляют собой интерактивные средства, с помощью
которых пользователь взаимодействую с нашим приложением, выполняя определенные действия, т.е.
совершая события. Например, самое важное событие для кнопки, которое совершается это щелчок по
ней. В зависимости от ситуации может потребоваться выполнить определенные действия в ответ на
совершенное действие пользователя, т.е. выполнить определенный участок кода при возникновении
определенного события. Так как обработка события применяется не только для компонента Button,
но и почти для всех других компонентов, то рассмотрим данный вопрос более детально.
Во времена Flash 5 обработка событий была привязана к объектам, и код события должен был
введен в код кнопки (не компонента) или клипа. Данная концепция была неудачна и ее сменила
модель Генератор-Листенеры. Генератор это объект, который соответственно генерирует событие,
т.е. оповещает о его происхождении другим объектам. Для того чтобы сэкономить машинные ресурсы
оповещаться будут только те объекты, которые подписались на рассылаемый вид событий. Такие
объекты называются Листенеры. Такую модель можно сравнить с организацией работы рассылки - я
создаю ее выпуски, и тем самым являюсь объектом Генератором, а вы подписавшиеся на данную
рассылку ассоциируйтесь с объектами Листенеры. Задачей Листенера служит содержание того кода,
который должен выполниться при наступлении нужного события.
Ядром всей модели является не документируемый объект AsBroadcaster, он содержит 4 метода:
AsBroadcaster.initialize(obj), AsBroadcaster.addListener(listener),
AsBroadcaster.removeListener(listener), AsBroadcaster.broadcastMessage("Event", parameters).
Мы не будем подробно рассматривать данный объект, так как для наших целей будет служить класс
EventDispatcher, ограничимся небольшим комментарием к каждому методу. Метод initialize
регистрирует объект как генератор. Данная операция сводиться к переносу 3-ех оставшихся
методов на объект, и, кроме того, создается свойство _listeners, представляющее собой массив
Листенеров. Метод addListener служит для добавления нового Листенера, последний заносится
в массив _listeners. Для удаления Листенера служит метод removeListener. Оповещение
Листенеров производиться с помощью метода broadcastMessage, который на уровне реализации
просто вызывает метод объекта (поочередно из массива _listeners), передавая ему нужные
параметры.
В случае использования компонентов для организации работы описанного механизма событий
следует использовать специальный класс EventDispatcher. Обратимся к справочной документации и
посмотрим, что собой представляет данный класс.
Перевод: Using Components > Components Dictionary > EventDispatcher class
Класс EventDispatcher
Имя класса в ActionScript: mx.events.EventDispatcher
События позволяют узнавать приложению, когда пользователь взаимодействует с компонентами,
а также когда произошли важные изменения как, например создание, уничтожение, или изменение
размеров компонента.
Методы класса EventDispatcher позволяют добавлять и удалять Листенеры для событий, которым
должен быть сопоставлен определенный код. Например, с помощью метода
EventDispatcher.addEventListener можно зарегистрировать Листенер для компонента.
Объекты событий
Объект события передается Листенеру как параметр. Объект события - объект ActionScript,
который включает свойства содержащие информацию о произошедшем событии. Можно использовать
объект события в вызываемой функции Листенера, для получения доступа к названию события или
имени экземпляра компонента, который генерирует событие. Например, следующий код использует
свойство target объекта evtObj, для доступа к свойству label кнопки, которая генерирует событие
click:
listener = new Object();
listener.click = function(evtObj){
trace("The " + evtObj.target.label + " button was clicked");
}
myButton.addEventListener("click", listener);
Свойство
Описание
type
содержит тип (название) события
target
указатель на компонент генерирующий событие
Методы класса EventDispatcher
Доступно с версии 6.0 79.0
EventDispatcher.addEventListener(event, listener)
Параметры:
event - строка с именем события listener - указатель на объект Листенер или функцию
Описание:
Метод регистрирует объект Листенер для события компонента. Листенером может быть объект или
функция. В случае использования объекта он должен содержать метод, имя которого совпадает с
названием события. Можно зарегистрировать несколько Листенеров на одно и тоже событие, используя
метод addEventListener() для каждого Листенера.
EventDispatcher.dispatchEvent(eventObject)
Параметры:
eventObject - указатель на объект события, который должен содержать краткое название
события (type). Также в нем обычно присутствует свойство, содержащее указатель на объект (компонент)
генератор (target). В состав объекта могут входить другие свойства, включающие необходимую
информацию для обработки события.
Описание:
Метод сообщает о произошедшем событии его Листенерам.
Пример:
Следующий пример посылает событие click: dispatchEvent({type:"click"});
Метод обратный addEventListener, имеющий аналогичные параметры, и снимающий статус Листенера
с объекта в соответствии с указанным событием.
Таким образом, метод addEventListener добавляет в определенный массив (_listeners), где хранятся
Листенеры, объекта генератора, передаваемый в параметр указатель на Листенер. Метод dispatchEvent
на основании данного массива вызывает соответствующий метод Листенера, который является нужной нам
реакцией на событие. В случае необходимости можно удалить обработку события, воспользовавшись
методом removeEventListener, который удаляет Листенер из массива. Главной особенностью использования
класса EventDispatcher от объекта AsBroadcaster является регистрация Листенера на определенный вид
события, а не на все события объекта Генератора.
Нам был продемонстрирован пример обработки события click, мы немного упростим его, оставив вывод
фиксированного текста, и посмотрим, какой вид синтаксиса у нас есть в распоряжении.
Создаем новый объект и делаем его Листенером события click:
Можно для этих же целей использовать временную шкалу:
function click() {
trace("Hello!");
}
myButton.addEventListener("click", _root);
В качестве указателя передается не объект, а имя функции:
function hello(){
trace("Hello!");
}
myButton.addEventListener("click", hello);
Аналогичное использование функции, но в сокращенном формате:
myButton.addEventListener("click", function () {trace("Hello!");});
Какой вариант следует использовать, думаю не принципиально, все зависит от ситуации. Куда более
важно понять саму идею механизма Генератор-Листенеры. Более полную информацию по данной тематике
вы найдете в справочной системе, или книге посвященной языку ActionScript. Сегодняшний выпуск
подошел к концу, следующий раз мы обязательно вернемся к компоненту Button и рассмотрим все его
методы и свойства. До встречи...