19

我正在尝试编写类似于“占位符”polyfill 的东西。我想在输入字段上捕获 keyup 事件并获取用户输入的字符,所以我有以下代码:

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

});

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

我知道keypress给出了按下的字符,但它不会在所有按键事件(如退格)上激活。

4

4 回答 4

14

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

您可以尝试按键事件。,尽管 jQuery 报告它并不总是表现出相同的跨浏览器。从文档:

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

于 2012-09-24T15:58:01.653 回答
4

keyup只知道被按下的键,而不是附加条件(在这种情况下,如果它是小写/大写)。改为尝试该keypress事件(我已使用文档作为示例进行演示 - 将其更改为所需的元素)

例如:

<script type="text/javascript">

$(document).on('keypress',function(e) {  
    var $this = $(this),    
        val = $this.val(),
        code = e.keyCode || e.which;
    console.log(String.fromCharCode(code));
});

</script>
于 2012-09-24T16:00:36.633 回答
2

您需要通过 onkeypress 捕获您的按键事件,以便您可以访问字符代码。即使您想检测大写锁定 / shift + 击键,它仍然会注册为两个单独的击键,从而难以确定大写 vrs 小写。

一些重要的 KeyCode 注释:

“在 onkeydown 或 onkeyup 事件期间访问 keyCode 属性时要小心,因为每当按下任何键时都会设置它,包括像“Shift”这样的非字符键。这意味着如果您尝试按“Shift+a”来尝试获取“A”的keyCode,你总是会得到两个keyCode,一个用于“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”)。

这是两个引用的重要来源,很可能有助于您进一步混淆。

键码和字符码

于 2012-09-24T16:05:13.850 回答
0

您可以在按键事件中获取字符代码,对于“退格”、“插入”等,您可以使用 keydowns keyCode 属性。

于 2012-09-24T16:00:00.990 回答