key.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. define(function(require, exports, module) {
  2. var keymap = require('./keymap');
  3. var CTRL_MASK = 0x1000;
  4. var ALT_MASK = 0x2000;
  5. var SHIFT_MASK = 0x4000;
  6. function hash(unknown) {
  7. if (typeof(unknown) == 'string') {
  8. return hashKeyExpression(unknown);
  9. }
  10. return hashKeyEvent(unknown);
  11. }
  12. function is(a, b) {
  13. return a && b && hash(a) == hash(b);
  14. }
  15. exports.hash = hash;
  16. exports.is = is;
  17. function hashKeyEvent(keyEvent) {
  18. var hashCode = 0;
  19. if (keyEvent.ctrlKey || keyEvent.metaKey) {
  20. hashCode |= CTRL_MASK;
  21. }
  22. if (keyEvent.altKey) {
  23. hashCode |= ALT_MASK;
  24. }
  25. if (keyEvent.shiftKey) {
  26. hashCode |= SHIFT_MASK;
  27. }
  28. // Shift, Control, Alt KeyCode ignored.
  29. if ([16, 17, 18, 91].indexOf(keyEvent.keyCode) === -1) {
  30. /**
  31. * 解决浏览器输入法状态下对keyDown的keyCode判断不准确的问题,使用keyIdentifier,
  32. * 可以解决chrome和safari下的各种问题,其他浏览器依旧有问题,然而那并不影响我们对特
  33. * 需判断的按键进行判断(比如Space在safari输入法态下就是229,其他的就不是)
  34. * @editor Naixor
  35. * @Date 2015-12-2
  36. */
  37. if (keyEvent.keyCode === 229 && keyEvent.keyIdentifier) {
  38. return hashCode |= parseInt(keyEvent.keyIdentifier.substr(2), 16);
  39. }
  40. hashCode |= keyEvent.keyCode;
  41. }
  42. return hashCode;
  43. }
  44. function hashKeyExpression(keyExpression) {
  45. var hashCode = 0;
  46. keyExpression.toLowerCase().split(/\s*\+\s*/).forEach(function(name) {
  47. switch(name) {
  48. case 'ctrl':
  49. case 'cmd':
  50. hashCode |= CTRL_MASK;
  51. break;
  52. case 'alt':
  53. hashCode |= ALT_MASK;
  54. break;
  55. case 'shift':
  56. hashCode |= SHIFT_MASK;
  57. break;
  58. default:
  59. hashCode |= keymap[name];
  60. }
  61. });
  62. return hashCode;
  63. }
  64. });