diff --git a/src/components/header.tsx b/src/components/header.tsx index 9ef0292..80661c2 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -66,7 +66,7 @@ export default function Header() { const navigate = useNavigate() // @ts-expect-error DisableAnimatedMan is a global variable - const disableAnimatedMan = window.DisableAnimatedMan === true + const disableAnimatedMan = window.DisableAnimatedMan as boolean return isDesktop ? (
diff --git a/src/lib/inject.ts b/src/lib/inject.ts index 81705fb..52a5bf5 100644 --- a/src/lib/inject.ts +++ b/src/lib/inject.ts @@ -1,104 +1,104 @@ export const InjectContext = (content: string) => { - const tempDiv = document.createElement("div") - tempDiv.innerHTML = content + const tempDiv = document.createElement("div") + tempDiv.innerHTML = content - const INJECTION_MARK = "data-injected" // 自定义属性标识 + const INJECTION_MARK = "data-injected" // 自定义属性标识 - // 清理已有的注入资源 - const cleanInjectedResources = () => { - document.querySelectorAll(`[${INJECTION_MARK}]`).forEach((node) => node.remove()) - } - - const loadExternalScript = (scriptElement: HTMLScriptElement): Promise => { - return new Promise((resolve, reject) => { - const script = document.createElement("script") - script.src = scriptElement.src - script.async = false // 保持顺序执行 - script.setAttribute(INJECTION_MARK, "true") // 添加标识 - script.onload = () => resolve() - script.onerror = () => reject(new Error(`Failed to load script: ${scriptElement.src}`)) - document.head.appendChild(script) - }) - } + // 清理已有的注入资源 + const cleanInjectedResources = () => { + document.querySelectorAll(`[${INJECTION_MARK}]`).forEach((node) => node.remove()) + } - const executeInlineScript = (scriptElement: HTMLScriptElement): void => { - const script = document.createElement("script") - script.textContent = scriptElement.textContent - script.setAttribute(INJECTION_MARK, "true") // 添加标识 - document.body.appendChild(script) - } + const loadExternalScript = (scriptElement: HTMLScriptElement): Promise => { + return new Promise((resolve, reject) => { + const script = document.createElement("script") + script.src = scriptElement.src + script.async = false // 保持顺序执行 + script.setAttribute(INJECTION_MARK, "true") // 添加标识 + script.onload = () => resolve() + script.onerror = () => reject(new Error(`Failed to load script: ${scriptElement.src}`)) + document.head.appendChild(script) + }) + } - const loadStyle = (styleElement: HTMLStyleElement): Promise => { - return new Promise((resolve, reject) => { - if ((styleElement as any).href) { - // 处理 - const link = document.createElement("link") - link.rel = "stylesheet" - link.href = (styleElement as any).href - link.setAttribute(INJECTION_MARK, "true") // 添加标识 - link.onload = () => resolve() - link.onerror = () => reject(new Error(`Failed to load stylesheet: ${link.href}`)) - document.head.appendChild(link) - } else { - const style = document.createElement("style") - style.textContent = styleElement.textContent - style.setAttribute(INJECTION_MARK, "true") // 添加标识 - document.head.appendChild(style) - resolve() - } - }) - } + const executeInlineScript = (scriptElement: HTMLScriptElement): void => { + const script = document.createElement("script") + script.textContent = scriptElement.textContent + script.setAttribute(INJECTION_MARK, "true") // 添加标识 + document.body.appendChild(script) + } - const handlers: { [key: string]: (element: HTMLElement) => Promise } = { - SCRIPT: (element) => { - const scriptElement = element as HTMLScriptElement - if (scriptElement.src) { - // 加载外部脚本 - return loadExternalScript(scriptElement) - } else { - // 推迟执行内联脚本,后续手动执行 - return Promise.resolve() - } - }, - STYLE: (element) => loadStyle(element as HTMLStyleElement), - META: (element) => { - const meta = element.cloneNode(true) as HTMLElement - meta.setAttribute(INJECTION_MARK, "true") // 添加标识 - document.head.appendChild(meta) // 将 meta 标签插入到 - return Promise.resolve() - }, - DEFAULT: (element) => { - element.setAttribute(INJECTION_MARK, "true") // 添加标识 - document.body.appendChild(element) - return Promise.resolve() - }, - } + const loadStyle = (styleElement: HTMLStyleElement): Promise => { + return new Promise((resolve, reject) => { + if ((styleElement as any).href) { + // 处理 + const link = document.createElement("link") + link.rel = "stylesheet" + link.href = (styleElement as any).href + link.setAttribute(INJECTION_MARK, "true") // 添加标识 + link.onload = () => resolve() + link.onerror = () => reject(new Error(`Failed to load stylesheet: ${link.href}`)) + document.head.appendChild(link) + } else { + const style = document.createElement("style") + style.textContent = styleElement.textContent + style.setAttribute(INJECTION_MARK, "true") // 添加标识 + document.head.appendChild(style) + resolve() + } + }) + } - // 开始注入前清理已有资源 - cleanInjectedResources() + const handlers: { [key: string]: (element: HTMLElement) => Promise } = { + SCRIPT: (element) => { + const scriptElement = element as HTMLScriptElement + if (scriptElement.src) { + // 加载外部脚本 + return loadExternalScript(scriptElement) + } else { + // 推迟执行内联脚本,后续手动执行 + return Promise.resolve() + } + }, + STYLE: (element) => loadStyle(element as HTMLStyleElement), + META: (element) => { + const meta = element.cloneNode(true) as HTMLElement + meta.setAttribute(INJECTION_MARK, "true") // 添加标识 + document.head.appendChild(meta) // 将 meta 标签插入到 + return Promise.resolve() + }, + DEFAULT: (element) => { + element.setAttribute(INJECTION_MARK, "true") // 添加标识 + document.body.appendChild(element) + return Promise.resolve() + }, + } - const externalScriptQueue: Promise[] = [] + // 开始注入前清理已有资源 + cleanInjectedResources() - Array.from(tempDiv.childNodes).forEach((node) => { - if (node.nodeType === Node.ELEMENT_NODE) { - const element = node as HTMLElement - if (element.tagName === "SCRIPT" && !(element as HTMLScriptElement).src) { - // 直接执行内联脚本 - executeInlineScript(element as HTMLScriptElement) - } else { - const handler = handlers[element.tagName] || handlers.DEFAULT - externalScriptQueue.push(handler(element)) - } - } else if (node.nodeType === Node.TEXT_NODE) { - document.body.appendChild(document.createTextNode(node.textContent || "")) - } - }) + const externalScriptQueue: Promise[] = [] - return Promise.all(externalScriptQueue) - .then(() => { - console.log("All resources have been injected successfully.") - }) - .catch((error) => { - console.error("Error during resource injection:", error) + Array.from(tempDiv.childNodes).forEach((node) => { + if (node.nodeType === Node.ELEMENT_NODE) { + const element = node as HTMLElement + if (element.tagName === "SCRIPT" && !(element as HTMLScriptElement).src) { + // 直接执行内联脚本 + executeInlineScript(element as HTMLScriptElement) + } else { + const handler = handlers[element.tagName] || handlers.DEFAULT + externalScriptQueue.push(handler(element)) + } + } else if (node.nodeType === Node.TEXT_NODE) { + document.body.appendChild(document.createTextNode(node.textContent || "")) + } }) + + return Promise.all(externalScriptQueue) + .then(() => { + console.log("All resources have been injected successfully.") + }) + .catch((error) => { + console.error("Error during resource injection:", error) + }) }