Запретить отображение клавиши меню в контекстном меню

Я знаю, что клавиша меню клавиатуры 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 которогопредотвратит это, по крайней мере, в Chrome и Electron.

То есть вы можете глобально отключить клавишу контекстного меню только с помощью:

      window.addEventListener("keyup", function(event){
    if (event.key === "ContextMenu") event.preventDefault();
}, {capture: true})

А затем отслеживайте событие нажатия клавиши, чтобы вызвать замену.

Я начал с решения @aquinas, но обнаружил, что оно может быть немного проще.

Шаги

  1. регистр keydown обработчик события. e.preventDefault не требуется.
  2. регистр 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());

Другие вопросы по тегам