如何知道按下的键是否没有charcode值

时间:2013-06-23 12:59:00

标签: javascript jquery keydown keycode

我想知道我的键盘上是否按下了ctrl,space,alt,capslock,shift等键。 当我做的时候

String.fromCharCode(e.keyCode)

,它会返回这些键的空白值,但是当我这样做时

alert($.trim(String.fromCharCode(e.keyCode))=='')

然后它会为除了空格键之外的所有键返回false。所以如果有人可能告诉我获取这些键的keydown事件会很棒

3 个答案:

答案 0 :(得分:1)

Vanilla JavaScript:

对于其他常量,请参阅https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

window.onkeydown = function (e) {
    switch (e.keyCode) {
        case KeyboardEvent.DOM_VK_SPACE:
            alert('space bar!');
            break;
        case KeyboardEvent.DOM_VK_CAPS_LOCK:
            alert('CAPS LOCK!');
            break;
        case KeyboardEvent.DOM_VK_CONTROL:
            alert('control!');
            break;
        case KeyboardEvent.DOM_VK_SHIFT:
            alert('shift!');
            break;
        case KeyboardEvent.DOM_VK_ALT:
            alert('alt!');
            break;
    }
};

更新要求避免的情况:

根据以下测试,修剪后(并且不包括与普通键盘不对应的数字)将减少为空字符串的唯一数值是9,10,11,12,13,32。查看https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Virtual_key_codes,唯一对应的是tab,clear,return和space。

// Run in Firefox where trim() is supported (without need for jQuery):
var arr = [];
for (var i=0; i < 0xFFFF; i++) {
    if (String.fromCharCode(i).trim() == '') {
        arr.push(i);
    }
}

换句话说,你自己的测试不会捕捉到所有情况。

因此,您必须根据https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Virtual_key_codes上的信息使用数字比较,并根据您需要包含(或排除)的确切字符。

例如,如果您认为取消键,帮助键,后退空间,标签等都是您提到的类型,您可以这样做:

window.onkeydown = function (e) {
    if (e.keyCode < 0x30) {
        alert('Special key pressed!');
    }
};

如您所见,这允许我们在少量代码中找到一组完整的字符(例如,不使用大小写)。 (但如果我们不确切地知道您要包含或排除哪些字符,我们无法给您更准确的答案。)

答案 1 :(得分:0)

NOTE:

  

charCode永远不会在keydown和keyup事件中设置。在这些情况下,改为设置keyCode。

你可以尝试

$(window).keydown(function (e){
    if (e.ctrlKey) {     there are e.altKey & e.shiftKey also.
                                  for other keys use hardcoded integer values.
    alert("control");
    }
});

答案 2 :(得分:0)

我不确定keyIdentifier的支持情况,但如果您使用keyupkeydownkeypress事件,但您可能会以下。但是,没有跨浏览器保证charcode未定义或为零。不使用jquery来保持尽可能小的东西,只检测你指定的密钥。请参阅article

的Javascript

/*jslint maxerr: 50, indent: 4, browser: true */

(function () {
    "use strict";

    function addEvent(elem, event, fn) {
        if (typeof elem === "string") {
            elem = document.getElementById(elem);
        }

        function listenHandler(e) {
            var ret = fn.apply(null, arguments);

            if (ret === false) {
                e.stopPropagation();
                e.preventDefault();
            }

            return ret;
        }

        function attachHandler() {
            window.event.target = window.event.srcElement;

            var ret = fn.call(elem, window.event);

            if (ret === false) {
                window.event.returnValue = false;
                window.event.cancelBubble = true;
            }

            return ret;
        }

        if (elem.addEventListener) {
            elem.addEventListener(event, listenHandler, false);
        } else {
            elem.attachEvent("on" + event, attachHandler);
        }
    }

    function checkKeys(e) {
        if ("Alt,Shift,Control,CapsLock,U+0020".indexOf(e.keyIdentifier) !== -1) {
            alert(e.keyIdentifier);
        }      

        console.log(e.keyIdentifier);
    }

    addEvent(window, "keydown", checkKeys);
}());

jsfiddle

更新:读得更晚,所有浏览器都不支持keyIdentifier,因此不能完全跨浏览器友好。

  

3.4。新标准密钥和字符事件

     

DOM3标准放弃了创造秩序的所有希望   event.keyCode,event.which和event.charCode,而是定义new   keydown和keyup事件的值。有一段时间它不赞成了   keypress事件并用textInput事件替换它,但那是   百废待兴。只有少数浏览器实现了第一个版本,所以   目前还没有浏览器实现过最新版本。早期版本   规范定义了名为event.keyIdentifier和的属性   event.keyLocation。 keyIdentifier是大多数情况下的字符串   看起来像&#34; U + 0041&#34; &#34; 0041&#34; part是unicode值   在没有修饰符的情况下键入时由键发送的字符   字母&#34; A&#34;。对于没有发送unicode字符的密钥,或者   unicode值没有标准化,它是一个字符串   &#34;输入&#34;,&#34; Shift&#34;,&#34;左&#34;或&#34; F9&#34;。 keyLocation属性给出了   用于区分具有相同的多个键的值   标识符,如左右shift键或键盘编号   键。标准键为0,左或右版本为1或2   Shift之类的键在键盘上出现两次,键为3   在数字键盘上。

     

WebKit实现了对keyIdentifier的支持,并且大部分都是正确的。   旧版本符合旧版标准和   返回两个额外的零(例如,&#34; U + 000041&#34;)但是已经更正了   版本525.Windows和Linux版本的Chrome的Windows版本   返回所有非数字符号键的错误keyIdentifier值   (WebKit Bug 19906于2008年7月报道)。 keyLocation属性是   总是0或3,所以它不区分左和右   修饰键。

     

Konqueror返回keyIdentifier值,例如&#34; Shift&#34;和&#34;输入&#34;   正确,但它不返回Unicode值,而是返回   键入字符本身,&#34; a&#34;或&#34; A&#34;而不是&#34; U + 0041&#34;。所有   keyLocation值为零,修饰符键除外   无论左手还是右手都被按下,总是一个。

     

我们不能期望更多的浏览器实现它   标准,因为它现在已经改变。不再是DOM 3标准   提到event.keyIdentifier或event.keyLocation。相反,我们有   event.key,event.char,event.location ..据我所知,没有浏览器   已经实现了这个新版本的DOM 3标准。

     

在此标准中,仅在键入printable时才定义event.char   字符,或具有已定义代码的其他字符(如制表符或   退格键)。它基本上就像event.charCode,除了它是   字符,而不是字符代码,可以是任何unicode字符   只是一个ASCII码。 Event.key与可打印的event.char相同   键。对于其他键,甚至像tab或backspace那样的键   字符编码,它是一个字符串,如&#39; Tab&#39;,&#39; Left&#39;或者&#39; F9&#39;。这些   在按键事件中,值应该与它们相同   keyup和keydown事件,虽然不会为那些人触发按键   event.char为null的情况。

     

请注意,这些都不是伪装成识别a的密钥代码   键盘上的特定物理键。如果按/?关键的   换挡时美国键盘关闭,但按下换档键   释放/?关键,然后在keydown你会得到event.key ==&#39; /&#39;   在keyup上你会得到event.key ==&#39;?&#39;。你的Javascript的唯一方式   程序会知道这两个事件在一起是否会发生   要知道那两个字符在同一个键上。有一个   event.locale值,可以给你一些关于什么类型的线索   正在使用键盘,但弄清楚什么键与什么键   特定的键盘取决于你。

     显然,放弃密钥代码的想法将会导致   问题,但仍然可能是合理的。在许多(大多数?)操作   系统,我不认为浏览器实际上可以告诉哪个键   按下。在我看过的浏览器源代码中,密钥代码是   简单地从字符代码生成,而不是反之亦然   假设角色来自美国键盘。所以键码   价值从来没有真正适用于非美国键盘。

     

因此,虽然键码概念是一个简单的概念,但它并不是真的   在现实世界中几乎可以扩展。如果你想要一个键码   在DOM 3世界中,您必须继续使用遗留的event.keyCode   价值,标准或没有标准,不会消失。 DOM 3   标准似乎认识到了这一点,并且不情愿地提供了一个附录   有一些event.keyCode等标准。它投了一个相当的   我所称的&#34; IE密钥代码&#34;上方。