Управление правой кнопкой мыши во Flash (для IE)
Итак, допустим Вы хотите создать своё собственное контекстное меню, или
использовать правую кнопку мыши в ещё каких-то целях, или просто её вырубить
(совсем). В общем случае, с различными HTML-тэгами, это делается с помощью
события oncontextmenu. Однако в случае с флэшем это не проходит - как ни
старайся, а это событие, вообще говоря, присущее тэгу object, игнорируется. Из
самого флэша меню тоже полностью отключить нельзя. Поэтому будем извращаться
8-).
Для заготовки возьмём какой-нибудь флэш-мувик. Любой. На этом этапе
от него ничего не зависит. Просто нужно, чтобы он был. Теперь делаем
HTML-страничку, в которую и вставляем этот мувик. Что-то вроде
этого:
<div onMouseDown="killMenu()"> <object
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
width="300" height="300" id="rc"> <param
name="movie" value="rc.swf"> <param
name="quality" value="high"> <param
name="wmode"
value="transparent"> </object> </div>
Важным
здесь является значение параметра wmode. Его необходимо установить равным
transparent, так как только в этом случае срабатывает событие onMouseDown,
непосредственно используемое.
Далее пишем скрипт:
<script
language="JavaScript1.2"> function killMenu(){ if
(event.button == 2){ sendToFlash();
disableContext(); } } </script>
Если была нажата
правая кнопка мыши, то мы не даём появится стандартной менюшке и сообщаем
мувику, что пора бы показать своё. Нейтрализовать стандартное меню можно разными
способами, хотя бы просто написать всякую ерунду и тем самым вызвать ошибку в
скрипте. Очень удобно, если нет никаких других скриптов. Я покажу способ с
применением скрытых фрэймов.
Итак, пусть всё вышеизложенное является
частью главного фрэйма (mainFrame). В родительском документе между тэгами
</head> и </html> вставляем примерно следущее:
<SCRIPT
LANGUAGE="JavaScript1.2"> <!--
var dummy =
'<html><body></body></html>';
//--> </SCRIPT>
<frameset
cols="*,0" frameborder="NO" border="0"
framespacing="0"> <frame src="main.html"
name="mainFrame"> <frame src="javascript:
self.dummy" name="rightFrame" scrolling="NO"
noresize> </frameset>
Чтобы не создавать лишних файлов, мы
просто используем текстовую "пучтышку". Она нам ещё пригодиться.
Теперь возвращаемся к главному фрэйму и описываем функцию
disableContext():
function
disableContext(){ parent.frames[1].location.replace('javascript:
parent.dummy1'); parent.frames[1].back(); }
Первая строчка функции
создаёт новый документ в скрытом фрэйме с помощью всё той же пустышки, а вторая
возвращает фрэйм в первоначальное состояние. Этого оказывается достаточным,
чтобы стандартное меню флэша не появилось пред очами пользователя.
О том,
как передать информацию из JavaScript во флэш Я рассказывать не буду. Об этом
говорится на сайте Macromedia и в огромном количестве топиков на форуме.
Желающие посмотреть, как это делаю Я, могут заглянуть в прилагающийся
исходник.
И немного о проблемах. При нажатии правой клавиши над текстовым
полем обычно появляется меню с возможностью скопировать или вставить текст. Вам
либо придётся реализовывать эту возможность самим (см. ниже), либо проверять,
где находился курсор мыши в момент нажатия правой кнопки, и лишь в нужный момент
блокировать стандартное флэшевое меню. Другая проблема - необходимость убирать
меню, когда пользователь нажимает кнопки мыши вне флэша. Наилучшим решением, на
мой взгляд, является создание слоя позади клипа (естественно, сам клип тоже
нужно поместить в слой) и использование его события onMouseDown, которое будет
срабатывать только когда курсор не находится над флэшем.
Теперь
вышеобещанная реализация контекстного меню для текстого поля. Насколько этот
способ наилучший Я не знаю, но он работает. Для примера создадим возможность
копирования в буфер. Опять воспользуемся скрытым фрэймом, можно тем же, что
описан выше.
В главном фрэйме создаём функцию, которая будет запускаться
из клипа и получать один параметр t - текст, который нужно скопировать в
clipboard:
function toClipBoard(t){ var r =
parent.frames[1].document.body.createTextRange(); r.text =
t; parent.frames[1].document.execCommand('SelectAll'); parent.frames[1].document.execCommand('Copy'); }
В
первой строке создаётся объект TextRange для вставки текста, которая описана во
второй строке. Текст появится в скрытом фрэйме между открывающим и закрывающим
тэгами BODY. Затем мы выделяем этот текст и копируем в буфер. Все остальные
функции реализуются также (для реализации вставки используется функция
document.execCommand('Paste')).
Литература по FLASH
|