2024-01-29 09:26:07 +08:00

80 lines
2.6 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.trapOn = exports.trapOff = void 0;
const delegate_1 = require("./delegate");
const utils_1 = require("./utils");
const traps = {
mousemoveoutside: new WeakMap(),
clickoutside: new WeakMap()
};
function createTrapHandler(name, el, originalHandler) {
if (name === 'mousemoveoutside') {
const moveHandler = (e) => {
if (el.contains((0, utils_1.getEventTarget)(e)))
return;
originalHandler(e);
};
return {
mousemove: moveHandler,
touchstart: moveHandler
};
}
else if (name === 'clickoutside') {
let mouseDownOutside = false;
const downHandler = (e) => {
mouseDownOutside = !el.contains((0, utils_1.getEventTarget)(e));
};
const upHanlder = (e) => {
if (!mouseDownOutside)
return;
if (el.contains((0, utils_1.getEventTarget)(e)))
return;
originalHandler(e);
};
return {
mousedown: downHandler,
mouseup: upHanlder,
touchstart: downHandler,
touchend: upHanlder
};
}
console.error(
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
`[evtd/create-trap-handler]: name \`${name}\` is invalid. This could be a bug of evtd.`);
return {};
}
function ensureTrapHandlers(name, el, handler) {
const handlers = traps[name];
let elHandlers = handlers.get(el);
if (elHandlers === undefined) {
handlers.set(el, (elHandlers = new WeakMap()));
}
let trapHandler = elHandlers.get(handler);
if (trapHandler === undefined) {
elHandlers.set(handler, (trapHandler = createTrapHandler(name, el, handler)));
}
return trapHandler;
}
function trapOn(name, el, handler, options) {
if (name === 'mousemoveoutside' || name === 'clickoutside') {
const trapHandlers = ensureTrapHandlers(name, el, handler);
Object.keys(trapHandlers).forEach((key) => {
(0, delegate_1.on)(key, document, trapHandlers[key], options);
});
return true;
}
return false;
}
exports.trapOn = trapOn;
function trapOff(name, el, handler, options) {
if (name === 'mousemoveoutside' || name === 'clickoutside') {
const trapHandlers = ensureTrapHandlers(name, el, handler);
Object.keys(trapHandlers).forEach((key) => {
(0, delegate_1.off)(key, document, trapHandlers[key], options);
});
return true;
}
return false;
}
exports.trapOff = trapOff;