Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.11.2010, 19:40
Sylon вне форума Посмотреть профиль Отправить личное сообщение для Sylon Найти все сообщения от Sylon
  № 1  
Ответить с цитированием
Sylon

Регистрация: 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:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 07:50.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.