on.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const isArray = Array.isArray
  2. const simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?'\]|\[".*?"\]|\[\d+\]|\[[A-Za-z_$][\w$]*\])*$/
  3. // keyCode aliases
  4. const keyCodes = {
  5. esc: 27,
  6. tab: 9,
  7. enter: 13,
  8. space: 32,
  9. up: 38,
  10. left: 37,
  11. right: 39,
  12. down: 40,
  13. 'delete': [8, 46]
  14. }
  15. const modifierCode = {
  16. stop: '$event.stopPropagation();',
  17. prevent: '$event.preventDefault();',
  18. self: 'if($event.target !== $event.currentTarget)return;'
  19. }
  20. export function genHandlers (events) {
  21. let res = 'on:{'
  22. for (let name in events) {
  23. res += `"${name}":${genHandler(events[name])},`
  24. }
  25. return res.slice(0, -1) + '}'
  26. }
  27. function genHandler (handler) {
  28. if (!handler) {
  29. return 'function(){}'
  30. } else if (isArray(handler)) {
  31. return `[${handler.map(genHandler).join(',')}]`
  32. } else if (!handler.modifiers) {
  33. return simplePathRE.test(handler.value)
  34. ? handler.value
  35. : `function($event){${handler.value}}`
  36. } else {
  37. let code = 'function($event){'
  38. for (let key in handler.modifiers) {
  39. code += modifierCode[key] || genKeyFilter(key)
  40. }
  41. let handlerCode = simplePathRE.test(handler.value)
  42. ? handler.value + '($event)'
  43. : handler.value
  44. return code + handlerCode + '}'
  45. }
  46. }
  47. function genKeyFilter (key) {
  48. const code = keyCodes[key]
  49. if (isArray(code)) {
  50. return `if(${code.map(c => `$event.keyCode!==${c}`).join('&&')})return;`
  51. } else {
  52. return `if($event.keyCode!==${code})return;`
  53. }
  54. }