【问题标题】:keycode and charcode键码和字符码
【发布时间】:2010-11-29 11:47:21
【问题描述】:

为什么人们会写这样的陈述

e.keyCode ? e.keyCode : e.charCode

也有人用e.which

谁能解释一下?

【问题讨论】:

  • 请考虑 which 属性现在已弃用,如 MDN 中所述

标签: javascript jquery


【解决方案1】:

始终如一地处理关键事件并非易事。

首先,有两种不同类型的代码:键盘代码(代表用户在键盘上按下的键的数字)和字符代码(代表 Unicode 字符的数字)。您只能在keypress 事件中可靠地获取字符代码。不要尝试获取keyupkeydown 事件的字符代码。

其次,您在 keypress 事件中获得的值与在 keyupkeydown 事件中获得的值不同。

我推荐this page 作为有用的资源。总结一下:

如果您有兴趣检测用户输入字符,请使用keypress 事件。奇怪的是,IE 只将字符代码存储在 keyCode 中,而所有其他浏览器将其存储在 which 中。一些(但不是全部)浏览器也将其存储在charCode 和/或keyCode 中。按键处理程序示例:

function(evt) {
  evt = evt || window.event;
  var charCode = evt.which || evt.keyCode;
  var charStr = String.fromCharCode(charCode);
  alert(charStr);
}

如果您有兴趣检测不可打印的键(例如光标键),请使用keydown 事件。这里keyCode 始终是要使用的属性。请注意,keyup 事件具有相同的属性。

function(evt) {
  evt = evt || window.event;
  var keyCode = evt.keyCode;

  // Check for left arrow key
  if (keyCode == 37) {
    alert("Left arrow");
  }
}

【讨论】:

  • 先生...我们为什么要使用 or ....evt.which || evt.keyCode...为什么不只是 e.which...当本质上 e.which 返回按下的键的 keyCode 或按下的字母数字键的字符代码。
  • @bhavya_w:支持旧版本的 Internet Explorer(版本 8 和更早版本),它将字符代码存储在 keyCode 中,并且不支持 which 属性。有关详细信息,请参阅unixpapa.com/js/key.html
【解决方案2】:

这是一个条件语句。

如果浏览器支持 e.keyCode 则采用 e.keyCode 否则采用 e.charCode。

类似

var code = event.keyCode || event.charCode

event.keyCode:返回按键事件中的非字符键或任何其他类型的键盘事件中的任何键的 Unicode 值。

event.charCode:返回按键事件期间按下的字符键的 Unicode 值。

【讨论】:

  • 这可以写成单行:var keyCode = event.keyCode || event.charCode.
【解决方案3】:

好的,下面是解释。

e.keyCode - 用于获取代表键盘上的键的数字

e.charCode - 一个数字,表示键盘上按键的 unicode 字符

e.which -(特定于 jQuery)是 jQuery 中引入的属性(请勿在纯 javascript 中使用)

下面是sn-p获取keyCode和charCode的代码

<script>
// get key code
function getKey(event) {
  event = event || window.event;
  var keyCode = event.which || event.keyCode;
  alert(keyCode);
}

// get char code
function getChar(event) {
  event = event || window.event;
  var keyCode = event.which || event.keyCode;
  var typedChar = String.fromCharCode(keyCode);
  alert(typedChar);
}
</script>

Getting keyCode and charCode in JavaScript 的实时示例。

【讨论】:

    【解决方案4】:

    keyCode 并以数值的形式表示实际按下的键盘键。两者都存在的原因是 keyCode 在 Internet Explorer 中可用,而在 FireFox 等 W3C 浏览器中可用。

    charCode 类似,但在这种情况下,您检索所按下字符的 Unicode 值。例如,字母“A”。

    JavaScript 表达式:

    var keyCode = e.keyCode ? e.keyCode : e.charCode;
    

    基本上是这样说的:

    如果 e.keyCode 属性存在,则将变量 keyCode 设置为其值。否则,将变量 keyCode 设置为 e.charCode 属性的值。

    请注意,检索 keyCode 或 charCode 属性通常涉及找出 IE 和 W3C 中的事件模型之间的差异。有些需要编写如下代码:

    /*
     get the event object: either window.event for IE 
     or the parameter e for other browsers
    */
    var evt = window.event ? window.event : e;
    /*
     get the numeric value of the key pressed: either 
     event.keyCode for IE for e.which for other browsers
    */
    var keyCode = evt.keyCode ? evt.keyCode : e.which;
    

    编辑:更正我根据 Tor Haugen 的 cmets 对 charCode 的解释。

    【讨论】:

    • e.charCode 是 not 文本的。它返回字符的(数字)unicode 值。它与 keyCode 的不同之处在于它将具有不同的 A 和 a 值,例如(即是否按住 shift 键)。
    【解决方案5】:

    我(我自己也是人)写了这个声明,因为我想检测用户在不同浏览器的键盘上键入的键。

    例如,在 Firefox 中,字符的 charCode 和 0 keyCode > 0,箭头和退格等键的 keyCode 和 0 charCode > 0。

    但是,使用此语句可能会有问题,因为可能会发生“冲突”。 例如,如果你想区分 Delete 和 Period 键,这是行不通的,因为 Delete 的 keyCode = 46 而 Period 的 charCode = 46。

    【讨论】:

      【解决方案6】:

      使用jQuery时添加属性event.which以避免浏览器差异。 See docs.

      如果您不使用 jQuery,which 属性将未定义。

      【讨论】:

      • event.which 实际上是 Netscape 4 时代的遗留属性,在现代浏览器中仍然可用(尽管已弃用)。 jQuery 只是在它自己的事件对象中采用了相同的名称。
      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多