event.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import XEUtils from 'xe-utils'
  2. import { browse } from './dom'
  3. export const EVENT_KEYS = {
  4. F2: 'F2',
  5. ESCAPE: 'Escape',
  6. ENTER: 'Enter',
  7. TAB: 'Tab',
  8. DELETE: 'Delete',
  9. BACKSPACE: 'Backspace',
  10. SPACEBAR: ' ',
  11. CONTEXT_MENU: 'ContextMenu',
  12. ARROW_UP: 'ArrowUp',
  13. ARROW_DOWN: 'ArrowDown',
  14. ARROW_LEFT: 'ArrowLeft',
  15. ARROW_RIGHT: 'ArrowRight',
  16. PAGE_UP: 'PageUp',
  17. PAGE_DOWN: 'PageDown'
  18. }
  19. const convertEventKeys = {
  20. ' ': 'Spacebar',
  21. Apps: EVENT_KEYS.CONTEXT_MENU,
  22. Del: EVENT_KEYS.DELETE,
  23. Up: EVENT_KEYS.ARROW_UP,
  24. Down: EVENT_KEYS.ARROW_DOWN,
  25. Left: EVENT_KEYS.ARROW_LEFT,
  26. Right: EVENT_KEYS.ARROW_RIGHT
  27. }
  28. // 监听全局事件
  29. const wheelName = browse.firefox ? 'DOMMouseScroll' : 'mousewheel'
  30. const eventStore = []
  31. export const hasEventKey = (evnt, targetKey) => {
  32. const { key } = evnt
  33. targetKey = targetKey.toLowerCase()
  34. return key ? (targetKey === key.toLowerCase() || !!(convertEventKeys[key] && convertEventKeys[key].toLowerCase() === targetKey)) : false
  35. }
  36. export const GlobalEvent = {
  37. on (comp, type, cb) {
  38. if (cb) {
  39. eventStore.push({ comp, type, cb })
  40. }
  41. },
  42. off (comp, type) {
  43. XEUtils.remove(eventStore, item => item.comp === comp && item.type === type)
  44. },
  45. trigger (evnt) {
  46. const isWheel = evnt.type === wheelName
  47. eventStore.forEach(({ comp, type, cb }) => {
  48. // 如果被取消冒泡,不再执行
  49. if (!evnt.cancelBubble) {
  50. if (type === evnt.type || (isWheel && type === 'mousewheel')) {
  51. cb.call(comp, evnt)
  52. }
  53. }
  54. })
  55. },
  56. eqKeypad (evnt, keyVal) {
  57. const { key } = evnt
  58. if (keyVal.toLowerCase() === key.toLowerCase()) {
  59. return true
  60. }
  61. return false
  62. }
  63. }
  64. if (browse.isDoc) {
  65. if (!browse.msie) {
  66. document.addEventListener('copy', GlobalEvent.trigger, false)
  67. document.addEventListener('cut', GlobalEvent.trigger, false)
  68. document.addEventListener('paste', GlobalEvent.trigger, false)
  69. }
  70. document.addEventListener('keydown', GlobalEvent.trigger, false)
  71. document.addEventListener('contextmenu', GlobalEvent.trigger, false)
  72. window.addEventListener('mousedown', GlobalEvent.trigger, false)
  73. window.addEventListener('blur', GlobalEvent.trigger, false)
  74. window.addEventListener('resize', GlobalEvent.trigger, false)
  75. window.addEventListener(wheelName, XEUtils.throttle(GlobalEvent.trigger, 100, { leading: true, trailing: false }), false)
  76. }