Обе модели обработки событий, DOM Level 2 и IE, позволяют искусственно соз_ давать объекты событий и отправлять их обработчикам событий, зарегистриро_ ванных в элементах документа. В сущности, этот прием используется броузера_ ми для вызова обработчиков событий, зарегистрированных в элементах (и в слу_ чае всплывающих событий обработчиков, зарегистрированных в элементах_ предках). В модели обработки событий DOM Level 0 потребность в искусствен_ ных событиях не так велика, поскольку обработчики событий доступны через различные свойства обработчика. Однако в развитых моделях обработки собы_ тий нет возможности получить список обработчиков, зарегистрированных с по_ мощью addEventListener() или attachEvent(), поэтому обработчики могут быть вызваны только с использованием приема, демонстрируемого в этом разделе.
В модели обработки событий DOM искусственное событие создается методом Do_ cument.createEvent(), инициализация события происходит методом Event.init_ Event(), UIEvent.initUIEvent() или MouseEvent.initMouseEvent(), а отправка – мето_ дом dispatchEvent() узла, которому это событие отправляется. В модели обработ_ ки событий IE новый объект события создается методом Document.createEventOb_ ject и затем отправляется методом fireEvent() целевого элемента. В примере 17.8 демонстрируется порядок использования этих методов. Он определяет не зави_ сящую от платформы функцию, которая отправляет искусственные события ти_ па dataavailable, а также функцию, которая регистрирует обработчики событий этого типа.
Важно понимать, что искусственные события, отправляемые методом dispatch_ Event() или fireEvent(), не ставятся в очередь для последующей асинхронной об_ работки. Они доставляются немедленно, и их обработчики вызываются синхрон_
17.7. Искусственные события
но еще до того, как dispatchEvent() и fireEvent() вернут управление. Это означа_ ет, что искусственные события не могут использоваться для отложенного испол_ нения программного кода, когда броузер выполнит обработку всех ожидающих событий. Для этого необходимо вызвать метод setTimeout() со значением време_ ни задержки равным нулю.
Существует возможность синтезировать и отправлять низкоуровневые события ввода, такие как события мыши, но реакция элементов документа на эти собы_ тия точно не определена. Как правило, полезнее использовать эти возможности для организации высокоуровневых семантических событий, для которых в бро_ узерах не предусматриваются действия по умолчанию. По этой причине в при_ мере 17.8 задействован тип событий dataavailable.
Пример 17.8. Отправка искусственных событий
/**
* DataEvent.js: отправляет и принимает события ondataavailable.
*
* Этот модуль определяет две функции, DataEvent.send() и DataEvent.receive(),
* с помощью которых выполняются отправка искусственных событий dataavailable
* и регистрация обработчиков этих событий. Программный код написан так, чтобы
* работать в броузере Firefox и других DOM_совместимых броузарах, а также в IE.
*
* Модель обработки событий DOM позволяет искусственно генерировать события
* любого типа, но модель обработки событий IE поддерживает искусственные
* события лишь предопределенных типов. События dataavailable относятся
* к наиболее универсальному предопределенному типу, поддерживаемому IE,
* именно потому они здесь используются.
*
* Обратите внимание: отправка события методом DataEvent.send() не означает,
* что событие будет поставлено в очередь на обработку, как это происходит
* с реальными событиями. Вместо этого зарегистрированные обработчики
if (typeof target == "string") target = document.getElementById(target);
// Создать объект события. Если создать его невозможно, просто вернуть управление if (document.createEvent) { // Модель событий DOM
// Создать событие с заданным именем модуля событий.
// Для событий мыши используется "MouseEvents". var e = document.createEvent("Events");
// Инициировать объект события, используя метод init заданного модуля.
// Здесь указываются тип события, способность к всплытию
// и признак невозможности отмены.
452 Глава 17. События и обработка событий
// См. описание Event.initEvent, MouseEvent.initMouseEvent и UIEvent.initUIEvent e.initEvent("dataavailable", true, false);
}
else if (document.createEventObject) { // Модель событий IE // В модели событий IE достаточно вызвать простой метод var e = document.createEventObject();
}
else return; // В других броузерах ничего не делать
// Здесь к объекту события добавляются нестандартные свойства.
// Кроме того, необходимо определить значения существующих свойств. e.datatype = datatype;
e.data = data;
// Отправить событие заданному элементу.
if (target.dispatchEvent) target.dispatchEvent(e); // DOM
else if (target.fireEvent) target.fireEvent("ondataavailable", e); // IE
};
/**
* Регистрирует обработчик события ondataavailable в заданном элементе. */
DataEvent.receive = function(target, handler) {
if (typeof target == "string") target = document.getElementById(target); if (target.addEventListener)
target.addEventListener("dataavailable", handler, false); else if (target.attachEvent)