import getScrollParent from './getScrollParent'; import getWindow from './getWindow'; function attachToScrollParents(scrollParent, event, callback, scrollParents) { const isBody = scrollParent.nodeName === 'BODY'; const target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; target.addEventListener(event, callback, { passive: true }); if (!isBody) { attachToScrollParents( getScrollParent(target.parentNode), event, callback, scrollParents ); } scrollParents.push(target); } /** * Setup needed event listeners used to update the popper position * @method * @memberof Popper.Utils * @private */ export default function setupEventListeners( reference, options, state, updateBound ) { // Resize event listener on window state.updateBound = updateBound; getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); // Scroll event listener on scroll parents const scrollElement = getScrollParent(reference); attachToScrollParents( scrollElement, 'scroll', state.updateBound, state.scrollParents ); state.scrollElement = scrollElement; state.eventsEnabled = true; return state; }