UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

174 lines (142 loc) 4.5 kB
"use strict"; var $ = require("../core/renderer"); var eventsEngine = require("./core/events_engine"); var errors = require("../core/errors"); var focused = require("../ui/widget/selectors").focused; var extend = require("../core/utils/extend").extend; var each = require("../core/utils/iterator").each; var eventSource = function () { var EVENT_SOURCES_REGEX = { "dx": /^dx/i, "mouse": /(mouse|wheel)/i, "touch": /^touch/i, "keyboard": /^key/i, "pointer": /^(ms)?pointer/i }; return function (e) { var result = "other"; each(EVENT_SOURCES_REGEX, function (key) { if (this.test(e.type)) { result = key; return false; } }); return result; }; }(); var isDxEvent = function isDxEvent(e) { return eventSource(e) === "dx"; }; var isNativeMouseEvent = function isNativeMouseEvent(e) { return eventSource(e) === "mouse"; }; var isNativeTouchEvent = function isNativeTouchEvent(e) { return eventSource(e) === "touch"; }; var isPointerEvent = function isPointerEvent(e) { return eventSource(e) === "pointer"; }; var isMouseEvent = function isMouseEvent(e) { return isNativeMouseEvent(e) || (isPointerEvent(e) || isDxEvent(e)) && e.pointerType === "mouse"; }; var isTouchEvent = function isTouchEvent(e) { return isNativeTouchEvent(e) || (isPointerEvent(e) || isDxEvent(e)) && e.pointerType === "touch"; }; var isKeyboardEvent = function isKeyboardEvent(e) { return eventSource(e) === "keyboard"; }; var isFakeClickEvent = function isFakeClickEvent(e) { return e.screenX === 0 && !e.offsetX && e.pageX === 0; }; var eventData = function eventData(e) { return { x: e.pageX, y: e.pageY, time: e.timeStamp }; }; var eventDelta = function eventDelta(from, to) { return { x: to.x - from.x, y: to.y - from.y, time: to.time - from.time || 1 }; }; var hasTouches = function hasTouches(e) { if (isNativeTouchEvent(e)) { return (e.originalEvent.touches || []).length; } if (isDxEvent(e)) { return (e.pointers || []).length; } return 0; }; var needSkipEvent = function needSkipEvent(e) { // TODO: this checking used in swipeable first move handler. is it correct? var $target = $(e.target); var touchInInput = $target.is("input, textarea, select"); if ($target.is(".dx-skip-gesture-event *, .dx-skip-gesture-event")) { return true; } if (e.type === 'dxmousewheel') { return $target.is("input[type='number'], textarea, select") && $target.is(':focus'); } if (isMouseEvent(e)) { return touchInInput || e.which > 1; // only left mouse button } if (isTouchEvent(e)) { return touchInInput && focused($target); } }; var fixMethod = function fixMethod(e) { return e; }; var setEventFixMethod = function setEventFixMethod(func) { fixMethod = func; }; var copyEvent = function copyEvent(originalEvent) { return fixMethod(eventsEngine.Event(originalEvent, originalEvent), originalEvent); }; var createEvent = function createEvent(originalEvent, args) { var event = copyEvent(originalEvent); if (args) { extend(event, args); } return event; }; var fireEvent = function fireEvent(props) { var event = createEvent(props.originalEvent, props); eventsEngine.trigger(props.delegateTarget || event.target, event); return event; }; var addNamespace = function addNamespace(eventNames, namespace) { if (!namespace) { throw errors.Error("E0017"); } if (typeof eventNames === "string") { if (eventNames.indexOf(" ") === -1) { return eventNames + "." + namespace; } return addNamespace(eventNames.split(/\s+/g), namespace); } each(eventNames, function (index, eventName) { eventNames[index] = eventName + "." + namespace; }); return eventNames.join(" "); }; module.exports = { eventSource: eventSource, isPointerEvent: isPointerEvent, isMouseEvent: isMouseEvent, isTouchEvent: isTouchEvent, isKeyboardEvent: isKeyboardEvent, isFakeClickEvent: isFakeClickEvent, hasTouches: hasTouches, eventData: eventData, eventDelta: eventDelta, needSkipEvent: needSkipEvent, createEvent: createEvent, fireEvent: fireEvent, addNamespace: addNamespace, setEventFixMethod: setEventFixMethod };