interface EventDefinition {
element: HTMLElement;
events: string[];
callback: any;
passive?: boolean;
}
export type EventUnsubscribeFn = () => void;
export function attachEvents(defs: EventDefinition[]) {
const unsubscribers = [];
defs.forEach(def => {
def.events.forEach(name => {
// Register the event listener.
def.element.addEventListener(name, def.callback, def.passive);
// Create an unsubscribe method.
const unsubscribe = () =>
def.element.removeEventListener(name, def.callback);
unsubscribers.push(unsubscribe);
});
});
// Return a function that unsubscribes the entire batch at once.
return (() =>
unsubscribers.forEach(unsubscribe => unsubscribe())) as EventUnsubscribeFn;
}