Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

60 wiersze
1.3 KiB

  1. import $ from './dom';
  2. const KEYCODES = {
  3. 13: 'enter',
  4. 91: 'meta',
  5. 16: 'shift',
  6. 17: 'ctrl',
  7. 18: 'alt',
  8. 37: 'left',
  9. 38: 'up',
  10. 39: 'right',
  11. 40: 'down',
  12. 9: 'tab',
  13. 27: 'esc',
  14. 67: 'c',
  15. 70: 'f',
  16. 86: 'v'
  17. };
  18. export default class Keyboard {
  19. constructor(element) {
  20. this.listeners = {};
  21. $.on(element, 'keydown', this.handler.bind(this));
  22. }
  23. handler(e) {
  24. let key = KEYCODES[e.keyCode];
  25. if (e.shiftKey && key !== 'shift') {
  26. key = 'shift+' + key;
  27. }
  28. if ((e.ctrlKey && key !== 'ctrl') || (e.metaKey && key !== 'meta')) {
  29. key = 'ctrl+' + key;
  30. }
  31. const listeners = this.listeners[key];
  32. if (listeners && listeners.length > 0) {
  33. for (let listener of listeners) {
  34. const preventBubbling = listener(e);
  35. if (preventBubbling === undefined || preventBubbling === true) {
  36. e.preventDefault();
  37. }
  38. }
  39. }
  40. }
  41. on(key, listener) {
  42. const keys = key.split(',').map(k => k.trim());
  43. keys.map(key => {
  44. this.listeners[key] = this.listeners[key] || [];
  45. this.listeners[key].push(listener);
  46. });
  47. }
  48. }
  49. export let keyCode = KEYCODES;