|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Nov 2009
Сообщений: 16
|
Поймать onmouseup за пределами окна браузера в IE
Собственно вопрос, а возможно ли?
IE передаёт флешке события мыши только пока мышь в пределах этой флешки. Если за пределами - только через жаваскрипт. Проблема в следующем - если мышь нажата на флешке и отпущена за её пределами - onmouseup не получает ни флешка, ни жаваскрипт. Получить координаты за пределами флешки и даже за пределами окна не проблема: в JavaScript включаем document.body.setCapture() - при этом onmousemove будут приходить со всего экрана. А вот onmouseup бесследно теряется. Теоретически, можно вообще все события всегда ловить с включенным захватом и передавать флешке из жаваскрипта, но в флешке куча спрайтов сложной формы, которым нужны обработчики... высчитывать факт mouseover/mouseout для каждого - проще застрелиться сразу... А сделать так, чтобы событие получала и флешка, и жаваскрипт - не выходит. конкретное применение - малоразмерная флешка типа бегущей строки, в которой можно её прокручивать преретаскиванием мышью. Если бросать сразу же при выходе за пределы флешки - пользоваться крайне неудобно, поскольку размер флешки - 200px, а размер прокручиваемого содержимого - почти 2000. Засада в основном с IE. Нормальные браузеры продолжают передавать флешке события - если нажатие было на ней - при любых перемещениях мыши, пока нажата кнопка. Добавлено через 6 часов 11 минут В общем, проблему решил. Правда всё грмоздко и некрасиво с точки зрения кода... Чтобы не ловить вручную события mouseOver/mouseOut для спрайтов хитрой формы, преключение обработки событий на JavaScript делается только при наведении мыши на перетаскиваемую область - благо она прямогугольная, и нет проблем вычислить по координатам факт выхода из ней мыши. Переключение инициирует флешка - через ExternalInterface.call Соответственно, флешку заставляем обрабатывать как самостоятельно полученные события, так и их имитацию, полученную через ExternalInterface.addCallback("extMoEvnt",eventImitator) var mouse_x=0; var mouse_y=0; var myFlashDragging=false; // true - Процесс перетаскивания var myFlashOver=false; // true - Mышь в области старта перетаскивания var mySwfObj=swfobject.getObjectById("mySwfObjectId"); // Объект-флешка - для использования ExternalInterface function getMouseXY(){ // упрощенный вариант: только для IE, для страницы без полноценных JavaScript-библиотек mouse_x=window.event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft; mouse_y=window.event.clientY+document.body.scrollTop+document.documentElement.scrollTop; } function myFlashLoseCapture(){ getMouseXY(); myFlashDragging=false; hdrDragElmOut("0"); sendXY("up"); } function myFlashMoDn(){ // onmousedown myFlashDragging=true; getMouseXY(); sendXY("down") } function myFlashMoMv(){ // onmousemove getMouseXY(); sendXY("move") } function myFlashMoUp(){ myFlashDragging=false; getMouseXY(); sendXY("up"); if(!myFlashOver)dragReleaseCap(); } function hdrDragElmOver(){ // ExternalInterface.call("hdrDragElmOver") // - мышь вошла в область старта перетаскивания myFlashOver=true; if(document.body.setCapture==undefined)return; // только для IE - а лучше отключать этот вызов для остальных браузеров внутри флешки document.body.setCapture(); // Переключаем обработку всех событи мыши на свой JavaScript document.body.onlosecapture=myFlashLoseCapture; document.onmousedown=myFlashMoDn; document.onmousemove=myFlashMoMv; document.onmouseup=myFlashMoUp; } function hdrDragElmOut(){ // ExternalInterface.call("hdrDragElmOut") // - мышь вышла из области старта перетаскивания myFlashOver=false; if(!myFlashDragging)dragReleaseCap(); } function dragReleaseCap(){ // Возврат обработки событий в нормальное состояние document.body.onlosecapture=null; document.onmousedown=null; document.onmousemove=null; document.onmouseup=null; document.body.releaseCapture(); } function sendXY(type){ // Передача инфы о событии во Flash try{mySwfObj.extMoEvnt(type,mouse_x,mouse_y)}catch(e){} } p.s. Прошу прощения, раздел для темы выбрал не слишком удачный. Хотя целевая проблема во флеше, решение больше сводится к жаваскрипту... Последний раз редактировалось Sylon; 30.11.2010 в 15:26. |
Часовой пояс GMT +4, время: 07:20. |
|
« Предыдущая тема | Следующая тема » |
|
|