Запретить отображение клавиши меню в контекстном меню
Я знаю, что клавиша меню клавиатуры keyCode === 93
,
Итак, у меня есть следующий код:
$(window).on("keydown", document, function(event){
if (event.keyCode === 93) { //context menu
console.log("context menu key", event);
event.preventDefault();
event.stopPropagation();
return false;
}
});
Хотя событие действительно происходит, и console
регистрируется внутри оператора if, но контекстное меню по-прежнему отображается, хотя оба event.preventDefault();
а также event.stopPropagation();
присутствуют в моем коде.
Есть ли способ предотвратить отображение меню?
Демо для игры на скрипке: http://jsfiddle.net/maniator/XJtpc/
Для тех из вас, кто не знает, что такое клавиша "меню":
3 ответа
Это немного глупо, но, похоже, работает: http://jsfiddle.net/XJtpc/2/:)
$(function(){
var lastKey=0;
$(window).on("keydown", document, function(event){
lastKey = event.keyCode;
});
$(window).on("contextmenu", document, function(event){
if (lastKey === 93){
lastKey=0;
event.preventDefault();
event.stopPropagation();
return false;
}
});
});
Хитрость заключается в том, что контекстное меню вызывается событием нажатия клавиши , а не событием нажатия клавиши. Вызов .preventDefault() для события keyup, .key которого
То есть вы можете глобально отключить клавишу контекстного меню только с помощью:
window.addEventListener("keyup", function(event){
if (event.key === "ContextMenu") event.preventDefault();
}, {capture: true})
А затем отслеживайте событие нажатия клавиши, чтобы вызвать замену.
Я начал с решения @aquinas, но обнаружил, что оно может быть немного проще.
Шаги
- регистр
keydown
обработчик события.e.preventDefault
не требуется. - регистр
contextmenu
обработчик событий и просто сделайe.preventDefault()
Пример:
// JavaScript
// Register your `ContextMenu` key event handler
document.querySelector('body').onkeydown = (e) => {
if (e.key === 'ContextMenu') {
// Do something
}
}
// Prevent `contextmenu` event default action
document.querySelector('body').oncontextmenu = (e) => e.preventDefault();
// jQuery
// Register your `ContextMenu` key event handler
$('body').on('keydown', (e) => {
if (e.key === 'ContextMenu') {
// Do something
}
});
// Prevent `contextmenu` event default action
$('body').on('contextmenu', (e) => e.preventDefault());