get-event-listeners
Ponyfill for
getEventListeners.
Table of Contents
Install
deno.land:
import * as mod from "https://deno.land/x/get_event_listeners/mod.ts";npm:
npm i @miyauci/get-event-listenersUsage
updateEventListener function replaces addEventListener and
removeEventListener in EventTarget.prototype with a proxy.
You can refer to the currently registered event listeners with return value.
import { updateEventListener } from "https://deno.land/x/get_event_listeners/mod.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
const getEventListeners = updateEventListener();
declare const target: EventTarget;
declare const handleClick: () => void;
target.addEventListener("click", handleClick);
assertEquals(getEventListeners(target), {
click: [{
type: "click",
listener: handleClick,
useCapture: false,
once: false,
passive: false,
}],
});Linkage
As soon as an event listener is removed, the return value of getEventListeners
is also changed.
Abort signal
If signal aborts, the return value of getEventListeners is also changed.
import {
type EventListener,
updateEventListener,
} from "https://deno.land/x/get_event_listeners/mod.ts";
import {
assert,
assertEquals,
assertFalse,
} from "https://deno.land/std/testing/asserts.ts";
const getEventListeners = updateEventListener();
declare const target: EventTarget;
declare const controller: AbortController;
declare const callback: () => void;
declare const event: string;
declare const listener: EventListener;
assertFalse(controller.signal.aborted);
target.addEventListener(event, callback, { signal: controller.signal });
assertEquals(getEventListeners(target), { [event]: [listener] });
controller.abort();
assert(controller.signal.aborted);
assertEquals(getEventListeners(target), {});Once
If listener with once is called, the return value of getEventListeners is
also changed.
import {
type EventListener,
updateEventListener,
} from "https://deno.land/x/get_event_listeners/mod.ts";
import {
assert,
assertEquals,
assertFalse,
} from "https://deno.land/std/testing/asserts.ts";
const getEventListeners = updateEventListener();
declare const target: EventTarget;
declare const callback: () => void;
declare const event: string;
declare const listener: EventListener;
target.addEventListener(event, callback, { once: true });
assertEquals(getEventListeners(target), { [event]: [listener] });
target.dispatchEvent(new Event(event));
assertEquals(getEventListeners(target), {});Default passive
The default passive is determined according to
default passive value.
import {
type EventListener,
updateEventListener,
} from "https://deno.land/x/get_event_listeners/mod.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
const getEventListeners = updateEventListener();
declare const callback: () => void;
declare const listener: EventListener;
addEventListener("touchstart", callback);
assertEquals(getEventListeners(window), {
touchstart: [{ ...listener, passive: true }],
});The DOM
The default passive is also defined for Document, HTMLHtmlElement and
HTMLBodyElement.
/// <reference lib="dom" />
import {
type EventListener,
updateEventListener,
} from "https://deno.land/x/get_event_listeners/mod.ts";
import { assert, assertEquals } from "https://deno.land/std/testing/asserts.ts";
const getEventListeners = updateEventListener();
declare const callback: () => void;
declare const listener: EventListener;
declare const document: Document;
assert(globalThis.document === document);
document.addEventListener("touchend", callback);
assertEquals(getEventListeners(document), {
touchend: [{ ...listener, passive: true }],
});Pure context
The updateEventListener has a side effect instead of being immediately
available.
We provide a pure context builder with no side effects.
import { createContext } from "https://deno.land/x/get_event_listeners/mod.ts";
import {
afterEach,
beforeEach,
describe,
} from "https://deno.land/std/testing/bdd.ts";
const { addEventListener, removeEventListener } = EventTarget.prototype;
const context = createContext({ addEventListener, removeEventListener });
describe("event listener monitoring", () => {
beforeEach(() => {
EventTarget.prototype.addEventListener = context.addEventListener;
EventTarget.prototype.removeEventListener = context.removeEventListener;
});
afterEach(() => {
EventTarget.prototype.addEventListener = addEventListener;
EventTarget.prototype.removeEventListener = removeEventListener;
});
});Compatibility
getEventListeners is based on
Chrome Console Utilities API.
Safari provides
similar functionality,
but there is no type property on the return value of EventListener.
The DOM has also proposed adding a
similar API to EventTarget.
API
See deno doc for all APIs.
Contributing
See contributing.
License
MIT © 2023 Tomoki Miyauchi
