2013-06-23 40 views
1

我想知道是否在我的键盘上按下了ctrl,space,alt,capslock,shift等按键。 当我做如何知道是否按下了一个没有charcode值的按键

String.fromCharCode(e.keyCode) 

,它返回这些键空白值,但除了空间bar.So这将是巨大的,如果有人可以告诉所有的按键,当我做

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

然后返回false我获得这些密钥

+0

是你打开使用jQuery解决方案吗? 'e.which'将会照顾你的任何关键码 – krishgopinath

+0

你可能会发现[这篇文章](http://unixpapa.com/js/key.html)使用 – Xotic750

+0

'String.fromCharCode(e.keyCode) )=='''不起作用,因为当按下这些键时,即使看不见,它们也会创建一个真正的字符。但是,您可以根据数字进行比较以获得范围。 –

回答

1

香草的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,唯一对应的是选项卡,清除,返回和空间。

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

正如你所看到的,这允许我们在短代码内找到一组完整的字符(例如,无需使用大小写)。 (但是,如果我们不确切知道要包含或排除哪些字符,我们无法给出更准确的答案。)

+0

如果我必须使用所有键的情况下,那么我也可以通过直接keyCode检查它们,但这些事情会使我的代码巨大 – bugwheels94

+0

你可以搜索一个数字范围......这取决于你所说的“ctrl,space,alt,capslock,shift like keys”的意思 –

+0

我添加的那些常量(例如,KeyboardEvent.DOM_VK_SHIFT)对于数字只是人类可读的等价物...你可以改为比较一个号码... –

0

NOTE:

charCode为的keydown事件从未在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"); 
    } 
}); 
+0

大写锁定,制表符,prtSc,暂停 – bugwheels94

+0

我没有使用event.charCode – bugwheels94

0

我不确定keyIdentifier的支持情况,但如果您使用的是keyup,​​或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); 
}()); 

jsfiddle

更新:看完有点furter,keyIdentifier并非所有浏览器都支持,因此并不是真正fullly跨浏览器友好。

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属性给出了 值,以区分具有相同 标识符的多个密钥,例如左右移位键或小键盘编号 键。标准键为0,左或右版本为 为1或2,键盘上出现Shift两个键,数字键盘上出现两个键 。

WebKit实现了对keyIdentifier的支持,并且大部分都是正确的。 旧版本符合旧版本的标准,并且 返回了两个额外的零(例如,“U + 000041”),但这在 版本525中得到了纠正.Windows版本的Safari和Linux版本的Chrome 返回了bad keyIdentifier值所有非数字符号密钥 (2008年7月报告的WebKit Bug 19906)。 keyLocation属性是 总是0或3,所以它不区分左和右 修饰键。

Konqueror的返回像“SHIFT”和“Enter” 正确地,但不是返回Unicode值,则返回 键入的字符本身,“一”或“A”,而不是“U + 0041” keyIdentifier值。除修饰键以外,所有 keyLocation值都为零,无论按下左键还是右键,键修改键都始终为1。

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

在这个标准事件。只有在键入可打印 字符或具有已定义代码的其他字符(如制表符或 退格键)时才定义字符。它基本上像event.charCode,只是它是 字符,而不是字符代码,并且可以是任何unicode字符,而不是只有ASCII码的 。 Event.key与可打印的 键的event.char相同。对于其他键,即使是具有 字符编码的选项卡或退格键,它也是“Tab”,“Left”或“F9”之类的字符串。这些 值在按键事件上应该与它们在 keyup和keydown事件上相同,但是对于其中event.char为空的那些 情况,将不会触发按键。

请注意,它们都不假装是识别键盘上特定物理键的键码。如果按下/?键在 美国键盘上,同时移动关闭,但在 之前按下shift键释放/?关键,然后在keydown你会得到event.key =='/' 和keyup你会得到event.key =='?'。您的Javascript 程序会知道这两个事件结合在一起的唯一方法就是如果发生了 以知道这两个字符在同一个关键字上。有一个 event.locale值应该给你一些关于正在使用的键盘类型 的线索,但要弄清楚特定的键盘是由你自己决定的。

很明显,这种放弃键码的想法会导致 问题,但仍然可能是合理的。在许多(大多数?)运行的 系统中,我并不认为浏览器实际上可以知道哪个键被按下了 。在我看到的浏览器源代码中,键码是从字符代码生成的 ,而不是相反,只要 假设该字符来自美国键盘。因此,键码 值从未真正适用于非美国键盘。

所以,虽然keycode的概念是一个唾手可得的,但它并不真正 实际上在现实世界中可扩展。如果您想在DOM 3 Universe中使用键码,则必须继续使用旧的event.keyCode 值,该标准或标准不会消失。 DOM 3 标准似乎认识到了这一点,并不情愿地为event.keyCode等提供了附录 以及一些标准。它为我上面称之为“IE keycodes”的投票投下了一个较弱的投票。

+0

我正在使用jquery,因为此问题标记为jquery – bugwheels94

+0

然后,您可以使用jquery方法'on'而不是'addEvent',它们基本上是相同的。我给了POJS,因为你的评论“我无法再让我的代码再增加1千字节” – Xotic750

相关问题