ancestors.js

/**
 * This method traverses the element and it's parents returning all ancestor elements until the selector is matched.
 * 
 * @param {Element} element - An Element to add the event listener to
 * @param {string} [selector] - A valid CSS selector string
 * @returns {Array<Element>} An Array of Element ordered by closest first
 * 
 * @example
 * ancestors(el, '.container')
 */

export default function ancestors (el, selector) {
    if (selector && el.parentElement.matches(selector)) {
        return [el.parentElement]
    } else if (el.parentElement && el.parentElement.parentElement) {
        return [el.parentElement].concat(ancestors(el.parentElement, selector))
    } else if (el.parentElement) {
        return [el.parentElement]
    } else {
        return []
    }
}