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