Показать сообщение отдельно
  #1 (permalink)  
Старый 22.09.2009, 13:04
Интересующийся
Отправить личное сообщение для alexeews Посмотреть профиль Найти все сообщения от alexeews
 
Регистрация: 28.09.2008
Сообщений: 12

Генерация пользовательских событий под 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.

Последний раз редактировалось alexeews, 22.09.2009 в 16:40.
Ответить с цитированием