Skip to content

getDocumentOrShadow

源码

typescript
import type { BasicTarget } from '../utils/domTarget'
import { getTargetElement } from '../utils/domTarget'

declare type TargetValue<T> = T | undefined | null

// 判断是否是影子dom
const checkIfAllInShadow = (targets: BasicTarget[]): boolean => {
  return targets.every((item) => {
    // 获取目标元素
    const targetElement = getTargetElement(item)
    // 如果目标元素不存在,返回false
    if (!targetElement) return false
    // 如果目标元素的根节点是影子dom,返回true
    if (targetElement.getRootNode() instanceof ShadowRoot) return true
  })
}

// 获取影子dom
const getShadow = (node: TargetValue<Element>) => {
  if (!node) {
    return document
  }
  return node.getRootNode()
}

// 获取document或者影子dom
const getDocumentOrShadow = (target: BasicTarget | BasicTarget[]): Document | Node => {
  // 如果目标元素不存在或者目标元素的根节点不存在,返回document
  if (!target || !document.getRootNode) {
    return document
  }

  // 如果目标元素是数组,返回数组元素,否则返回目标元素组装的数组
  const targets = Array.isArray(target) ? target : [target]

  // 如果所有目标元素都在影子dom中,返回影子dom
  if (checkIfAllInShadow(targets)) {
    return getShadow(getTargetElement(targets[0]))
  }

  // 否则返回document
  return document
}

export default getDocumentOrShadow

如有转载或 CV 的请标注本站原文地址