我想知道我的键盘上是否按下了ctrl,space,alt,capslock,shift等键。 当我做的时候
String.fromCharCode(e.keyCode)
,它会返回这些键的空白值,但是当我这样做时
alert($.trim(String.fromCharCode(e.keyCode))=='')
然后它会为除了空格键之外的所有键返回false。所以如果有人可能告诉我获取这些键的keydown事件会很棒
答案 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)
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
的支持情况,但如果您使用keyup
,keydown
或keypress
事件,但您可能会以下。但是,没有跨浏览器保证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);
}());
上
更新:读得更晚,所有浏览器都不支持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;上方。