为什么在第二次按下时会返回键码的假值而不是键码?

时间:2016-10-31 13:03:31

标签: javascript

为什么我按下第二个键时会返回键码返回false值而不能获取键码?用我的代码

  1. 当我在文本框中按逗号(,)时,它会提醒44为什么不提醒188
  2. 当我按第二个键时,为什么警告undefined值?
  3. <input onkeypress="return test_fn(value)" type="text">
    
    <script>
      function test_fn(evt) {
        evt = evt || window.event;
        var charCode = evt.which || evt.keyCode;
        var charStr = String.fromCharCode(charCode);
        alert(charCode);
      }
    </script>

3 个答案:

答案 0 :(得分:5)

  

当我在文本框中按逗号(,)时,它会提醒44为什么不提醒188?

因为,是字符代码44.如果您需要密钥代码,则需要使用keydownkeyup,而不是{ {1}}。但请注意,一些关键代码从操作系统到操作系统,甚至是区域键盘布局到区域键盘布局都有所不同。

  

当我按下第二个键时,为什么警告未定义的值?

因为你将输入的keypress传递给函数,但是然后使用函数的参数就好像它是一个value对象一样。 第一个时间,因为Event为空,因此有效,value抓取全局evt = evt || window.event对象(它不会在Firefox上工作)等等你使用事件对象。但第二时间,event并非虚假,因此","继续使用evt = evt || window.event以及","which未定义。您的keyCode应为onkeypress

&#13;
&#13;
onkeypress="test_fn(event)"
&#13;
&#13;
&#13;

...或者更好的是,根本不使用<input onkeypress="return test_fn(event)" type="text"> <script> function test_fn(evt) { evt = evt || window.event; var charCode = evt.which || evt.keyCode; var charStr = String.fromCharCode(charCode); alert(charCode); } </script> - 属性风格的处理程序,使用现代事件处理(onXYZ,如果必须,可能使用addEventListener支持过时的浏览器。)

答案 1 :(得分:1)

您的代码似乎运行正常。它返回每个字符的值。查看ASCII表(http://www.asciitable.com/),逗号应返回44。

至于在键入第二个字符时未定义,它会尝试返回字符串的值(两个或所有字符),而不仅仅是键入的最新字符。你抓住的是value,而不仅仅是最近的角色。

答案 2 :(得分:1)

您的问题是,当您调用onkeypress时,尚未设置输入的值,因此test_fn调用的值参数为null。所以在第一次通过fn_call时,

evt = evt || window.event

评估为evt = window.event。 下次调用fn_call时,value设置为按下键时的输入值。所以上面的evt = ...行现在评估为evt = value。 value没有名为“which”或“keyCode”的属性,因此alert(charCode)显示未定义。

此代码适用于我:

<input onkeypress="test_fn()" type="text">

<script>
function test_fn() {
  var evt = window.event;
  var charCode = evt.which || evt.keyCode;
  var charStr = String.fromCharCode(charCode);
  console.log(charCode);
}
</script>