devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
174 lines (142 loc) • 4.5 kB
JavaScript
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
};
;