devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
114 lines (113 loc) • 3.92 kB
JavaScript
/**
* DevExtreme (esm/__internal/events/m_click.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
cancelAnimationFrame,
requestAnimationFrame
} from "../../animation/frame";
import Emitter from "../../common/core/events/core/emitter";
import registerEmitter from "../../common/core/events/core/emitter_registrator";
import eventsEngine from "../../common/core/events/core/events_engine";
import pointerEvents from "../../common/core/events/pointer";
import {
subscribeNodesDisposing,
unsubscribeNodesDisposing
} from "../../common/core/events/utils/event_nodes_disposing";
import {
getEventTarget
} from "../../common/core/events/utils/event_target";
import {
addNamespace,
fireEvent
} from "../../common/core/events/utils/index";
import domAdapter from "../../core/dom_adapter";
import $ from "../../core/renderer";
import devices from "../core/m_devices";
import domUtils from "../core/utils/m_dom";
const CLICK_EVENT_NAME = "dxclick";
const misc = {
requestAnimationFrame: requestAnimationFrame,
cancelAnimationFrame: cancelAnimationFrame
};
let prevented = null;
let lastFiredEvent = null;
const onNodeRemove = () => {
lastFiredEvent = null
};
const clickHandler = function(e) {
const {
originalEvent: originalEvent
} = e;
const eventAlreadyFired = lastFiredEvent === originalEvent || originalEvent && originalEvent.DXCLICK_FIRED;
const leftButton = !e.which || 1 === e.which;
if (leftButton && !prevented && !eventAlreadyFired) {
if (originalEvent) {
originalEvent.DXCLICK_FIRED = true
}
unsubscribeNodesDisposing(lastFiredEvent, onNodeRemove);
lastFiredEvent = originalEvent;
subscribeNodesDisposing(lastFiredEvent, onNodeRemove);
fireEvent({
type: "dxclick",
originalEvent: e
})
}
};
const ClickEmitter = Emitter.inherit({
ctor(element) {
this.callBase(element);
eventsEngine.on(this.getElement(), "click", clickHandler)
},
start() {
prevented = null
},
cancel() {
prevented = true
},
dispose() {
eventsEngine.off(this.getElement(), "click", clickHandler)
}
});
! function() {
const desktopDevice = devices.real().generic;
if (!desktopDevice) {
let startTarget = null;
let blurPrevented = false;
const isInput = function(element) {
return $(element).is("input, textarea, select, button ,:focus, :focus *")
};
const pointerDownHandler = function(e) {
startTarget = e.target;
blurPrevented = e.isDefaultPrevented()
};
const getTarget = function(e) {
const target = getEventTarget(e);
return $(target)
};
const clickHandler = function(e) {
const $target = getTarget(e);
if (!blurPrevented && startTarget && !$target.is(startTarget) && !$(startTarget).is("label") && isInput($target)) {
domUtils.resetActiveElement()
}
startTarget = null;
blurPrevented = false
};
const NATIVE_CLICK_FIXER_NAMESPACE = "NATIVE_CLICK_FIXER";
const document = domAdapter.getDocument();
eventsEngine.subscribeGlobal(document, addNamespace(pointerEvents.down, NATIVE_CLICK_FIXER_NAMESPACE), pointerDownHandler);
eventsEngine.subscribeGlobal(document, addNamespace("click", NATIVE_CLICK_FIXER_NAMESPACE), clickHandler)
}
}();
registerEmitter({
emitter: ClickEmitter,
bubble: true,
events: ["dxclick"]
});
export {
CLICK_EVENT_NAME as name
};