【问题标题】:Detect backspace and del on "input" event?在“输入”事件中检测退格和删除?
【发布时间】:2012-03-28 11:49:40
【问题描述】:

怎么做?

我试过了:

var key = event.which || event.keyCode || event.charCode;

if(key == 8) alert('backspace');

但它不起作用......

如果我对 keypress 事件执行相同操作,它会起作用,但我不想使用 keypress,因为它会在我的输入字段中输出键入的字符。我需要能够控制它


我的代码:

  $('#content').bind('input', function(event){

    var text = $(this).val(),
        key = event.which || event.keyCode || event.charCode;

    if(key == 8){
      // here I want to ignore backspace and del
    }

    // here I'm doing my stuff
    var new_text = 'bla bla'+text;
    $(this).val(new_text);
  });

除了我用 val() 添加的内容之外,我的输入中不应附加任何字符 实际上用户的输入应该被完全忽略,只有按键动作对我来说很重要

【问题讨论】:

  • 你实际上不需要做 or'ing - 事件。​​这很好,jQuery 为你规范化事件对象。见api.jquery.com/category/events/event-object
  • 您应该将事件名称作为.bind 的第一个参数,而不是选择器。应该是$('content').bind('keypress', ...

标签: javascript jquery


【解决方案1】:

使用.onkeydown 并使用return false; 取消删除。像这样:

var input = document.getElementById('myInput');

input.onkeydown = function() {
    var key = event.keyCode || event.charCode;

    if( key == 8 || key == 46 )
        return false;
};

或者使用 jQuery,因为您在问题中添加了 jQuery 标签:

jQuery(function($) {
  var input = $('#myInput');
  input.on('keydown', function() {
    var key = event.keyCode || event.charCode;

    if( key == 8 || key == 46 )
        return false;
  });
});

【讨论】:

  • 如果您想通过右键单击 > 粘贴来捕获输入怎么办?
  • keydown 在 Chrome Android 中不起作用,单击退格或删除时返回空白
  • 在函数中,我们必须将事件作为参数保留,然后它才会像函数(事件)一样工作----------- --- var input = document.getElementById('myInput'); input.onkeydown = 函数(事件){ var key = event.keyCode ||事件.charCode;如果(键 == 8 || 键 == 46 )返回假; };
  • 使用 jQuery,它在内部过滤 enterbackspace 事件上的 input 键,而这些按键无法到达它
  • @Wouter -- 这不是什么大不了的事,但我认为 jquery 的代码中有一个错字。我认为您的意思是将参数名称“event”添加到 on-keydown 事件处理程序。
【解决方案2】:

使用 jQuery

event.which 属性规范了 event.keyCode 和 event.charCode。键盘按键输入建议观看 event.which。

http://api.jquery.com/event.which/

jQuery('#input').on('keydown', function(e) {
    if( e.which == 8 || e.which == 46 ) return false;
});

【讨论】:

  • 我用jQuery很久了,还没见过这个。学习新东西总是好的。 +1!
【解决方案3】:

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

【讨论】:

  • 有时 event.key 出于我无法理解的原因返回“进程”...
  • 这是一个支持的浏览器。您可能有错误,或者您的自定义键盘没有触发 keydown 事件
【解决方案4】:

这是一个老问题,但如果您想在输入时捕捉退格事件,而不是 keydown、keypress 或 keyup,因为我注意到其中任何一个都会破坏我编写的某些函数并导致尴尬的延迟自动文本格式化——你可以使用 inputType 来捕捉退格:

document.getElementsByTagName('input')[0].addEventListener('input', function(e) {
    if (e.inputType == "deleteContentBackward") {
        // your code here
    }
});

【讨论】:

    【解决方案5】:

    keydownevent.key === "Backspace" or "Delete"

    更新且更简洁:使用event.key。没有更多的任意数字代码!

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

    现代风格:

    input.addEventListener('keydown', ({key}) => {
        if (["Backspace", "Delete"].includes(key)) {
            return false
        }
    })
    

    Mozilla Docs

    Supported Browsers

    【讨论】:

      【解决方案6】:

      您是否尝试过使用“onkeydown”? 这是您正在寻找的事件。

      它在输入插入之前运行并允许您取消字符输入。

      【讨论】:

      • 但是如何取消呢?因为我在输入上使用 val() 并且它仍然附加键入的字符
      • event.preventDefault() 怎么样?
      • 你可以简单地return false;在使用jQuery时取消任何事件。
      【解决方案7】:
      $('div[contenteditable]').keydown(function(e) {
      // trap the return key being pressed
      if (e.keyCode === 13 || e.keyCode === 8)
      {
          return false;
      }
      });
      

      【讨论】:

      • “BackSpace”键码 8
      • 问题是退格和删除,而不是退格和回车。
      • 它总是返回false,应该嵌套if
      【解决方案8】:

      在使用 chrome 的 Android 设备上,我们无法检测到退格键。 您可以使用解决方法:

      var oldInput = '',
          newInput = '';
      
       $("#ID").keyup(function () {
        newInput = $('#ID').val();
         if(newInput.length < oldInput.length){
            //backspace pressed
         }
         oldInput = newInput;
       })
      

      【讨论】:

      • 我真的不希望这是答案,但似乎是,因为他们将 whichkeyCode 设置为 229。必须有更好的方法,或者更好的方法即将推出,但我现在基本上会使用它......
      • 谢谢,我正在寻找安卓设备。
      【解决方案9】:
      //Here's one example, not sure what your application is but here is a relevant and likely application 
      function addDashesOnKeyUp()
      {
          var tb = document.getElementById("tb1"); 
          var key = event.which || event.keyCode || event.charCode;
      
          if((tb.value.length ==3 || tb.value.length ==7 )&& (key !=8) ) 
          {
              tb.value += "-"
          } 
      }
      

      【讨论】:

        【解决方案10】:

        InputEvent.inputType 可用于退格检测Mozilla Docs。 它适用于 Chrome 桌面、Chrome Android 和 Safari iOS。

        <input type="text" id="test" />
        
        <script>  
          document.getElementById("test").addEventListener('input', (event) => {
          console.log(event.inputType);
          // Typing of any character event.inputType = 'insertText'
          // Backspace button event.inputType = 'deleteContentBackward'
          // Delete button event.inputType = 'deleteContentForward'
          })
        </script>
        

        【讨论】:

          【解决方案11】:

          Live demo

          Javascript
          <br>
          <input id="input">
          <br>
          or
          <br>
          jquery
          <br>
          <input id="inpu">
          
          <script type="text/javascript">
          var myinput = document.getElementById('input');
          input.onkeydown = function() {
            if (event.keyCode == 8) {
              alert('you pressed backspace');
              //event.preventDefault(); remove // to prevent backspace
            }
          
            if (event.keyCode == 46) {
              alert('you pressed delete');
              //event.preventDefault(); remove // to prevent delete
            }
          };
          
          //jquery code
          
          $('#inpu').on('keydown', function(e) {
            if (event.which == 8) {
              alert('you pressed backspace');
              //event.preventDefault(); remove // to prevent backspace
            }
          
            if (event.which == 46) {
              alert('you pressed delete');
              //event.preventDefault(); remove // to prevent delete
            }
          });
          </script>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-12
            • 2011-06-20
            • 1970-01-01
            • 2016-10-31
            • 2018-12-08
            • 1970-01-01
            • 1970-01-01
            • 2020-09-04
            相关资源
            最近更新 更多