不要在textareas的上下文菜单上触发.keyup

时间:2014-09-07 19:09:58

标签: jquery keypress keyboard-events

我有以下jQuery代码:

$('#textbox').keyup(function(e) {
  if (e.keyCode == 27) { alert( 'You escaped!' ); }
});

如果我打开上下文菜单来更正某个单词,然后决定不更正它并按“Esc”,则使用键盘触发此文本框的.keyup

Context Menu

http://jsfiddle.net/jesin/mr6ty820/

如果对textarea而不是上下文菜单按下了escape,我怎样才能确保(e.keyCode == 27)内的代码有效?

Gmail的“撰写”框也会在“Esc”上关闭,但如果按“Esc”进入上下文菜单,它就不会退出。

2 个答案:

答案 0 :(得分:1)

您可以在上下文菜单处于活动状态时侦听鼠标右键并设置变量,这样它就不会在文本字段的ESC上触发。

var contextMenu = false;

$('#textbox').bind('mousedown keyup', function (e) {

    if (e.keyCode == 27 && !contextMenu) {
        alert('You escaped!');
    }

    if (e.button == 2) {
        contextMenu = true;
    } else {
        contextMenu = false;
    }
});

答案 1 :(得分:0)

这不是一个很好的,也不是保证跨浏览器的解决方案,但可能会让你更接近。它适用于最新的Chrome,可在其他浏览器中自行测试。 See the fiddle

var contextOpen = false;

$(document).on('contextmenu', function (e) {
    contextOpen = !contextOpen;
   console.log(e); 
});

$('#textbox').keyup(function(e) {
  if (e.keyCode == 27 && !contextOpen) { alert( 'You escaped!' ); }
});

$('#textbox').on('keydown click focus', function () {
   contextOpen = false; 
});

如果浏览器触发“contextmenu”事件阻止Esc运行,则此代码基本上会跟踪上下文菜单的打开。困难在于跟踪上下文菜单的“关闭”事件,因为这不可用。你必须解决这个问题,所以当#textbox收到焦点,keydown或click时,我选择重置contextOpen,因为这通常意味着重置。