swimlane/ngx-datatable

View on GitHub
projects/swimlane/ngx-datatable/src/lib/utils/elm-from-point.ts

Summary

Maintainability
A
0 mins
Test Coverage
if (typeof document !== 'undefined' && !document.elementsFromPoint) {
  document.elementsFromPoint = elementsFromPoint;
}

/*tslint:disable*/
/**
 * Polyfill for `elementsFromPoint`
 *
 * https://developer.mozilla.org/en-US/docs/Web/API/Document/elementsFromPoint
 * https://gist.github.com/iddan/54d5d9e58311b0495a91bf06de661380
 * https://gist.github.com/oslego/7265412
 */
export function elementsFromPoint(x: number, y: number) {
  const elements = [];
  const previousPointerEvents = [];
  let current: any; // TODO: window.getComputedStyle should be used with inferred type (Element)
  let i;
  let d;

  //if (document === undefined) return elements;

  // get all elements via elementFromPoint, and remove them from hit-testing in order
  while ((current = document.elementFromPoint(x, y)) && elements.indexOf(current) === -1 && current != null) {
    // push the element and its current style
    elements.push(current);
    previousPointerEvents.push({
      value: current.style.getPropertyValue('pointer-events'),
      priority: current.style.getPropertyPriority('pointer-events')
    });

    // add "pointer-events: none", to get to the underlying element
    current.style.setProperty('pointer-events', 'none', 'important');
  }

  // restore the previous pointer-events values
  for (i = previousPointerEvents.length; (d = previousPointerEvents[--i]); ) {
    elements[i].style.setProperty('pointer-events', d.value ? d.value : '', d.priority);
  }

  // return our results
  return elements;
}
/*tslint:enable*/