namespace viewer { interface HTMLEventListener { (event: Event): boolean; } /** * Auxiliary class for blocking and unblocking events on a HTML element. Example for blocking the contextmenu: * ``` * blocker = new gloperate.EventBlocker(element); * blocker.block('contextmenu'); * ``` */ export class EventBlocker { /** * Lookup table for blocked events and their listener. */ private _blockListenerByEvent = new Map(); /** * Element associated to this blocker. */ protected _element: HTMLElement; /** * Creates an event blocker instance associated to a specific HTML element. * @param element - Element that is to be associated with this blocker for block und unblock. * @param events - Optional events that are blocked immediately. */ constructor(element: HTMLElement, events?: Array) { this._element = element; if (events === undefined) { return; } for (const event of events) { this.block(event); } } /** * Blocks a specific event by adding a listener the prevents the default and stops propagation. * @param eventIdentifier - Event identifier that is to be blocked, e.g., 'contextmenu'. */ block(eventIdentifier: string): void { if (this._blockListenerByEvent.has(eventIdentifier)) { return; } this._blockListenerByEvent.set(eventIdentifier, (event): boolean => { event.preventDefault(); event.stopPropagation(); return false; }); this._element.addEventListener(eventIdentifier, this._blockListenerByEvent.get(eventIdentifier) as HTMLEventListener); } /** * Unblocks a previously blocked event by removing the blocker/listener. * @param eventIdentifier - Event identifier that is to be unblocked, e.g., 'contextmenu'. */ unblock(eventIdentifier: string): void { if (!this._blockListenerByEvent.has(eventIdentifier)) { return; } this._element.removeEventListener(eventIdentifier, this._blockListenerByEvent.get(eventIdentifier) as HTMLEventListener); this._blockListenerByEvent.delete(eventIdentifier); } } } export = viewer;