当前位置: 首页 > news >正文

页面增加水印及水印防删

从以下几点判断水印消失:
1.选用canvas 防止水印内容篡改
2.选用MutationObserver 监听水印的style属性是否被篡改和监听水印元素是否被删除
3.定时更新元素的z-index动态计算最大层级
watermark.js

let obj = JSON.parse(window.localStorage.getItem("User"));
let watermarkUrl = createWatermark([obj.name, obj.account]);
function createWatermark (text = '默认水印') {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');// 设置canvas尺寸canvas.width = 200;canvas.height = 150;// 旋转文字ctx.rotate((-15 * Math.PI) / 180);// 设置文字样式ctx.font = '20px Microsoft YaHei';ctx.fillStyle = 'rgba(0, 0, 0,0.1)';ctx.textAlign = 'center';ctx.textBaseline = 'middle';// 绘制文字(支持多行)const texts = Array.isArray(text) ? text : [text];texts.forEach((line, i) => {ctx.fillText(line, canvas.width / 2, canvas.height / 2 + i * 20);});// 转为图片URLreturn canvas.toDataURL('image/png');
}// 计算页面中最大的z-index
function getMaxZIndex () {// 获取所有可见元素const elements = document.querySelectorAll('body *:not(.watermark-layer)');let maxZ = 10; // 默认最低层级(确保至少高于普通内容)elements.forEach(el => {const position = window.getComputedStyle(el).position;// 只处理有定位的元素(z-index对static无效)if (position !== 'static') {const zIndex = window.getComputedStyle(el).zIndex;if (zIndex !== 'auto') {const z = parseInt(zIndex, 10);if (!isNaN(z) && z > maxZ) {maxZ = z;}}}});return maxZ;
}
let styleStr = `position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-image: url(${watermarkUrl});background-repeat: repeat;pointer-events: none; z-index: ${getMaxZIndex() + 1};`
// 闭包封装水印防护逻辑
export function initWatermark () {console.log('创建元素');// 创建水印元素(初始层级为最大z-index +1)let watermarkEl = document.createElement('div');watermarkEl.className = 'watermark-layer';watermarkEl.style.cssText = styleStrdocument.body.appendChild(watermarkEl);const observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {const watermarkEl = document.querySelector('.watermark-layer');if (!watermarkEl) {console.log('水印被删除,重新创建')observer.disconnect();initWatermark();}if (mutation.attributeName === 'style' && watermarkEl && watermarkEl.getAttribute('style') !== styleStr) {// 样式变化时,重新设置console.log('样式变化时,重新设置', styleStr)watermarkEl.setAttribute('style', styleStr);}});});observer.observe(document.body, {attributes: true,childList: true,subtree: true,});// 定时检查zIndexconst checkTimer = setInterval(() => {zIndex();}, 300)// 清理函数 return () => {observer.disconnect();clearInterval(checkTimer);};}// 层级
function zIndex () {styleStr = `position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-image: url(${watermarkUrl});background-repeat: repeat;pointer-events: none; z-index: ${getMaxZIndex() + 1};`const watermarkEl = document.querySelector('.watermark-layer');watermarkEl.setAttribute('style', styleStr);
}

main.vue

import { initWatermark } from '@/utils/watermark';  //引入
export default {data(){return{watermarkCleanup: null,}}
created(){//创建水印并保存清理函数const watermarkEl = document.querySelector('.watermark-layer');if (!watermarkEl) {// 保存清理函数的引用this.watermarkCleanup = initWatermark();}
}beforeDestroy () {// 调用清理函数来关闭定时器和页面元素监听if (this.watermarkCleanup) {this.watermarkCleanup();}}
}
如有遗漏,欢迎指教补充
http://www.jsqmd.com/news/25719/

相关文章:

  • onBeforeMount 和 onMounted区分总结
  • 2025年超导电缆制造厂权威推荐榜单:铜线电缆/感温电缆/国标电缆源头厂家精选
  • Linux应用(6)——网络通信/TCP/IP - 详解
  • 2025 年 pe 板源头厂家最新推荐榜,技术实力与市场口碑深度解析,精选优质企业pp 板 pe 板/耐腐蚀 pe 板/耐磨 pe 板公司推荐
  • ArkTS语言(五)
  • 2025 年铝塑板厂家最新推荐榜,从技术研发到市场服务多维度考量,企业综合实力与产品竞争力深度剖析网纹/磨砂/大理石/木纹/幻彩铝塑板公司推荐
  • 小白指南:Apache DolphinScheduler 补数据功能实操演示
  • C++程序(胡言乱语版)
  • 2025 年干洗机源头厂家最新推荐榜,技术实力与市场口碑深度解析,助力精准选购干洗机设备/工业干洗机/商用干洗机/洗衣房干洗机公司推荐
  • 2025 年干洗机源头厂家最新推荐榜,技术实力与市场口碑深度解析,助力精准选购干洗机设备/工业干洗机/商用干洗机/洗衣房干洗机公司推荐
  • 关于如何解决HP笔记本键盘失灵的方法
  • ({behavior: smooth}) 在移动端不生效的问题解决 ios不平滑,使用smoothscroll-polyfill(页面平滑滚动)插件
  • 2025 年洗脱机源头厂家最新推荐榜,技术实力与市场口碑深度解析,甄选靠谱优质品牌隔离式双扉洗脱机/商用洗脱机/洗衣房洗脱机公司推荐
  • ArkTS语言(三)
  • 基于第三方heleket api接入usdt支付
  • 2025年激光熔覆涂层制造厂权威推荐:熔覆激光/高速激光熔覆/激光熔覆源头厂家精选
  • Legacy模式虚拟机,grub文件丢失如何处理
  • 2025年省电中央空调品牌权威推荐榜单:双出风中央空调/一拖四中央空调/智能中央空调品牌精选
  • 魔域电脑版下载安装教程:重返经典魔幻世界的完整攻略(含新手入门+登录异常修复)
  • 学术会议会议合集 | 大数据、智慧医学 、数据管理 、计算机科学 、管理科学等EI会议合集
  • K8S使用开源CEPH作为后端StorageClass
  • 2025 年锅炉厂家最新推荐榜:智能控制与稳定可靠品牌综合测评结果及优质厂商名单电锅炉/蒸汽锅炉/燃气锅炉/燃油锅炉/电蒸汽锅炉公司推荐
  • 如何编译打包OpenSSH 9.4并实现批量升级
  • Python自动化之Docx文档处理(二)
  • Python自动化之Docx文档处理(一)
  • 替换 Android APEX 下属动态库的方法
  • 配置管理工具-Confd
  • 探索Go语言性能优化:全面解析pprof工具
  • Bcache详解及踩坑记录
  • HDD介质OSD新增SSD或NVME类型的DB或WAL分区