/** * Returns an array with all DOM elements affected by an event. * The function serves as a polyfill for * [`Event.composedPath()`](https://dom.spec.whatwg.org/#dom-event-composedpath). * * @category Event * @param {Event} evt The triggered event. * @return {Array.} The DOM elements affected by the event. * * @example * let domChild = document.createElement("div"), * domParent = document.createElement("div"), * domGrandparent = document.createElement("div"), * body = document.body, * html = document.querySelector("html"); * * domParent.appendChild(domChild); * domGrandparent.appendChild(domParent); * body.appendChild(domGrandparent); * * domChild.addEventListener("click", dealWithClick); * const dealWithClick = evt => getEventPath(evt); * * // when domChild is clicked: * // => [domChild, domParent, domGrandparent, body, html, document, window] */ export default function composedPath(evt) { var path = (evt.composedPath && evt.composedPath()) || evt.path, target = evt.target if (path != null) { // Safari doesn't include Window, and it should. path = path.indexOf(window) < 0 ? path.concat([window]) : path return path } if (target === window) { return [window] } function getParents(node, memo) { memo = memo || [] var parentNode = node.parentNode if (!parentNode) { return memo } else { return getParents(parentNode, memo.concat([parentNode])) } } return [target].concat(getParents(target)).concat([window]) }