12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- import { matchesSelector } from '../../core/utils';
- /**
- * recusively walk up the DOM, checking for a node which matches a selector
- *
- * **WARNING:** this should be used sparingly, as it's not even close to being performant
- * @method findUpVirtual
- * @memberof axe.commons.dom
- * @instance
- * @deprecated use axe.utils.closest
- * @param {VirtualNode} element The starting virtualNode
- * @param {String} target The selector for the HTMLElement
- * @return {HTMLElement|null} Either the matching HTMLElement or `null` if there was no match
- */
- function findUpVirtual(element, target) {
- let parent;
- parent = element.actualNode;
- // virtualNode will have a shadowId if the element lives inside a shadow DOM or is
- // slotted into a shadow DOM
- if (!element.shadowId && typeof element.actualNode.closest === 'function') {
- // non-shadow DOM elements
- const match = element.actualNode.closest(target);
- if (match) {
- return match;
- }
- return null;
- }
- // handle shadow DOM elements and older browsers
- do {
- // recursively walk up the DOM, checking each parent node
- parent = parent.assignedSlot ? parent.assignedSlot : parent.parentNode;
- if (parent && parent.nodeType === 11) {
- parent = parent.host;
- }
- } while (
- parent &&
- !matchesSelector(parent, target) &&
- parent !== document.documentElement
- );
- if (!parent) {
- return null;
- }
- if (!matchesSelector(parent, target)) {
- return null;
- }
- return parent;
- }
- export default findUpVirtual;
|