diff --git a/packages/uni-app-plus/dist/uni-app-view.umd.js b/packages/uni-app-plus/dist/uni-app-view.umd.js index 7349c6bdc24f15fded17713543d0b056ac9f28cf..9d5e08861659a780e3647550cc35c41138846c39 100644 --- a/packages/uni-app-plus/dist/uni-app-view.umd.js +++ b/packages/uni-app-plus/dist/uni-app-view.umd.js @@ -15471,25 +15471,39 @@ return window.__$__(component).$; } } + function matches(element, selectors) { + const matches2 = element.matches || element.matchesSelector || element.mozMatchesSelector || element.msMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector || function(selectors2) { + const matches3 = this.parentElement.querySelectorAll(selectors2); + let i = matches3.length; + while (--i >= 0 && matches3.item(i) !== this) { + } + return i > -1; + }; + return matches2.call(element, selectors); + } function getNodesInfo(pageVm2, component, selector, single, fields) { - const parentElement = findElm(component, pageVm2).parentElement; + const selfElement = findElm(component, pageVm2); + const parentElement = selfElement.parentElement; if (!parentElement) { return single ? null : []; } if (single) { - const node = parentElement.querySelector(selector); + const node = selfElement.nodeType === 3 ? parentElement.querySelector(selector) : matches(selfElement, selector) ? selfElement : selfElement.querySelector(selector); if (node) { return getNodeInfo(node, fields); } return null; } else { let infos = []; - const nodeList = parentElement.querySelectorAll(selector); + const nodeList = (selfElement.nodeType === 3 ? parentElement : selfElement).querySelectorAll(selector); if (nodeList && nodeList.length) { [].forEach.call(nodeList, (node) => { infos.push(getNodeInfo(node, fields)); }); } + if (selfElement.nodeType !== 3 && matches(selfElement, selector)) { + infos.unshift(getNodeInfo(selfElement, fields)); + } return infos; } } diff --git a/packages/uni-h5/dist/uni-h5.es.js b/packages/uni-h5/dist/uni-h5.es.js index 2d8444ba7882c9a894f0041b77f02c2e16598c30..5f6cbc0bd9d1919a87c01c90984b77419cba599a 100644 --- a/packages/uni-h5/dist/uni-h5.es.js +++ b/packages/uni-h5/dist/uni-h5.es.js @@ -2072,25 +2072,39 @@ function findElm(component, pageVm) { } return component.$el; } +function matches(element, selectors) { + const matches2 = element.matches || element.matchesSelector || element.mozMatchesSelector || element.msMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector || function(selectors2) { + const matches3 = this.parentElement.querySelectorAll(selectors2); + let i = matches3.length; + while (--i >= 0 && matches3.item(i) !== this) { + } + return i > -1; + }; + return matches2.call(element, selectors); +} function getNodesInfo(pageVm, component, selector, single, fields2) { - const parentElement = findElm(component, pageVm).parentElement; + const selfElement = findElm(component, pageVm); + const parentElement = selfElement.parentElement; if (!parentElement) { return single ? null : []; } if (single) { - const node = parentElement.querySelector(selector); + const node = selfElement.nodeType === 3 ? parentElement.querySelector(selector) : matches(selfElement, selector) ? selfElement : selfElement.querySelector(selector); if (node) { return getNodeInfo(node, fields2); } return null; } else { let infos = []; - const nodeList = parentElement.querySelectorAll(selector); + const nodeList = (selfElement.nodeType === 3 ? parentElement : selfElement).querySelectorAll(selector); if (nodeList && nodeList.length) { [].forEach.call(nodeList, (node) => { infos.push(getNodeInfo(node, fields2)); }); } + if (selfElement.nodeType !== 3 && matches(selfElement, selector)) { + infos.unshift(getNodeInfo(selfElement, fields2)); + } return infos; } } @@ -18547,10 +18561,10 @@ function useState() { const minWidth = matchMedia.minWidth; topWindowMinWidth = checkMinWidth(minWidth) ? minWidth : topWindowMinWidth; } - const matches = initMediaQuery(topWindowMinWidth, (ev) => { + const matches2 = initMediaQuery(topWindowMinWidth, (ev) => { layoutState[`${prop}MediaQuery`] = ev.matches; }); - layoutState[`${prop}MediaQuery`] = matches; + layoutState[`${prop}MediaQuery`] = matches2; }); watch(() => layoutState.topWindowHeight, (value) => updateCssVar({ "--top-window-height": value + "px" diff --git a/packages/uni-h5/src/service/api/ui/requestComponentInfo.ts b/packages/uni-h5/src/service/api/ui/requestComponentInfo.ts index 3d5f0efbfe91071f8e24a101fdbbb2f4222af636..dea7e0ed4b4a95404c3f49943b2aa88b5bb0761c 100644 --- a/packages/uni-h5/src/service/api/ui/requestComponentInfo.ts +++ b/packages/uni-h5/src/service/api/ui/requestComponentInfo.ts @@ -110,6 +110,34 @@ export function findElm( return component.$el } +function matches(element: HTMLElement, selectors: string) { + type Matches = typeof element.matches + interface HTMLElementExt extends HTMLElement { + matchesSelector?: Matches + mozMatchesSelector?: Matches + msMatchesSelector?: Matches + oMatchesSelector?: Matches + } + + const matches = + element.matches || + (element as HTMLElementExt).matchesSelector || + (element as HTMLElementExt).mozMatchesSelector || + (element as HTMLElementExt).msMatchesSelector || + (element as HTMLElementExt).oMatchesSelector || + element.webkitMatchesSelector || + function (this: HTMLElement, selectors: string) { + const matches = (this.parentElement as HTMLElement).querySelectorAll( + selectors + ) + let i = matches.length + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1 + } + + return matches.call(element, selectors) +} + function getNodesInfo( pageVm: ComponentPublicInstance, component: ComponentPublicInstance | undefined | null, @@ -117,24 +145,36 @@ function getNodesInfo( single: boolean, fields: NodeField ): SelectorQueryNodeInfo | SelectorQueryNodeInfo[] | null { - const parentElement = findElm(component, pageVm).parentElement + const selfElement = findElm(component, pageVm) + const parentElement = selfElement.parentElement if (!parentElement) { return single ? null : [] } + // 使用片段时从父元素查找,会超出当前组件范围 if (single) { - const node = parentElement.querySelector(selector) as HTMLElement + const node = + selfElement.nodeType === 3 + ? (parentElement.querySelector(selector) as HTMLElement) + : matches(selfElement, selector) + ? selfElement + : (selfElement.querySelector(selector) as HTMLElement) if (node) { return getNodeInfo(node, fields) } return null } else { let infos: SelectorQueryNodeInfo[] = [] - const nodeList = parentElement.querySelectorAll(selector) + const nodeList = ( + selfElement.nodeType === 3 ? parentElement : selfElement + ).querySelectorAll(selector) if (nodeList && nodeList.length) { ;[].forEach.call(nodeList, (node) => { infos.push(getNodeInfo(node, fields)) }) } + if (selfElement.nodeType !== 3 && matches(selfElement, selector)) { + infos.unshift(getNodeInfo(selfElement, fields)) + } return infos } }