Forum Webscript.Ru

Программирование => JavaScript & JScript => Тема начата: Night_Wolf от 19 Сентября 2007, 17:00:38

Название: oncontextmenu, возвращая true/false
Отправлено: Night_Wolf от 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:

Поделитесь идеями, плиз.
Название: oncontextmenu, возвращая true/false
Отправлено: Spectrum.Wolf от 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.
Название: oncontextmenu, возвращая true/false
Отправлено: Night_Wolf от 24 Сентября 2007, 11:39:46
Спасибо!
Понял, надо смотреть в сторону event. Замечательная наверное штука:) Подскажите еще, пожалуйста, куда смотреть в сторонувыделения теста (onselectstart)?
srcElement?
Название: oncontextmenu, возвращая true/false
Отправлено: Spectrum.Wolf от 24 Сентября 2007, 14:42:06
Не совсем понял что тебе именно нужно. Контекстное меню - это только событие и перехватчик для него, которое возникает когда ты нажимаешь правую кнопку мыши, больше ты ничего с ним не можешь сделать. Если тебе нужно заменить его на свое меню, то тогда тебе просто нужно создать слой и отображать его в функции перехватчика, в зависимости от координат курсора (с поправкой на полосу прокрутки и видимую область страницы).
Название: oncontextmenu, возвращая true/false
Отправлено: Night_Wolf от 24 Сентября 2007, 15:54:39
В сообщении опечатался. Нет, своего меню мне не надо:) Сейчас разбераюсь как создать перехватчик выделения текста. Мне нужно, чтоб как вызов контекстного меню, так и выделение текста было возможно только для элементов формы.
oElement.onselectstart - было б хорошо, но скрипт не понимает данное свойство. Копаю, как усовершенствовать функцию, добавив к ней перехват выделения текста в INPUT.
Название: oncontextmenu, возвращая true/false
Отправлено: Spectrum.Wolf от 24 Сентября 2007, 16:34:20
Делай также как и с oncontextmenu, т.е.:
document.onselectstart = check;
В данном случае функция используется таже, но ее можешь изменить для нужных тебе элементов.

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

[i]Вообще если ты это делаешь для защиты контента страницы, то можешь не утруждаться.
Название: oncontextmenu, возвращая true/false
Отправлено: Night_Wolf от 24 Сентября 2007, 16:49:02
Спасибо, Spectrum.Wolf! Вот уж все гениальное просто!
Теперь понятнее принцип event.

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

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

Делаю для имитации диалогового окна.
Название: oncontextmenu, возвращая true/false
Отправлено: Spectrum.Wolf от 24 Сентября 2007, 19:39:51
Понятно, ну тогда нормуль! :)

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

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