为什么我得到返回假值的关键代码,而不是关键代码时,按第二次

Why do I get return false value of key code and not the key code when press second time?

本文关键字:代码 第二次 为什么 返回      更新时间:2023-09-26

为什么我得到返回假值的关键代码,而不是得到关键代码时,按第二个键?用我的代码

  1. 当我在文本框中按逗号(,)时,它会警告44为什么不警告188 ?
  2. 当我按第二键时,为什么警告undefined

<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>

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

因为,是字符码44。如果您想要一个代码,您需要使用keydownkeyup,而不是keypress。但请注意,某些键代码因操作系统而异,甚至不同区域的键盘布局也不同。

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

因为您将输入的value传递给函数,但随后将函数的参数当作Event对象使用。第一个时间,因为value是空白的,因此是假的,evt = evt || window.event捕获全局event对象(在Firefox上不起作用),因此使用事件对象。但是时间,","不是假的,所以evt = evt || window.event一直使用",", whichkeyCode都是未定义的。你的onkeypress应该是onkeypress="test_fn(event)"

<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,如果必须支持过时的浏览器,可能是attachEvent)。

您的代码似乎工作良好。它返回每个字符的值。查看ASCII表(http://www.asciitable.com/),逗号应该返回44。

至于键入第二个字符时未定义,它试图返回字符串(两个或所有字符)的值,而不仅仅是键入的最新字符。您正在抓取value,而不仅仅是最近的字符。

您的问题是,当您调用onkeypress时,输入的值尚未设置,因此test_fn调用的值参数为空。第一次运行fn_call时,

evt = evt || window.event

求值为evt = window.event。下次调用fn_call时,value被设置为按下键时的输入值。那么evt =。上面这行现在求值为evt = value。value没有名为"which"或"keyCode"的属性,所以alert(charCode)显示undefined。

这段代码为我工作:

<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>