提交 19607018 编写于 作者: Q qiang

fix: 优化 getNodesInfo 查找范围

上级 bcbde2c7
......@@ -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;
}
}
......
......@@ -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"
......
......@@ -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
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册