summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClariS <[email protected]>2023-09-01 17:27:19 +0800
committerGitHub <[email protected]>2023-09-01 17:27:19 +0800
commitbe7425d54dc8f8dc25a1953ff05501519042ed5c (patch)
tree85822cbda3d8584041550b667d49abf4ddc1af34
parent65530215e04b703bd0ea71cd8b9dc01defde12a0 (diff)
perf: 优化水印 hook (#127)
-rw-r--r--src/hooks/useWatermark.ts72
1 files changed, 41 insertions, 31 deletions
diff --git a/src/hooks/useWatermark.ts b/src/hooks/useWatermark.ts
index c435e71..1009860 100644
--- a/src/hooks/useWatermark.ts
+++ b/src/hooks/useWatermark.ts
@@ -61,31 +61,26 @@ export function useWatermark(parentEl: Ref<HTMLElement | null> = bodyEl) {
backupText = text
// 合并配置
mergeConfig = { ...defaultConfig, ...config }
- // 创建水印元素
- createWatermarkEl()
+ // 创建或更新水印元素
+ watermarkEl ? updateWatermarkEl() : createWatermarkEl()
// 是否监听水印元素和容器元素的变化
- mergeConfig.defense ? addElListener(parentEl.value) : removeListener()
+ addElListener(parentEl.value)
}
/** 创建水印元素 */
const createWatermarkEl = () => {
- if (watermarkEl) {
- updateWatermarkEl()
- return
- }
- const div = document.createElement("div")
- div.style.pointerEvents = "none"
- div.style.top = "0"
- div.style.left = "0"
- div.style.position = "absolute"
- div.style.zIndex = "99999"
- watermarkEl = div
+ watermarkEl = document.createElement("div")
+ watermarkEl.style.pointerEvents = "none"
+ watermarkEl.style.top = "0"
+ watermarkEl.style.left = "0"
+ watermarkEl.style.position = "absolute"
+ watermarkEl.style.zIndex = "99999"
const { clientWidth, clientHeight } = parentEl.value!
updateWatermarkEl({ width: clientWidth, height: clientHeight })
// 设置水印容器为相对定位
parentEl.value!.style.position = "relative"
// 将水印元素添加到水印容器中
- parentEl.value!.appendChild(div)
+ parentEl.value!.appendChild(watermarkEl)
}
/** 更新水印元素 */
@@ -124,8 +119,13 @@ export function useWatermark(parentEl: Ref<HTMLElement | null> = bodyEl) {
// 移除对水印元素和容器元素的监听
removeListener()
// 移除水印元素
- parentEl.value.removeChild(watermarkEl)
- watermarkEl = null
+ try {
+ parentEl.value.removeChild(watermarkEl)
+ } catch {
+ console.warn("水印元素已不存在,请重新创建")
+ } finally {
+ watermarkEl = null
+ }
}
/** 刷新水印(防御时调用) */
@@ -137,26 +137,36 @@ export function useWatermark(parentEl: Ref<HTMLElement | null> = bodyEl) {
/** 监听水印元素和容器元素的变化(DOM 变化 & DOM 大小变化) */
const addElListener = (targetNode: HTMLElement) => {
+ if (mergeConfig.defense) {
+ // 防止重复添加监听
+ if (!observer.watermarkElMutationObserver && !observer.parentElMutationObserver) {
+ // 监听 DOM 变化
+ addMutationListener(targetNode)
+ }
+ } else {
+ removeListener("mutation")
+ }
// 防止重复添加监听
- if (observer.watermarkElMutationObserver || observer.parentElMutationObserver || observer.parentElResizeObserver) {
- return
+ if (!observer.parentElResizeObserver) {
+ // 监听 DOM 大小变化
+ addResizeListener(targetNode)
}
- // 监听 DOM 变化
- addMutationListener(targetNode)
- // 监听 DOM 大小变化
- addResizeListener(targetNode)
}
- /** 移除对水印元素和容器元素的监听 */
- const removeListener = () => {
+ /** 移除对水印元素和容器元素的监听,传参可指定要移除哪个监听,不传默认移除全部监听 */
+ const removeListener = (kind: "mutation" | "resize" | "all" = "all") => {
// 移除 mutation 监听
- observer.watermarkElMutationObserver?.disconnect()
- observer.watermarkElMutationObserver = undefined
- observer.parentElMutationObserver?.disconnect()
- observer.parentElMutationObserver = undefined
+ if (kind === "mutation" || kind === "all") {
+ observer.watermarkElMutationObserver?.disconnect()
+ observer.watermarkElMutationObserver = undefined
+ observer.parentElMutationObserver?.disconnect()
+ observer.parentElMutationObserver = undefined
+ }
// 移除 resize 监听
- observer.parentElResizeObserver?.disconnect()
- observer.parentElResizeObserver = undefined
+ if (kind === "resize" || kind === "all") {
+ observer.parentElResizeObserver?.disconnect()
+ observer.parentElResizeObserver = undefined
+ }
}
/** 监听 DOM 变化 */