On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Управление правой кнопкой мыши во Flash (для IE)

Управление правой кнопкой мыши во 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