Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Генерация пользовательских событий под IE (https://javascript.ru/forum/css-html-internet-explorer/5167-generaciya-polzovatelskikh-sobytijj-pod-ie.html)

alexeews 22.09.2009 13:04

Генерация пользовательских событий под IE
 
Подскажите пожалуйста, пишу класс (по сути набор полезных функций). Задача одного из методов генерировать пользовательские события. (Метод __createEvent() ). Код класса приведён ниже ( к сожалению не весь, длина сообщения не позволяет ).

Класс:

/**
 * Метод создаёт искуственное событие.
 *
 * Помимо создания стандартных событий, метод даёт возможность создавать
 * собственные высокоуровневые, семантические события.
 *
 * @param: [DOM Object] item   - ссылка на объект, которому адресовано событие.
 * @param: [string] event_type - тип вновь созданного события:
 *                               (допустимые варианты) Events, MouseEvents, UIEvents
 * @param: [object] init       - Объект инициирующий событие:
 *                               Параметры:
 *                                 Дополнительные араметры устанавливаемые на событие:
 *                                     [object] event_data - обект дополнительных параметров
 *
 *                                 Для события типа Events:
 *                                     [string]  type       - имя события ( click, mouseup, focus... )
 *                                     [boolean] canbubble  - способность события к всплытию
 *                                     [boolean] cancelable - признак невозможности отмены соббытия
 *
 *                                 Для событий типа MouseEvents:
 *                                     [string]       type          - имя события ( click, mouseup, focus... )
 *                                     [boolean]      canBubble     - способность события к всплытию
 *                                     [boolean]      cancelable    - признак невозможности отмены соббытия
 *                                     [abstractView] view          - относиельно какой области произведён клик ( по умолчанию window )
 *                                     [int]          detail        - произведённое колличество кликов ( по умолчанию 1 )
 *                                     [int]          screenX,      - координата клика по оси X ( относительно экрана )
 *                                     [int]          screenY,      - координата клика по оси У ( относительно экрана )
 *                                     [int]          clientX,      - координата клика по оси X ( относительно рабочей области )
 *                                     [int]          clientY,      - координата клика по оси У ( относительно рабочей области )
 *                                     [boolean]      ctrlKey       - указатель удерживания кнопки Ctrl
 *                                     [boolean]      altKey        - указатель удерживания кнопки Alt
 *                                     [boolean]      shiftKey      - указатель удерживания кнопки Shift
 *                                     [boolean]      metaKey       - указатель удерживания кнопки
 *                                     [short]        button        - номер нажатой кнопки мыши
 *                                     [EventTarget]  relatedTarget - объект в котором произведён клик
 *
 *                                  Для событий типа UIEvents:
 *                                     [string]     type       - имя события ( click, mouseup, focus... )
 *                                     [boolean]    canbubble  - способность события к всплытию
 *                                     [DOM Object] view       - абстрактное отображение асоциирующиеся с событием ( по умолчанию window )
 *                                     [int]        detail     - произведённое колличество кликов ( по умолчанию 1 )
 *
 * @return bool;
 */
 baseObject.prototype.__createEvent = function( item, event_type, init ) {
     var eObj  = null;
     var init  = init || {};

     ( event_type == 'MouseEvent' ) ? init.type = init.type || 'click' :
                                      init.type = init.type || 'focus';

     init.canbubble     = init.canbubble     || true,
     init.cancelable    = init.cancelable    || true,
     init.view          = init.view          || window,
     init.detail        = init.detail        || 1,
     init.screenX       = init.screenX       || 0,
     init.screenY       = init.screenY       || 0,
     init.clientX       = init.clientX       || 0,
     init.clientY       = init.clientY       || 0,
     init.ctrlKey       = init.ctrlKey       || false,
     init.altKey        = init.altKey        || false,
     init.shiftKey      = init.shiftKey      || false,
     init.metaKey       = init.metaKey       || false,
     init.button        = init.button        || false,
     init.relatedTarget = init.relatedTarget || window

     try {

         if ( ( typeof item != 'object' ) ||
              ( typeof event_type != 'string' ) ||
              ( typeof init != 'object' )
            ) throw this.__setError( 'TYPE_ERROR', 'baseObject::__createEvent()' );

         this.__print_r( eObj );

         if ( document.createEvent ) {

             eObj = document.createEvent( ( event_type + 's' ) );
             //this.__print_r( eObj );
             alert( eObj );
             switch( event_type ) {

               case 'Event'      : eObj.initEvent( init.type, init.canbubble, init.cancelable ); break;
               case 'MouseEvent' : eObj.initMouseEvent( init.type, init.canbubble, init.cancelable, init.view, init.detail, init.screenX, init.screenY, init.clientX, init.clientY, init.ctrlKey, init.altKey, init.shiftKey, init.metaKey, init.button, init.relatedTarget ); break;
               case 'UIEvent'    : eObj.initUIEvent( init.type, init.canbubble, init.view, init.detail ); break;
             }

         } else {
             eObj = document.createEventObject();
             for ( var i in init ) {
                 eObj[i] = init[i];
             }
         }

         if ( !eObj.event_data )
             eObj.event_data = init.event_data || {};

         this.__print_r( eObj );

         ( item.dispatchEvent ) ? item.dispatchEvent( eObj ) :
                                  item.fireEvent( ( 'on' + init.type ), eObj );

     } catch ( e ) {
         this.__error = e;
         return false;
     }
 };


Полный код класса и примера HTML – во вложении.
Так вот, код замечательно работает в FF и Opera ( сообщение EVALIBL EVENT!!!! стабильно выводится ), но в IE упорно не работает. Если меняем имя событие на стандартное ( в искоднике примера нужно раскоментить
//bObj.__createEvent( item, 'MouseEvent', {type:'mousedown'} );
строку и закоментировать
bObj.__createEvent( item, 'Event', {type:'home'} );
) То работает в обоих браузерах.

Так вот вопрос.
Можно ли создать произвольное событие в IE.

tenshi 22.09.2009 13:17

нет

alexeews 22.09.2009 16:31

Лаконичный ответ :-).
И никаких вариантов обхода ( читай – шаманство с бубном ) этого "Нет" не существует?

Riim 22.09.2009 20:25

tenshi, разве нет?

alexeews, вот здесь что-то вроде есть (в самом конце) : http://htmlcoder.visions.ru/JavaScript/?22
А еще лучше в том же Jquery полазить.

tenshi 22.09.2009 23:09

нет

Riim 23.09.2009 09:09

tenshi, может обоснуешь, почему нет?

alexeews 23.09.2009 20:49

Во первых спасибо всем откликнувшимся. :thanks:

Во вторых
Как это не прискорбно, но tenshi оказался прав, IE не умеет создавать нестандартные события. (плюс ему за это).

Почему не умеет – потому, что метод fireEvent выбрасывает исключение при попытке передать ему любое нестандартное имя события ( в моём случае onhome ).

Однако решить проблемку всё таки можно.
Итак, как было сказано в каком-то мультфильме (название не помню) «А без костылика то, нам ребятки ХАНА!!!»

В качестве такого «костылика» можно сделать следующие:
Выбрасываем любое высокоуровневое событие (для которого в браузере не предусмотрено никаких действий по умолчанию). К примеру ondataavalible. И пользуясь тем, что событие является обычным объектом добавляем к нему свойство, к примеру event_type, а в обработчике в зависимости от того, установлено это свойство или нет либо обрабатываем событие ondataavalible (если event_type не установлено) или передаём управление обработчику “нестандартного” события. (в моём случае обработчику события onhome).

Kolyaj 23.09.2009 21:09

Лучше использовать тогда onpropertychange.

alexeews 23.09.2009 21:38

Возможно, хотя это уже не принципиально.

Kolyaj 23.09.2009 21:39

Принципиально. Тут не нужно будет генерировать никаких событий. Достаточно изменить любое свойство.


Часовой пояс GMT +3, время: 04:19.