代码之家  ›  专栏  ›  技术社区  ›  Raphael

如何捕获onkeydown事件的退格键

  •  54
  • Raphael  · 技术社区  · 16 年前

    我有一个由 onkeydown 文本框事件。如何判断用户是否按了退格键或删除键?

    5 回复  |  直到 8 年前
        1
  •  87
  •   Mike    11 年前

    试试这个:

    document.addEventListener("keydown", KeyCheck);  //or however you are calling your method
    function KeyCheck(event)
    {
       var KeyID = event.keyCode;
       switch(KeyID)
       {
          case 8:
          alert("backspace");
          break; 
          case 46:
          alert("delete");
          break;
          default:
          break;
       }
    }
    
        2
  •  16
  •   Mark Amery Harley Holcombe    10 年前

    现在,执行此操作的代码应该类似于:

    document.getElementById('foo').addEventListener('keydown', function (event) {
        if (event.keyCode == 8) {
            console.log('BACKSPACE was pressed');
    
            // Call event.preventDefault() to stop the character before the cursor
            // from being deleted. Remove this line if you don't want to do that.
            event.preventDefault();
        }
        if (event.keyCode == 46) {
            console.log('DELETE was pressed');
    
            // Call event.preventDefault() to stop the character after the cursor
            // from being deleted. Remove this line if you don't want to do that.
            event.preventDefault();
        }
    });
    

    尽管在将来,一旦它们在浏览器中得到广泛支持,您可能希望使用 .key 或 .code 的属性 KeyboardEvent 而不是被否决的 .keyCode .

    值得了解的细节:

    • 打电话 event.preventDefault() 在keydown事件的处理程序中,将阻止按键的默认效果。当按下一个字符时,它将停止输入活动文本字段。在文本字段中按退格键或删除键时,会阻止删除字符。当在没有活动文本字段的情况下按backspace时,在浏览器(如chrome)中,backspace会将您带回到上一页,它会阻止这种行为(只要您通过将事件侦听器添加到 document 而不是文本字段)。

    • 文件说明 keyCode 属性已确定,可在节中找到 B.2.1 How to determine keyCode for keydown and keyup events 在W3的UI事件规范中。尤其是退格和删除的代码列在 B.2.3 Fixed virtual key codes .

    • 目前正在努力降低 键码 支持的属性 .key and .code . W3描述了 .键代码 属性为 "legacy" 和作为 "deprecated" .

      改为 关键 和 代码 对非ASCII密钥的处理更强大且易于编程-请参阅 the specification that lists all the possible key values 是人类可读的字符串 "Backspace" 和 "Delete" 包括从特定于日语键盘的修改键到模糊媒体键的所有值。另一个与这个问题高度相关的问题是 修改后的按键的意义 和 按下的物理键 .

      论 small Mac keyboards 没有 删除 关键,只有一个 退格 关键。但是,按 FN + 退格 相当于按压 删除 在普通键盘上-也就是说,它删除字符 之后 文本光标而不是它前面的光标。根据您的用例,在代码中,您可能需要处理 退格 具有 FN 按退格键或删除键。这就是为什么新的密钥模型允许您选择。

      这个 .键 属性赋予您 意思 在按键上,所以 FN + 退格 将产生字符串 “删除” . 这个 代码 属性为您提供物理键,因此 FN + 退格键 仍将产生字符串 “退格” .

      不幸的是,在写这个答案的时候,他们只是 supported in 18% of browsers 因此,如果你需要广泛的兼容性,你就要坚持“传统” .键代码 暂时的属性。但是,如果你是未来的读者,或者你的目标是一个特定的平台,并且知道它支持新的界面,那么你可以编写类似这样的代码:

      document.getElementById('foo').addEventListener('keydown', function (event) {
          if (event.code == 'Delete') {
              console.log('The physical key pressed was the DELETE key');
          }
          if (event.code == 'Backspace') {
              console.log('The physical key pressed was the BACKSPACE key');
          } 
          if (event.key == 'Delete') {
              console.log('The keypress meant the same as pressing DELETE');
              // This can happen for one of two reasons:
              // 1. The user pressed the DELETE key
              // 2. The user pressed FN+BACKSPACE on a small Mac keyboard where
              //    FN+BACKSPACE deletes the character in front of the text cursor,
              //    instead of the one behind it.
          }
          if (event.key == 'Backspace') {
              console.log('The keypress meant the same as pressing BACKSPACE');
          }
      });
      
        3
  •  6
  •   jasonbar    16 年前

    在函数中,检查键代码8(退格键)或46(删除键)

    Keycode information
    Keycode list

        4
  •  6
  •   Gibolt    8 年前

    event.key==“退格”或“删除”

    更新更清洁:使用 event.key . 不再有任意数字代码!

    input.addEventListener('keydown', function(event) {
        const key = event.key; // const {key} = event; ES6+
        if (key === "Backspace" || key === "Delete") {
            return false;
        }
    });
    

    Mozilla Docs

    Supported Browsers

        5
  •  0
  •   Mathieu    16 年前

    不确定它是否在Firefox之外工作:

    callback (event){
      if (event.keyCode === event.DOM_VK_BACK_SPACE || event.keyCode === event.DOM_VK_DELETE)
        // do something
      }
    }
    

    如果没有,替换 event.DOM_VK_BACK_SPACE 具有 8 和 event.DOM_VK_DELETE 具有 46 或者将它们定义为常量(为了更好的可读性)

    推荐文章