Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.09.2009, 12: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 в 15:40.
Ответить с цитированием
  #2 (permalink)  
Старый 22.09.2009, 12:17
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

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

Лаконичный ответ :-).
И никаких вариантов обхода ( читай – шаманство с бубном ) этого "Нет" не существует?
Ответить с цитированием
  #4 (permalink)  
Старый 22.09.2009, 19:25
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

tenshi, разве нет?

alexeews, вот здесь что-то вроде есть (в самом конце) : http://htmlcoder.visions.ru/JavaScript/?22
А еще лучше в том же Jquery полазить.
Ответить с цитированием
  #5 (permalink)  
Старый 22.09.2009, 22:09
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

нет
__________________
.ня
Ответить с цитированием
  #6 (permalink)  
Старый 23.09.2009, 08:09
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

tenshi, может обоснуешь, почему нет?
Ответить с цитированием
  #7 (permalink)  
Старый 23.09.2009, 19:49
Интересующийся
Отправить личное сообщение для alexeews Посмотреть профиль Найти все сообщения от alexeews
 
Регистрация: 28.09.2008
Сообщений: 12

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

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

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

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

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

Последний раз редактировалось alexeews, 23.09.2009 в 19:56.
Ответить с цитированием
  #8 (permalink)  
Старый 23.09.2009, 20:09
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Лучше использовать тогда onpropertychange.
Ответить с цитированием
  #9 (permalink)  
Старый 23.09.2009, 20:38
Интересующийся
Отправить личное сообщение для alexeews Посмотреть профиль Найти все сообщения от alexeews
 
Регистрация: 28.09.2008
Сообщений: 12

Возможно, хотя это уже не принципиально.
Ответить с цитированием
  #10 (permalink)  
Старый 23.09.2009, 20:39
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Люди, помогите адаптировать скрипт под Оперу KiLLk Opera, Safari и др. 1 01.06.2009 00:05
Как писать скрипты под Opera? ucsus (X)HTML/CSS 2 15.04.2009 12:07
Верстка под КПК demi (X)HTML/CSS 6 31.01.2009 10:33
GetVariable (flash) не работает под FireFox Vodan Общие вопросы Javascript 2 21.12.2008 16:26
Выезжание таблицы из под ниоткуда. lancer Элементы интерфейса 3 29.06.2008 14:03