utils.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /**
  2. * DevExtreme (events/utils.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _renderer = require("../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _events_engine = require("./core/events_engine");
  13. var _events_engine2 = _interopRequireDefault(_events_engine);
  14. var _errors = require("../core/errors");
  15. var _errors2 = _interopRequireDefault(_errors);
  16. var _selectors = require("../ui/widget/selectors");
  17. var _extend = require("../core/utils/extend");
  18. var _iterator = require("../core/utils/iterator");
  19. function _interopRequireDefault(obj) {
  20. return obj && obj.__esModule ? obj : {
  21. "default": obj
  22. }
  23. }
  24. var KEY_MAP = {
  25. backspace: "backspace",
  26. tab: "tab",
  27. enter: "enter",
  28. escape: "escape",
  29. pageup: "pageUp",
  30. pagedown: "pageDown",
  31. end: "end",
  32. home: "home",
  33. arrowleft: "leftArrow",
  34. arrowup: "upArrow",
  35. arrowright: "rightArrow",
  36. arrowdown: "downArrow",
  37. "delete": "del",
  38. " ": "space",
  39. f: "F",
  40. a: "A",
  41. "*": "asterisk",
  42. "-": "minus",
  43. alt: "alt",
  44. control: "control",
  45. shift: "shift",
  46. left: "leftArrow",
  47. up: "upArrow",
  48. right: "rightArrow",
  49. down: "downArrow",
  50. multiply: "asterisk",
  51. spacebar: "space",
  52. del: "del",
  53. subtract: "minus",
  54. esc: "escape"
  55. };
  56. var LEGACY_KEY_CODES = {
  57. 8: "backspace",
  58. 9: "tab",
  59. 13: "enter",
  60. 27: "escape",
  61. 33: "pageUp",
  62. 34: "pageDown",
  63. 35: "end",
  64. 36: "home",
  65. 37: "leftArrow",
  66. 38: "upArrow",
  67. 39: "rightArrow",
  68. 40: "downArrow",
  69. 46: "del",
  70. 32: "space",
  71. 70: "F",
  72. 65: "A",
  73. 106: "asterisk",
  74. 109: "minus",
  75. 189: "minus",
  76. 173: "minus",
  77. 16: "shift",
  78. 17: "control",
  79. 18: "alt"
  80. };
  81. var eventSource = function() {
  82. var EVENT_SOURCES_REGEX = {
  83. dx: /^dx/i,
  84. mouse: /(mouse|wheel)/i,
  85. touch: /^touch/i,
  86. keyboard: /^key/i,
  87. pointer: /^(ms)?pointer/i
  88. };
  89. return function(e) {
  90. var result = "other";
  91. (0, _iterator.each)(EVENT_SOURCES_REGEX, function(key) {
  92. if (this.test(e.type)) {
  93. result = key;
  94. return false
  95. }
  96. });
  97. return result
  98. }
  99. }();
  100. var isDxEvent = function(e) {
  101. return "dx" === eventSource(e)
  102. };
  103. var isNativeMouseEvent = function(e) {
  104. return "mouse" === eventSource(e)
  105. };
  106. var isNativeTouchEvent = function(e) {
  107. return "touch" === eventSource(e)
  108. };
  109. var isPointerEvent = function(e) {
  110. return "pointer" === eventSource(e)
  111. };
  112. var isMouseEvent = function(e) {
  113. return isNativeMouseEvent(e) || (isPointerEvent(e) || isDxEvent(e)) && "mouse" === e.pointerType
  114. };
  115. var isDxMouseWheelEvent = function(e) {
  116. return e && "dxmousewheel" === e.type
  117. };
  118. var isTouchEvent = function(e) {
  119. return isNativeTouchEvent(e) || (isPointerEvent(e) || isDxEvent(e)) && "touch" === e.pointerType
  120. };
  121. var isKeyboardEvent = function(e) {
  122. return "keyboard" === eventSource(e)
  123. };
  124. var isFakeClickEvent = function(e) {
  125. return 0 === e.screenX && !e.offsetX && 0 === e.pageX
  126. };
  127. var eventData = function(e) {
  128. return {
  129. x: e.pageX,
  130. y: e.pageY,
  131. time: e.timeStamp
  132. }
  133. };
  134. var eventDelta = function(from, to) {
  135. return {
  136. x: to.x - from.x,
  137. y: to.y - from.y,
  138. time: to.time - from.time || 1
  139. }
  140. };
  141. var hasTouches = function(e) {
  142. if (isNativeTouchEvent(e)) {
  143. return (e.originalEvent.touches || []).length
  144. }
  145. if (isDxEvent(e)) {
  146. return (e.pointers || []).length
  147. }
  148. return 0
  149. };
  150. var needSkipEvent = function(e) {
  151. var target = e.target;
  152. var $target = (0, _renderer2.default)(target);
  153. var touchInInput = $target.is("input, textarea, select");
  154. if ($target.is(".dx-skip-gesture-event *, .dx-skip-gesture-event")) {
  155. return true
  156. }
  157. if (isDxMouseWheelEvent(e)) {
  158. var isTextArea = $target.is("textarea") && $target.hasClass("dx-texteditor-input");
  159. if (isTextArea) {
  160. return false
  161. }
  162. var isContentEditable = target.isContentEditable || target.hasAttribute("contenteditable");
  163. if (isContentEditable) {
  164. return false
  165. }
  166. var isInputFocused = $target.is("input[type='number'], textarea, select") && $target.is(":focus");
  167. return isInputFocused
  168. }
  169. if (isMouseEvent(e)) {
  170. return touchInInput || e.which > 1
  171. }
  172. if (isTouchEvent(e)) {
  173. return touchInInput && (0, _selectors.focused)($target)
  174. }
  175. };
  176. var fixMethod = function(e) {
  177. return e
  178. };
  179. var setEventFixMethod = function(func) {
  180. fixMethod = func
  181. };
  182. var copyEvent = function(originalEvent) {
  183. return fixMethod(_events_engine2.default.Event(originalEvent, originalEvent), originalEvent)
  184. };
  185. var createEvent = function(originalEvent, args) {
  186. var event = copyEvent(originalEvent);
  187. if (args) {
  188. (0, _extend.extend)(event, args)
  189. }
  190. return event
  191. };
  192. var fireEvent = function(props) {
  193. var event = createEvent(props.originalEvent, props);
  194. _events_engine2.default.trigger(props.delegateTarget || event.target, event);
  195. return event
  196. };
  197. var addNamespace = function addNamespace(eventNames, namespace) {
  198. if (!namespace) {
  199. throw _errors2.default.Error("E0017")
  200. }
  201. if ("string" === typeof eventNames) {
  202. if (eventNames.indexOf(" ") === -1) {
  203. return eventNames + "." + namespace
  204. }
  205. return addNamespace(eventNames.split(/\s+/g), namespace)
  206. }(0, _iterator.each)(eventNames, function(index, eventName) {
  207. eventNames[index] = eventName + "." + namespace
  208. });
  209. return eventNames.join(" ")
  210. };
  211. var normalizeKeyName = function(event) {
  212. var isKeySupported = !!event.key;
  213. var key = isKeySupported ? event.key : event.which;
  214. if (!key) {
  215. return
  216. }
  217. if (isKeySupported) {
  218. key = KEY_MAP[key.toLowerCase()] || key
  219. } else {
  220. key = LEGACY_KEY_CODES[key] || String.fromCharCode(key)
  221. }
  222. return key
  223. };
  224. var getChar = function(event) {
  225. return event.key || String.fromCharCode(event.which)
  226. };
  227. module.exports = {
  228. eventSource: eventSource,
  229. isPointerEvent: isPointerEvent,
  230. isMouseEvent: isMouseEvent,
  231. isDxMouseWheelEvent: isDxMouseWheelEvent,
  232. isTouchEvent: isTouchEvent,
  233. isKeyboardEvent: isKeyboardEvent,
  234. isFakeClickEvent: isFakeClickEvent,
  235. hasTouches: hasTouches,
  236. eventData: eventData,
  237. eventDelta: eventDelta,
  238. needSkipEvent: needSkipEvent,
  239. createEvent: createEvent,
  240. fireEvent: fireEvent,
  241. addNamespace: addNamespace,
  242. setEventFixMethod: setEventFixMethod,
  243. normalizeKeyName: normalizeKeyName,
  244. getChar: getChar
  245. };