28 мая 2009, 18:28 более года назад
Context menu (right-click) on JavaScript
Для работы нам нужны 3 функции:
// Инициализация переменных // Положение мыши var mouse = {"x":0,"y":0}; // Дистанция до правого-нижнего края var distance = {"right" : 0, "bottom" : 0}; // Обьект, который будет выскакивать как меню var contextmenu = null; // при загрузке страници, инициализируем ивенты addGenericEvent(window,'load',onstart);
function onstart() { // биндим обьект меню contextmenu = $('thecontextmenu'); // перехватываем мышку addGenericEvent(document,'mousemove',mousemove); // при клике где либо на странице, прячем меню addGenericEvent(document,'click',hide_contextmenu); }
// функция которая покаызвает меню function show_contextmenu(event) { // выбираем координаты положения меню // +30 исправляем длину offsetWidth для всех кроме ИЕ о_О // +2 если курсор слишком близок к правому или нижнему краю if (distance.right < contextmenu.offsetWidth + (!window.event ? 30 : 0)) // Если очень близко к правому краю, // размещаем слева от указателя мыши contextmenu.style.left = 2 + mouse.x - contextmenu.offsetWidth+"px"; else contextmenu.style.left = mouse.x+"px"; if (distance.bottom < contextmenu.offsetHeight) // Если очень близко к нижнему краю, // размещаем сверху над указателем мыши contextmenu.style.top = 2 + mouse.y - contextmenu.offsetHeight+"px"; else contextmenu.style.top = mouse.y+"px"; // показываем меню contextmenu.style.visibility = "visible"; // улавливаем ивент когда пользователь // любит клацнуть много раз по правой кнопке try {window.getSelection().collapseToStart();} catch (e) {} // прячем правое меню браузера event.cancelBubble = true; // и другие ивенты на клик правой кнопкой if (event.stopPropagation) event.stopPropagation(); if (event.preventDefault) event.preventDefault(); return false; }
function hide_contextmenu() { contextmenu.style.visibility = "hidden"; // прячем меню над мышкой, что бы лишнее // пространство внизу страници не появлялось у ИЕ contextmenu.style.top = (mouse.y - contextmenu.offsetHeight) + "px"; }
function mousemove(e) { // параметры окна браузера // высота, ширина виевпорта и скролов var wnd = getWindowSizes(); // Ловим положение курсора if (e.clientX) // Moz mouse = { "x": e.clientX + wnd.sx, "y": e.clientY + wnd.sy}; else if (window.event) // IE mouse = { "x": window.event.clientX + wnd.sx, "y": window.event.clientY + wnd.sy}; // считаем растояния к правому-нижнему углу distance.right = wnd.w - (mouse.x - wnd.sx); distance.bottom = wnd.h - (mouse.y - wnd.sy); }