div.main {margin-left: 20pt; margin-right: 20pt}
Управление правой кнопкой мыши во 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')).
Ну, вот, собственно, и всё. Желаю Вам творческих успехов! До свидания!
Сopyleft: Aib
|