Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

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

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



  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте