Javascript按键事件和e.keycode
Javascript按键事件和e.keycode
我有一个代码,它应该在用户在文本输入框中输入时更新剩余字符数量。该代码由"keypress"事件触发。问题是,该代码只在输入两个"keypress"之后触发。为什么会这样呢?
我有一个代码,用来显示ASCII码的键,但字符总是显示为8,并且在按下退格键时显示。如何使用"String.fromCharCode(event.keyCode)"方法?
为什么要在函数中添加一个"event"参数?"e.keyCode"又是如何知道它显示的是用户输入的键码的呢?
代码示例
HTML
List King
JavaScript
var el; // 声明变量 function charCount(e) { // 声明函数 var textEntered, charDisplay, counter, lastkey; // 声明变量 textEntered = document.getElementById('message').value; // 用户输入的文本 charDisplay = document.getElementById('charactersLeft'); // 计数器元素 counter = (180 - (textEntered.length)); // 剩余字符数 charDisplay.textContent = counter; // 显示剩余字符数 lastkey = document.getElementById('lastKey'); // 获取最后一个使用的键 lastkey.textContent = '最后一个键的ASCII码:' + e.keyCode; // 创建消息 } el = document.getElementById('message'); // 获取消息元素 el.addEventListener('keypress', charCount, false); // keypress - 调用charCount()
Javascript的keypress事件和e.keyCode的问题出现的原因是在处理按键事件时,使用了错误的事件类型和属性。
解决方法如下:
1) 使用'keyup'代替'keypress'事件。
2) 使用lastkey.textContent = 'Last key in ASCII code: ' + String.fromCharCode(e.keyCode);
来获取按键的ASCII码。
3) event参数被添加用于捕获触发的事件。它具有所有触发事件的属性,例如对于'keyup'事件,它具有'charcode'、'keycode'、'key'等属性。
使用'keyup'事件可以在释放按键时触发,因此计数器在按下键时不会更新。
Javascript的keypress事件和e.keycode问题的出现原因是keypress事件在输入的值更新之前触发,这就是为什么计数器没有更新的原因。建议如果不需要keyCode,可以监听input事件。也可以监听keyup事件(但更新不会直接),或者同时监听keypress事件和keyup事件。另外,可以忽略不相关的按键(如"backspace"、"shift"、"command"等)的解决方法是监听"input"事件(但无法访问event.keyCode),或者当keyCode不相关时忽略代码。使用String.fromCharCode(event.keyCode)可以获取keyCode的"人类"等价物。通过事件传递给函数的event对象包含所有关于该事件的信息,包括按下的键。
第一个问题并没有问题,它可以通过keyup事件解决。如果你有特殊的原因,请在你的代码中展示出来。在一个jsfiddle中复制并粘贴你的代码。打开控制台并在输入框中输入文本。你会发现,每次按下键时,keypress事件都会被触发。
我输入一个字符时它不会触发,下一个字符我输入时它会触发。我的意思是,我先输入一个字符,什么都不会发生,然后我再输入另一个字符(这样我就输入了2个字符),在我输入第二个字符后,事件会触发并显示(180-1个字符)而不是显示178个字符。
实际上,keypress事件在输入的值更新之前触发。如果不需要keyCode,建议监听"input"事件。否则,可以监听"keyup"事件,但更新不会直接。还有一个来自"How to get text of an input text box during onKeyPress?"的解决方法(我已经根据你的需求更新了这个fiddle)。
你的fiddle似乎按预期工作。当我按下"a"时,我看到"a",当我按下"b"时,我看到"b"。请问你使用的是什么浏览器和版本?
最新版本的Mozilla Firefox。