You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.3 KiB
140 lines
4.3 KiB
// Copyright (c) MudBlazor 2021
|
|
// MudBlazor licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
//Functions related to MudThrottledEventManager
|
|
class MudThrottledEventManager {
|
|
constructor() {
|
|
this.mapper = {};
|
|
}
|
|
|
|
subscribe(eventName, elementId, projection, throotleInterval, key, properties, dotnetReference) {
|
|
const handlerRef = this.throttleEventHandler.bind(this, key);
|
|
|
|
let elem = document.getElementById(elementId);
|
|
if (elem) {
|
|
elem.addEventListener(eventName, handlerRef, false);
|
|
|
|
let projector = null;
|
|
if (projection) {
|
|
const parts = projection.split('.');
|
|
let functionPointer = window;
|
|
let functionReferenceFound = true;
|
|
if (parts.length == 0 || parts.length == 1) {
|
|
functionPointer = functionPointer[projection];
|
|
}
|
|
else {
|
|
for (let i = 0; i < parts.length; i++) {
|
|
functionPointer = functionPointer[parts[i]];
|
|
if (!functionPointer) {
|
|
functionReferenceFound = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (functionReferenceFound === true) {
|
|
projector = functionPointer;
|
|
}
|
|
}
|
|
|
|
this.mapper[key] = {
|
|
eventName: eventName,
|
|
handler: handlerRef,
|
|
delay: throotleInterval,
|
|
timerId: -1,
|
|
reference: dotnetReference,
|
|
elementId: elementId,
|
|
properties: properties,
|
|
projection: projector,
|
|
};
|
|
}
|
|
}
|
|
|
|
subscribeGlobal(eventName, throotleInterval, key, properties, dotnetReference) {
|
|
let handlerRef = throotleInterval > 0 ?
|
|
this.throttleEventHandler.bind(this, key) :
|
|
this.eventHandler.bind(this, key);
|
|
|
|
document.addEventListener(eventName, handlerRef, false);
|
|
|
|
this.mapper[key] = {
|
|
eventName: eventName,
|
|
handler: handlerRef,
|
|
delay: throotleInterval,
|
|
timerId: -1,
|
|
reference: dotnetReference,
|
|
elementId: document,
|
|
properties: properties,
|
|
projection: null,
|
|
};
|
|
}
|
|
|
|
throttleEventHandler(key, event) {
|
|
const entry = this.mapper[key];
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
|
|
clearTimeout(entry.timerId);
|
|
entry.timerId = window.setTimeout(
|
|
this.eventHandler.bind(this, key, event),
|
|
entry.delay
|
|
);
|
|
}
|
|
|
|
eventHandler(key, event) {
|
|
const entry = this.mapper[key];
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
|
|
var elem = document.getElementById(entry.elementId);
|
|
if (elem != event.srcElement && entry.elementId != document) {
|
|
return;
|
|
}
|
|
|
|
const eventEntry = {};
|
|
for (var i = 0; i < entry.properties.length; i++) {
|
|
eventEntry[entry.properties[i]] = event[entry.properties[i]];
|
|
}
|
|
|
|
if (entry.projection) {
|
|
if (typeof entry.projection === "function") {
|
|
entry.projection.apply(null, [eventEntry, event]);
|
|
}
|
|
}
|
|
|
|
entry.reference.invokeMethodAsync('OnEventOccur', key, JSON.stringify(eventEntry));
|
|
}
|
|
|
|
unsubscribe(key) {
|
|
const entry = this.mapper[key];
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
|
|
entry.reference = null;
|
|
|
|
if (document == entry.elementId) {
|
|
document.removeEventListener(entry.eventName, entry.handler, false);
|
|
} else {
|
|
const elem = document.getElementById(entry.elementId);
|
|
if (elem) {
|
|
elem.removeEventListener(entry.eventName, entry.handler, false);
|
|
}
|
|
}
|
|
|
|
delete this.mapper[key];
|
|
}
|
|
};
|
|
|
|
window.mudThrottledEventManager = new MudThrottledEventManager();
|
|
|
|
window.mudEventProjections = {
|
|
correctOffset: function (eventEntry, event) {
|
|
var target = event.target.getBoundingClientRect();
|
|
eventEntry.offsetX = event.clientX - target.x;
|
|
eventEntry.offsetY = event.clientY - target.y;
|
|
}
|
|
}; |