Автор Тема: oncontextmenu, возвращая true/false  (Прочитано 6214 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Night_Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 29
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« : 19 Сентября 2007, 17:00:38 »
Добрый день,
никак не могу разобраться с вопросом по контекстному меню, надеюсь наталкнете меня в правильное направление.

Вообщем задача следующая:
необходимо отключить контекстное меню от правой кнопки мыши, за исключением вызова оного на любом элементе input.

function formsruler()
{
   var forms = document.getElementsByTagName(\'form\');
   for (var i=0;i               {
                  var inp=forms.getElementsByTagName(\'input\');
                  for(var j=0;j                           {
                              inp[j].oncontextmenu = new Function("return true");
                           }
               }
}

document.oncontextmenu = new Function("return false");

Вот еслиб одно другое не перекрывало...
Возможно конечно пройтись по всем остальным элементам страницы без исключения и прописать им return false. Но это ж как-то геморно выходит:abuse:

Поделитесь идеями, плиз.

Оффлайн Spectrum.Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #1 : 20 Сентября 2007, 20:24:02 »
Вот функция которая тебе нужна:
function check(oEvent) {
	

	
var 
oEvent = !oEvent window.event oEvent;
	

	
var 
oElement oEvent.target oEvent.target oEvent.srcElement;
	
if (\
'INPUT\' == oElement.tagName) {
	
	
return true;
	
}
	

	
return false;
}

document.oncontextmenu = check;

Данный код работает в IE, FireFox, Safari, но не в Opera. Скорее всего Opera до сих пор не поддерживает onContextMenu.
« Последнее редактирование: 20 Сентября 2007, 20:42:50 от Spectrum.Wolf »

Оффлайн Night_Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 29
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #2 : 24 Сентября 2007, 11:39:46 »
Спасибо!
Понял, надо смотреть в сторону event. Замечательная наверное штука:) Подскажите еще, пожалуйста, куда смотреть в сторонувыделения теста (onselectstart)?
srcElement?
« Последнее редактирование: 24 Сентября 2007, 15:55:48 от Night_Wolf »

Оффлайн Spectrum.Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #3 : 24 Сентября 2007, 14:42:06 »
Не совсем понял что тебе именно нужно. Контекстное меню - это только событие и перехватчик для него, которое возникает когда ты нажимаешь правую кнопку мыши, больше ты ничего с ним не можешь сделать. Если тебе нужно заменить его на свое меню, то тогда тебе просто нужно создать слой и отображать его в функции перехватчика, в зависимости от координат курсора (с поправкой на полосу прокрутки и видимую область страницы).
« Последнее редактирование: 24 Сентября 2007, 16:29:09 от Spectrum.Wolf »

Оффлайн Night_Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 29
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #4 : 24 Сентября 2007, 15:54:39 »
В сообщении опечатался. Нет, своего меню мне не надо:) Сейчас разбераюсь как создать перехватчик выделения текста. Мне нужно, чтоб как вызов контекстного меню, так и выделение текста было возможно только для элементов формы.
oElement.onselectstart - было б хорошо, но скрипт не понимает данное свойство. Копаю, как усовершенствовать функцию, добавив к ней перехват выделения текста в INPUT.

Оффлайн Spectrum.Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #5 : 24 Сентября 2007, 16:34:20 »
Делай также как и с oncontextmenu, т.е.:
document.onselectstart check;
В данном случае функция используется таже, но ее можешь изменить для нужных тебе элементов.

[!]У данного обработчика ситуация с покрытием браузеров хуже, чем с контекстным меню.

[i]Вообще если ты это делаешь для защиты контента страницы, то можешь не утруждаться.

Оффлайн Night_Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 29
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #6 : 24 Сентября 2007, 16:49:02 »
Спасибо, Spectrum.Wolf! Вот уж все гениальное просто!
Теперь понятнее принцип event.

По поводу замечаний,
Цитировать
[!]У данного обработчика ситуация с покрытием браузеров хуже, чем с контекстным меню.

Что ж тут поделаешь? У каждого браузера свои заморочки.
Ориентируюсь на Explorer, и потихоньку добавляю аналоги для каждого браузера. Я вообще подгружаю не кроссбраузерные функции, а сразу js для текущего браузера. Конечно, один получаеться - более функциональный, другой - менее...
Цитировать
Вообще если ты это делаешь для защиты контента страницы, то можешь не утруждаться.

Делаю для имитации диалогового окна.

Оффлайн Spectrum.Wolf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
oncontextmenu, возвращая true/false
« Ответ #7 : 24 Сентября 2007, 19:39:51 »
Понятно, ну тогда нормуль! :)

[i] Незнаю какие у тебя потребности, но для эмуляции кросс-браузерного диалогового окна обычно делают следующее:
1) Скрывают все селект-боксы и элементы, которые прорисовываются через слои
2) Накрывают всю рабочую область экрана полупрозрачным или непрозрачным слоем
3) Над слоем создают еще один слой собственно с сообщением, кнопками и всем что необходимо.

Это на всякий пожарный инфа для размышления.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28