JQuery / JS запретить меню правой кнопкой мыши в браузерах
У меня есть div с правой кнопкой мыши контекстное меню:
// Attatch right click event to folder for extra options
$('#fBox' + folderID).mousedown(function(event) {
if (event.which == 3) {
// Set ID
currRClickFolder = folderID;
// Calculate position to show popup menu
var height = $('#folderRClickMenu').height();
var width = $('#folderRClickMenu').width();
leftVal = event.pageX - (width / 2) + "px";
topVal = event.pageY - (height) + "px";
$('#folderRClickMenu').css({ left: leftVal, top: topVal }).show();
}
});
но браузер для этого элемента по-прежнему всплывает меню по умолчанию (копировать/вставить/свойства и т. д.). Есть способ отключить это? Я пытался вернуть false, но не повезло.
11 ответов
вы можете отключить щелчок правой кнопкой мыши, добавив oncontextmenu= "return false;" к тегу body.
<body oncontextmenu="return false;">
вы можете отключить контекстное меню на любом элементе, который вы хотите:
$('selector').contextmenu(function() {
return false;
});
чтобы полностью отключить контекстное меню на странице (благодаря Ismail), используйте следующее:
$(document).contextmenu(function() {
return false;
});
попробуйте это:
$('#fBox' + folderID).bind("contextmenu", function () {
alert("Right click not allowed");
return false;
});
попробовать...
$('[id^="fBox"]').mousedown(function(event) {
if (event.which == 3) {
event.preventDefault();
// Set ID
currRClickFolder = $(this).attr('id').replace('fBox','');
// Calculate position to show popup menu
var height = $('#folderRClickMenu').height();
var width = $('#folderRClickMenu').width();
leftVal = event.pageX - (width / 2) + "px";
topVal = event.pageY - (height) + "px";
$('#folderRClickMenu').css({ left: leftVal, top: topVal }).show();
}
});
Если у вас есть какое-либо динамическое создание этих ящиков...
$('[id^="fBox"]').live('mousedown',function(event) {
...
});
теперь это поведение браузеров по умолчанию, чтобы отключить переопределение альтернативного щелчка. Каждый пользователь должен разрешить такое поведение в последних браузерах. Например, я не разрешаю это поведение, поскольку мне всегда нужно всплывающее меню по умолчанию.
использование jQuery:
$('[id^="fBox"]').bind("contextmenu",function(e){
return false;
});
или отключить контекстное меню на всю страницу:
$(document).bind("contextmenu",function(e){
return false;
});
Я согласен с @aruseni, блокируя oncontextmenu на уровне тела, вы будете избегать стандартного контекстного меню правой кнопкой мыши для каждого элемента на странице.
но что, если вы хотите иметь более тонкий контроль?
у меня была аналогичная проблема, и я подумал, что нашел хорошее решение: почему бы не прикрепить непосредственно код контекстного меню к contextmenu
событие конкретного элемента(ов), с которым вы хотите иметь дело? Что-то вроде этого:--3-->
// Attatch right click event to folder for extra options
$('#fBox' + folderID).on("contextmenu", function(event) {
// <-- here you handle your custom context menu
// Set ID
currRClickFolder = folderID;
// Calculate position to show popup menu
var height = $('#folderRClickMenu').height();
var width = $('#folderRClickMenu').width();
leftVal = event.pageX - (width / 2) + "px";
topVal = event.pageY - (height) + "px";
$('#folderRClickMenu').css({ left: leftVal, top: topVal }).show();
event.stopImmediatePropagation();
return false; // <-- here you avoid the default context menu
});
таким образом вы избегаете обработка двух разных событий только для захвата контекстного меню и его настройки:)
конечно, это предполагает, что вы не возражаете, чтобы стандартное контекстное меню отображалось, когда кто-то щелкает элементы, которые вы не выбрали. Вы также можете показать различные контекстные меню в зависимости от того, где пользователи щелкните правой кнопкой мыши..
HTH
// Attatch right click event to folder for extra options
$('#fBox' + folderID).mousedown(function(event) {
if (event.which == 3) {
event.preventDefault();
// Set ID
currRClickFolder = folderID;
// Calculate position to show popup menu
var height = $('#folderRClickMenu').height();
var width = $('#folderRClickMenu').width();
leftVal = event.pageX - (width / 2) + "px";
topVal = event.pageY - (height) + "px";
$('#folderRClickMenu').css({ left: leftVal, top: topVal }).show();
}
});
вот способ, который я использовал недавно (используя немного jQuery тоже), когда я столкнулся с проблемой с ним. Поскольку событие mousedown происходит до contextmenu, этот трюк, похоже, ловит его, который прикрепляет обработчик уровня тела oncontextmenu, чтобы временно вернуть false в событии mousedown, выполните желаемое действие, а затем, как важная часть, не забудьте удалить обработчик позже.
Это просто часть моего кода, извлеченного, как образец...
$(div)
.mousedown(function (e) {
if (!leftButtonPressed(e)) {
disableContextMenu(true);
showOptions({ x: e.clientX, y: e.clientY }, div); // do my own thing here
}
});
когда мой showoptions () rtn заканчивается, запускается функция обратного вызова, и она снова вызывает disable-rtn, но с "false":
disableContextMenu(false);
вот мой disableContextMenu () rtn:
function disableContextMenu(boolDisable, fn) {
if (boolDisable) {
$(document).contextmenu(function (e) {
if (fn !== undefined) {
return fn(e);
} else {
return false;
}
});
} else {
$(document).prop("oncontextmenu", null).off("contextmenu");
}
}