Skip to content

web 网页如何禁止别人移除水印

Posted on:2024年9月9日 at 13:16

防止DOM被删除

为了防止水印被删除,可以利用 MutationObserver API 监听 DOM 变化。MutationObserver 可以监控 DOM 树的变化并触发回调函数。回调函数可以用于检测水印是否被移除,并采取相应的措施进行恢复。

以下是一个示例代码,演示了如何使用 MutationObserver 监听 DOM 变化并检测水印的删除:

// 目标节点
const targetNode = document.body;

// 创建 MutationObserver 实例
const observer = new MutationObserver((mutationsList) => {
  mutationsList.forEach((mutation) => {
    // 检查是否有子节点被删除
    if (mutation.removedNodes.length > 0) {
      // 检查被删除的节点是否为水印
      // 如果是,则重新插入水印元素
      // targetNode.appendChild(watermarkElement);
    }
  });
});

// 配置 MutationObserver
const config = { childList: true, subtree: true };

// 开始观察目标节点
observer.observe(targetNode, config);

在上述代码中,我们创建了一个 MutationObserver 实例,并通过 observe 方法绑定到目标节点。在回调函数中,使用 mutation.removedNodes 检测子节点删除情况。如果发现水印被删除,可以在此处重新插入水印元素。

需要注意的是,MutationObserver 是现代浏览器的特性,可能不兼容老旧浏览器。因此,实际应用中应考虑浏览器兼容性。

此外,为了确保水印能迅速恢复,可以在检测到水印被删除时立即执行插入操作。

防止DOM被隐藏

除了防止DOM被删除,还要考虑DOM被隐藏的情况。

要检测到水印DOM被设置为 display: none 隐藏,可以通过 MutationObserver 观察元素的属性变化,而不是仅仅关注子节点的删除。监听 attributes 类型的变化,以检测到 display 样式属性的改变。

以下示例展示了如何监控 display 属性的变化:

// 目标节点(假设水印元素是一个特定的节点)
const watermarkElement = document.querySelector(".watermark");

// 创建 MutationObserver 实例
const observer = new MutationObserver((mutationsList) => {
  mutationsList.forEach((mutation) => {
    if (mutation.type === "attributes" && mutation.attributeName === "style") {
      // 检查水印的 display 属性是否被设置为 none
      if (getComputedStyle(watermarkElement).display === "none") {
        // 如果水印被隐藏,重新显示水印
        watermarkElement.style.display = "block";
      }
    }
  });
});

// 配置 MutationObserver
const config = { attributes: true, subtree: true, attributeFilter: ["style"] };

// 开始观察目标节点
observer.observe(document.body, config);

说明

  1. 目标节点:在代码中,watermarkElement 代表水印元素。请确保选择器正确。
  2. MutationObserver 实例:观察属性变化 (attributes) 和特定的属性 style
  3. 属性变化检测:在回调函数中,使用 getComputedStyle 检查 display 属性的值。如果水印被设置为 display: none,则将其恢复为 display: block
原文转自:https://fe.ecool.fun/topic/2dfa4a7b-6267-485f-9600-312a47ffedc8