reakit-utils
Version:
Reakit utils
36 lines (31 loc) • 955 B
text/typescript
import { matches } from "./matches";
export function closest<K extends keyof HTMLElementTagNameMap>(
element: Element,
selectors: K
): HTMLElementTagNameMap[K];
export function closest<K extends keyof SVGElementTagNameMap>(
element: Element,
selectors: K
): SVGElementTagNameMap[K];
export function closest<T extends Element = Element>(
element: Element,
selectors: string
): T | null;
/**
* Ponyfill for `Element.prototype.closest`
*
* @example
* import { closest } from "reakit-utils";
*
* closest(document.getElementById("id"), "div");
* // same as
* document.getElementById("id").closest("div");
*/
export function closest(element: Element, selectors: string) {
if ("closest" in element) return element.closest(selectors);
do {
if (matches(element, selectors)) return element;
element = (element.parentElement || element.parentNode) as any;
} while (element !== null && element.nodeType === 1);
return null;
}