keyup事件总是返回大写字母

我正在尝试写一些类似于’占位符’polyfill的东西。 我想在输入字段上捕获keyup事件并获取用户输入的char,所以我有这样的代码:

$elem.on('keyup',function(e){ var $this = $(this), val = $this.val(), code = (e.keyCode ? e.keyCode : e.which); console.log(String.fromCharCode(code)); }); 

问题是这总是返回压缩字符的大写版本,我怎么知道按下的字符是大写还是小写?

我知道keypress提供了按下的char,但它并没有在所有按键事件(如退格键)上激活。

您无法轻易从密钥中获取此信息,因为密钥只知道正在按下哪些密钥,而不是正在键入的字母。 您可以检查shift键是否已关闭,您也可以尝试自己跟踪大写锁定,但如果有人在浏览器外按下它,您最终会得到错误的大小写字符。

你可以试试按键事件。 虽然jQuery报告它并不总是表现相同的跨浏览器。 从文档:

请注意,keydown和keyup提供一个代码,指示按下哪个键,而keypress指示输入了哪个字符。 例如,小写“a”将通过keydown和keyup报告为65,但是按key按97报告。 所有事件都报告大写“A”为65。 由于这种区别,当捕获箭头键,.keydown()或.keyup()等特殊击键时,这是一个更好的选择。

您需要捕获关键事件onkeypress,以便您可以访问字符代码。 即使你想检测一个大写锁定/ shift +击键,它仍会记录为两个单独的按键,这使得很难确定uper vrs小写。

一些重要的KeyCode说明:

“在onkeydown或onkeyup事件期间访问keyCode属性时要小心,因为只要按下任何键就会设置它,包括非”Shift“等非字符键。这意味着如果你试图按”Shift + a“试图获取对于“A”的keyCode,你将总是得到两个keyCodes,一个用于“Shift”,一个用于“A”,无论如何都是“a”的keyCode,因为keyCode总是如此返回字符大写版本的unicode值。要获得“a”(小写)的keyCode,你必须探测IE中onkeypress事件期间返回的keyCode,并且由于Firefox在onkeypress期间没有设置keyCode,切换到e.charCode或e.which而不是那个浏览器。“

一些重要的CharCode注意到:

“返回在onkeypress事件期间按下的键的字符代码。仅设置与字符关联的键(即:”a“,”b“或”z“)。没有字符关联的键例如“Shift”或“Ctrl”不符合条件。其他要点: – 为大写和小写字符返回不同的值(即:“a”与“A”)。“

这是两个引用来自的一个很好的来源,它可能最有助于你进一步混淆。

Keycods和charcodes

keyup只知道被按下的键,而不是附加条件(在这种情况下,如果是低/大写的话)。 尝试使用keypress事件(我使用了示例文档来演示 – 将其更改为所需的元素)

例如:

  

您可以在keypress事件上获取charcode,对于“退格”,“插入”等,您可以使用keydowns keyCode属性。