mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-06 16:16:42 +08:00
Improve element selector generation for scroll position tracking
Co-authored-by: jxxghp <jxxghp@163.com>
This commit is contained in:
@@ -73,12 +73,12 @@ export class StateCollector {
|
|||||||
|
|
||||||
scrollContainers.forEach(selector => {
|
scrollContainers.forEach(selector => {
|
||||||
const elements = document.querySelectorAll(selector)
|
const elements = document.querySelectorAll(selector)
|
||||||
elements.forEach((element, index) => {
|
elements.forEach((element) => {
|
||||||
if (element.scrollTop > 0 || element.scrollLeft > 0) {
|
if (element.scrollTop > 0 || element.scrollLeft > 0) {
|
||||||
positions.push({
|
positions.push({
|
||||||
x: element.scrollLeft,
|
x: element.scrollLeft,
|
||||||
y: element.scrollTop,
|
y: element.scrollTop,
|
||||||
element: `${selector}:nth-of-type(${index + 1})`
|
element: this.generateElementSelector(element)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -222,8 +222,8 @@ export class StateCollector {
|
|||||||
|
|
||||||
const scrollableElements = element.querySelectorAll('[class*="overflow"], .v-card-text')
|
const scrollableElements = element.querySelectorAll('[class*="overflow"], .v-card-text')
|
||||||
if (scrollableElements.length > 0) {
|
if (scrollableElements.length > 0) {
|
||||||
data.scrollPositions = Array.from(scrollableElements).map((el, index) => ({
|
data.scrollPositions = Array.from(scrollableElements).map((el) => ({
|
||||||
selector: `${element.className}:nth-of-type(${index + 1}) [class*="overflow"]`,
|
selector: this.generateElementSelector(el),
|
||||||
x: el.scrollLeft,
|
x: el.scrollLeft,
|
||||||
y: el.scrollTop
|
y: el.scrollTop
|
||||||
}))
|
}))
|
||||||
@@ -232,6 +232,53 @@ export class StateCollector {
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static generateElementSelector(element: Element): string {
|
||||||
|
if (element.id) {
|
||||||
|
return `#${element.id}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const path = []
|
||||||
|
let current = element
|
||||||
|
|
||||||
|
while (current && current !== document.body) {
|
||||||
|
let selector = current.tagName.toLowerCase()
|
||||||
|
|
||||||
|
if (current.id) {
|
||||||
|
selector += `#${current.id}`
|
||||||
|
path.unshift(selector)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current.className) {
|
||||||
|
const classes = current.className.split(/\s+/).filter(c => c && !c.includes('v-'))
|
||||||
|
if (classes.length > 0) {
|
||||||
|
selector += `.${classes[0]}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use nth-child instead of nth-of-type, but only when necessary
|
||||||
|
const parent = current.parentElement
|
||||||
|
if (parent) {
|
||||||
|
const siblings = Array.from(parent.children).filter(child =>
|
||||||
|
child.tagName === current.tagName &&
|
||||||
|
child.className === current.className
|
||||||
|
)
|
||||||
|
|
||||||
|
if (siblings.length > 1) {
|
||||||
|
const index = siblings.indexOf(current) + 1
|
||||||
|
selector += `:nth-child(${index})`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
path.unshift(selector)
|
||||||
|
current = current.parentElement as Element
|
||||||
|
|
||||||
|
if (path.length >= 4) break
|
||||||
|
}
|
||||||
|
|
||||||
|
return path.join(' > ')
|
||||||
|
}
|
||||||
|
|
||||||
private static getFieldSelector(element: HTMLInputElement): string {
|
private static getFieldSelector(element: HTMLInputElement): string {
|
||||||
if (element.id) return `#${element.id}`
|
if (element.id) return `#${element.id}`
|
||||||
if (element.name) return `[name="${element.name}"]`
|
if (element.name) return `[name="${element.name}"]`
|
||||||
|
|||||||
Reference in New Issue
Block a user