61 lines
1.3 KiB
JavaScript
61 lines
1.3 KiB
JavaScript
import { nextTick } from "vue"
|
|
|
|
export function useWaitTarget() {
|
|
async function waitTarget(target, options = {}) {
|
|
const {
|
|
timeout = 5000,
|
|
interval = 50,
|
|
visible = false
|
|
} = options
|
|
|
|
const start = Date.now()
|
|
|
|
while (Date.now() - start < timeout) {
|
|
await nextTick()
|
|
let element = null
|
|
|
|
if (typeof target === "function") {
|
|
element = target()
|
|
}
|
|
else {
|
|
element = document.querySelector(target)
|
|
}
|
|
|
|
if (element) {
|
|
|
|
if (visible) {
|
|
const rect = element.getBoundingClientRect()
|
|
|
|
if (
|
|
rect.width === 0 ||
|
|
rect.height === 0
|
|
) {
|
|
await sleep(interval)
|
|
continue
|
|
}
|
|
}
|
|
|
|
return element
|
|
}
|
|
|
|
await sleep(interval)
|
|
}
|
|
|
|
console.warn(
|
|
`[Tour] Target not found:`,
|
|
target
|
|
)
|
|
|
|
return null
|
|
}
|
|
|
|
return {
|
|
waitTarget
|
|
}
|
|
}
|
|
|
|
function sleep(ms) {
|
|
return new Promise(resolve => {
|
|
setTimeout(resolve, ms)
|
|
})
|
|
} |