2

我想知道我的键盘上是否按下了 ctrl、空格、alt、capslock、shift 等键。当我做

String.fromCharCode(e.keyCode)

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

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

然后它为除空格键之外的所有键返回 false。所以如果有人可以告诉我获取这些键的 keydown 事件,那就太好了

4

3 回答 3

2

香草 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!');
    }
};

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

于 2013-06-23T13:12:05.673 回答
0

笔记:

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");
    }
});
于 2013-06-23T13:04:30.343 回答
0

我不确定是否支持,keyIdentifier但如果您使用keyupkeydownkeypress事件,但您可以执行以下操作。charcode但是,没有定义或为零的跨浏览器保证。不使用 jquery 来保持尽可能小,并且只检测您指定的键。见文章

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 之间创建顺序的所有希望,而是为 keydown 和 keyup 事件定义了新的值。有一段时间,它弃用了 keypress 事件并将其替换为 textInput 事件,但这已被撤消。只有少数浏览器实现了第一个版本,到目前为止,还没有浏览器实现了最新版本。早期版本的规范定义了名为 event.keyIdentifier 和 event.keyLocation 的属性。keyIdentifier 是一个字符串,在大多数情况下看起来像“U+0041”,其中“0041”部分是在没有修饰符的情况下键入时由键发送的字符的 unicode 值,在这种情况下是字母“A”。对于未发送 unicode 字符或 unicode 值未标准化的键,它是一个类似“Enter”、“Shift”、“Left”或“F9”的字符串。keyLocation 属性给出了区分具有相同标识符的多个键的值,例如左右 shift 键或键盘数字键。0 表示标准键,1 或 2 表示左或右版本的键(如 Shift)在键盘上出现两次,3 表示数字键盘上的键。

WebKit 实现了对 keyIdentifier 的支持,并且基本上是正确的。旧版本符合旧版本的标准并返回两个额外的零(例如,“U+000041”),但在版本 525 中已更正。Windows 版本的 Safari 和 Linux 版本的 Chrome 返回错误的 keyIdentifier 值对于所有非-数字符号键(2008 年 7 月报告的 WebKit 错误 19906)。keyLocation 属性始终为 0 或 3,因此不区分左右修饰键。

Konqueror 正确返回 keyIdentifier 值,如“Shift”和“Enter”,但它不返回 Unicode 值,而是返回键入的字符本身,“a”或“A”而不是“U+0041”。所有 keyLocation 值都为零,除了修饰键,它始终为一,无论是按下左键还是右键。

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

在此标准中 event.char 仅在您键入可打印字符或具有已定义代码(如制表符或退格键)的另一个字符时定义。它基本上类似于 event.charCode,只是它是字符,而不是字符代码,并且可以是任何 unicode 字符,而不仅仅是 ASCII 代码。Event.key 与可打印键的 event.char 相同。对于其他键,即使是具有字符编码的制表符或退格键,它也是一个字符串,例如“Tab”、“Left”或“F9”。这些值在 keypress 事件上应该与在 keyup 和 keydown 事件上相同,尽管在 event.char 为 null 的情况下不会触发 keypress。

请注意,这些都不是识别键盘上特定物理键的键码。如果按 /? 关闭 shift 时在美式键盘上按 键,但在释放 /? 之前按 shift 键 键,然后在 keydown 上你会得到 event.key=='/',在 keyup 上你会得到 event.key=='?'。您的 Javascript 程序知道这两个事件一起发生的唯一方法是,如果它碰巧知道这两个字符在同一个键上。有一个 event.locale 值应该可以为您提供一些关于正在使用什么类型的键盘的线索,但要弄清楚哪些键与特定键盘上的什么相配则取决于您。

显然,放弃键码的想法会导致问题,但仍然可能是合理的。在许多(大多数?)操作系统中,我认为浏览器实际上无法判断按下了哪个键。在我看到的浏览器源代码中,键码是从字符代码生成的,反之亦然,只需假设字符来自美国键盘。因此,键码值从未真正适用于非美国键盘。

因此,虽然 keycode 概念很方便,但在现实世界中实际上并不能真正扩展。如果您想要 DOM 3 世界中的键码,您将不得不继续使用遗留的 event.keyCode 值,无论标准还是无标准,它都不会消失。DOM 3 标准似乎认识到了这一点,并且不情愿地提供了一个附录,其中包含一些 event.keyCode 等标准。它对我上面所说的“IE 键码”投了相当弱的一票。

于 2013-06-23T13:43:12.933 回答