UNPKG

@hooooks/use-event-listener

Version:

A custom React Hook that provides a declarative useEventListener with native event binding.

71 lines (70 loc) 2.09 kB
import { useRef, useEffect } from 'react'; import { findDOMNode } from 'react-dom'; export default function useEventListener(element, eventName, handler, options) { var savedhandler = useRef(); useEffect(function () { savedhandler.current = handler; }, [handler]); useEffect(function () { var eventListener = function (event) { return savedhandler.current(event); }; var ele = getTargetElement(element); if (ele != null) { return addEventListener(ele, eventName, eventListener, options); } return undefined; }); } export function addEventListener(element, eventName, handler, options) { if (options === void 0) { options = false; } if (element.addEventListener) { element.addEventListener(eventName, handler, options); } else if (element.attachEvent) { element.attachEvent("on".concat(eventName), handler); } else { element["on".concat(eventName)] = handler; } return function () { removeEventListener(element, eventName, handler, options); }; } export function removeEventListener(element, eventName, handler, options) { if (options === void 0) { options = false; } if (element.removeEventListener) { element.removeEventListener(eventName, handler, options); } else if (element.attachEvent) { element.detachEvent("on".concat(eventName), handler); } else { element["on".concat(eventName)] = null; } } export function getTargetElement(element) { if (isHtmlControl(element)) { return element; } var ele = element.current; if (isHtmlControl(ele)) { return ele; } ele = findDOMNode(ele); if (isHtmlControl(ele)) { return ele; } return null; } function isHtmlControl(obj) { if (obj === window || obj === document) { return true; } var div = document.createElement("div"); try { div.appendChild(obj.cloneNode(true)); return +obj.nodeType === 1; } catch (e) { return false; } }