3

我有以下代码只允许输入数字(为简洁起见,删除了其他逻辑)。

$("input").keydown(function (event) {
     var key = event.keyCode;
     if ((key < 48 || key > 57) && (key < 96 || key > 105) || event.shiftKey) {
         event.preventDefault();
     }
});

此代码在英文键盘上运行良好,但在法文键盘上使用 shift 键,因此逻辑在那里失败。如果我删除班次,则逻辑在英文键盘中失败。

有没有办法检测在任何类型的键盘上都可以使用的 keydown 事件中按下的数字?

谢谢

4

4 回答 4

1

使用自定义函数检查 keydown 的值是否为数字。从这个先前的答案(Validate decimal numbers in JavaScript - IsNumeric()):

function isNumber(n) 
{
  return !isNaN(parseFloat(n)) && isFinite(n);
}

您的处理程序已更新

 $("input").keydown(function (event) {
    var code = event.keyCode;

     //Allows left and right arrows, backspace, and delete
     if(code == 37 || code == 39 || code == 8 || code == 46)
        return;

     var character = String.fromCharCode(code);
     if(event.shiftKey || !isNumber(character)){
         event.preventDefault();
     }
 });
于 2013-09-12T21:20:32.663 回答
1
@HostListener('keydown', ['$event']) onKeyDown(event) {    
      if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {
        e.preventDefault();
      } else if (!this.isNumber(e.key)) {//For french keyboard 
        e.preventDefault();
      }
    }
  }


  isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
  }

由于 2 个不同的键盘,我遇到了类似的问题。我通过检查是否不是键值中的数字而不是 keyCode 值来解决这个问题。

于 2019-09-13T13:25:23.997 回答
1

我发现event.key效果比event.keyCode. 事件处理程序需要onkeydown它才能正常工作。首先需要检查它是否是一个数字。这是我的代码。经测试可在 IE11、Edge、Chrome 和 Firefox 上运行。

$("input").keydown(function (event) {
  var code = event.keyCode;
  var key = event.key;

  if (!isNaN(Number(key)))
    return;

  // allow backspace, delete, left & right arrows, home, end keys
  if (code == 8 || code == 46 || code == 37 || code == 39 || code == 36 || code == 35) {
    return;
  } else {
    evt.preventDefault();
  }
});
于 2019-04-10T16:06:17.800 回答
0

这行得通吗?

$("input").bind("propertychange input textInput", function() {
  this.value = this.value.replace(/[^\d.]/g, "");
});

当然,这会在输入事件之后修剪值,所以我不确定这是否是你想要的

于 2013-09-12T21:19:25.863 回答