Генерация пользовательских событий под 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, разве нет?
alexeews, вот здесь что-то вроде есть (в самом конце) : http://htmlcoder.visions.ru/JavaScript/?22 А еще лучше в том же Jquery полазить. |
нет
|
tenshi, может обоснуешь, почему нет?
|
Во первых спасибо всем откликнувшимся. :thanks:
Во вторых Как это не прискорбно, но tenshi оказался прав, IE не умеет создавать нестандартные события. (плюс ему за это). Почему не умеет – потому, что метод fireEvent выбрасывает исключение при попытке передать ему любое нестандартное имя события ( в моём случае onhome ). Однако решить проблемку всё таки можно. Итак, как было сказано в каком-то мультфильме (название не помню) «А без костылика то, нам ребятки ХАНА!!!» В качестве такого «костылика» можно сделать следующие: Выбрасываем любое высокоуровневое событие (для которого в браузере не предусмотрено никаких действий по умолчанию). К примеру ondataavalible. И пользуясь тем, что событие является обычным объектом добавляем к нему свойство, к примеру event_type, а в обработчике в зависимости от того, установлено это свойство или нет либо обрабатываем событие ondataavalible (если event_type не установлено) или передаём управление обработчику “нестандартного” события. (в моём случае обработчику события onhome). |
Лучше использовать тогда onpropertychange.
|
Возможно, хотя это уже не принципиально.
|
Принципиально. Тут не нужно будет генерировать никаких событий. Достаточно изменить любое свойство.
|
Часовой пояс GMT +3, время: 01:26. |