添加水印class封装

news/2025/11/3 10:55:23/文章来源:https://www.cnblogs.com/xinyouhunran/p/18380654
const _x = Symbol('x')
const _body = Symbol('body')
const _base64Url = Symbol('base64Url')
class Watermark {props: any;// targetNode: HTMLElement | null;// base64Url: string;// bodyWapper: any;// observerData: Array<any>;
    constructor(props) {this.props = props;this[_base64Url] = '';this[_body] = document.body; // 初始化,默认绑定bodythis[_x ] = []}/*** @description: 增加水印* @param {HTMLElement} wapper 包裹水印的父元素,传null时,默认body* @param {string} userName    水印显示的文本* @return {*}*/    add = (wapper, userName) => {if (wapper) {this[_body] = wapper;}this.creatImg(userName);this.addDom();this._mutationObserve();};addDom = () => {const targetNode = document.createElement('div');targetNode.setAttribute('class','info');targetNode.id = '__water-mark';targetNode.style.position = 'fixed';targetNode.style.left = '0';targetNode.style.top = '0';targetNode.style.width = '100vw';targetNode.style.height = '100vh';targetNode.style.background = `url(${this[_base64Url]}) repeat`;targetNode.style.opacity = '.5';targetNode.style.zIndex = '3000';targetNode.style.pointerEvents = 'none';this[_body] && this[_body].append(targetNode);}creatImg = (userName) => {const cavansDom: any = document.createElement('CANVAS');const ctx = cavansDom.getContext('2d');cavansDom.width = 110;cavansDom.height = 80;ctx.rotate((-20 * Math.PI) / 180);ctx.font = '13px Georgia';if (this.props.color) {ctx.fillStyle = this.props.color;} else {ctx.fillStyle = '#e6e3e3';}if (userName) {ctx.fillText(`${userName}`, 20, 50);} else {ctx.fillText('测试文字', 20, 50);}this[_base64Url] = cavansDom.toDataURL('image/png');}/*** @description: 更换水印文本* @param {string} userName* @return {*}*/    change = (userName) => {this.remove()this.add(null, userName)}/*** @description: 去除水印* @param {** @return {*}*/    remove = () => {const targetNode = document.getElementById('__water-mark')if (!targetNode) {return}this[_x ][0].disconnect()this[_x ][1].disconnect()this[_x ] = []this[_body].remove(targetNode);}_mutationObserve = () => {// 禁止修改水印节点const config = {childList: true,attributes: true,characterData: true,subtree: true,attributeOldValue: true,characterDataOldValue: true,};const mutationCallback = (mutationList) => {console.log(mutationList);for (const mutation of mutationList) {const type = mutation.type;console.log(type);switch (type) {case 'attributes':const targetNode = document.getElementById('__water-mark')if (mutation.attributeName === 'style' && targetNode) {targetNode.style.position = 'fixed';targetNode.style.left = '0';targetNode.style.top = '0';targetNode.style.width = '100vw';targetNode.style.height = '100vh';targetNode.style.background = `url(${this[_base64Url]}) repeat`;targetNode.style.opacity = '.5';targetNode.style.zIndex = '3000';targetNode.style.pointerEvents = 'none';}console.log(`${mutation.attributeName}属性修改了`);break;default:break;}}};const mutationCallback1 = (mutationList) => {console.log(mutationList);for (const mutation of mutationList) {const type = mutation.type;console.log(mutation);switch (type) {case 'childList':if (mutation.removedNodes.length > 0) {mutation.target.append(mutation.removedNodes[0])}console.log('节点被删除或添加');break;case 'subtree':console.log('子树被修改');break;default:break;}}};// 创建 MutationObserver 实例this[_x ][0] = new MutationObserver(mutationCallback);// 开始监控目标节点const targetNode = document.getElementById('__water-mark')this[_x ][0].observe(targetNode, config);// 创建 MutationObserver 实例this[_x ][1] = new MutationObserver(mutationCallback1);// 开始监控目标节点this[_x ][1].observe(this[_body], config);// 停止监控// observer.disconnect()
    };}export default Watermark;

使用方式:

const wapper = document.getElementById('xxx') // 包裹水印的父元素,如果传递的不是dom对象,默认body
const userName = 'xxx'                        // 要显示的水印文本,必须传字符串
Watermark.add(wapper, userName);//Watermark.remove(); // 谨慎调用

Watermark.change('xxx'); // 修改水印的文本

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/954334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业级AI知识库到底能做什么?PandaWiki重新定义知识生产力

企业级AI知识库到底能做什么?PandaWiki重新定义知识生产力“我们公司有海量的产品文档,但员工找份资料要花半小时…” “技术团队的经验都藏在个人电脑里,新人来了根本无从下手…” “客户咨询个简单问题,客服要翻…

对象存储系统MinIO详细以及部署

MinIO是一款开源高性能对象存储系统,核心特性包括100%兼容AWS S3 API、高可靠性(多副本/纠删码)、安全认证和易用部署。主要应用于非结构化数据存储、云原生架构配套、私有云替代等领域。支持单机和分布式两种部署模…

基于模拟电荷法的MATLAB输电线路铁塔电场分布计算

基于模拟电荷法(Charge Simulation Method, CSM)的MATLAB输电线路铁塔电场分布计算一、算法原理基本假设 导体表面电荷等效为离散线电荷 大地采用镜像法处理(单层均匀土壤) 忽略空气电离效应(工频场强<30kV/m)…

Jmeter汉化成中文版

1、jmeter安装成功后,默认启动是英文版 2、汉化方法 到jmeter安装目录下找到\bin\jmeter.properties,右键记事本打开定位“#language=en”,复制新增一行去掉注释“language=zh_CN”,保存文件 3、重启jmeter,显示为…

2025年新疆地坪厂家权威推荐榜单:环氧树脂地坪漆/环氧彩砂地坪/透水地坪源头厂家精选

在地坪行业竞争日益激烈的今天,新疆地区的地坪厂家凭借不断提升的技术实力和持续创新的产品体系,在区域市场中形成了独特的竞争优势。 据行业报告显示,中国地坪行业市场规模正以年均复合增长率超过8% 的速度持续扩张…

用docker搭建selenium grid分布式环境

使用Docker搭建Selenium Grid分布式环境的实践步骤:安装Docker:首先,确保您已经安装了Docker引擎。可以根据您的操作系统选择适当的安装方法并完成安装。 编写Docker Compose文件:创建一个名为docker-compose.yml的…

MATLAB动态规划设备分配

MATLAB动态规划设备分配 通过动态规划有效解决了设备分配问题,在MATLAB中可实现从基础到优化的完整解决方案。实际应用中建议结合实验数据对收益矩阵进行标定,并通过可视化工具分析分配模式。一、问题建模(设备分配…

一文掌握RMAN基础入门:核心概念、环境配置与命令格式全解析

一文掌握RMAN基础入门:核心概念、环境配置与命令格式全解析RMAN(Recovery Manager)是Oracle数据库专用的备份与恢复管理工具,凭借块级备份、自动校验、增量备份等优势,成为数据库运维中保障数据安全的核心工具。本…

UNI-APP设计电池电量显示

UNI-APP设计电池电量显示 1 <template>2 3 <view class="agv-footer">4 <view class="battery-info">5 <view class="battery-ic…

2025年知名的异型轴承座实力厂家TOP推荐榜

2025年知名的异型轴承座实力厂家TOP推荐榜 在工业制造领域,轴承座作为机械设备的关键部件,直接影响设备的运行稳定性和使用寿命。异型轴承座因其特殊的设计和定制化需求,对生产厂家的技术实力、制造工艺和售后服务…

2025 年 11 月皮拉尼真空计,单晶炉真空计厂家最新推荐,技术实力与市场口碑深度解析

引言 在光伏、半导体等高端制造领域,皮拉尼真空计与单晶炉真空计作为核心测量设备,其精度与稳定性直接决定生产工艺的可控性与产品合格率。据仪器仪表行业协会 2025 年报告显示,相关市场规模已达 86.3 亿元,国产化…

springboot 读取配置文件方式

------------------------------------------------------------------------------------------------------------ 在 Spring Boot 中,读取配置文件是非常常见的操作,配置文件通常包括 application.properties、ap…

启动Coze报了一个elasticsearch启动错误

排查是因为analysis-smartcn.zip 被公司 自动加密了,导致elasticsearch无法解析这个插件 解决办法:下载smartcn, 直接浏览器访问地址,根据当前es版本号替换地址中analysis-smartcn-{x.x.x}.zip https://artifacts.e…

2025 年 11 月压阻硅真空计,薄膜硅真空计,陶瓷电容真空计厂家最新推荐,实力品牌深度解析采购无忧之选!

引言 在半导体、光伏等高端制造领域,压阻硅、薄膜硅及陶瓷电容真空计作为核心测量设备,其精度与稳定性直接决定生产效能。当前市场规模持续扩大,预计 2025 年相关品类市场规模将占整体真空计市场的 45% 以上,但产品…

251103

目录JT-JY12T2S1 JT-JY12T2S1Good morning, Kenton festival box office, how can i help you? Oh, good morning.I am coming to Kenton for a few days holiday next month, and a friend told me there is a festi…

2025年浙江离婚律师权威推荐榜单:离婚财产纠纷律师/离婚纠纷律师/婚姻律师团队精选

近年来,浙江省离婚案件呈现持续增长态势。据司法大数据显示,全省离婚纠纷案件中涉及财产分割复杂的案件比例达42.7%,涉外婚姻案件五年内增长率达31.5%,这对离婚律师的专业能力提出了更高要求。本文基于律师资历、案…

2025年诚信的东莞温升试验机厂家实力及用户口碑排行榜

2025年诚信的东莞温升试验机厂家实力及用户口碑排行榜 在工业检测领域,温升试验机是评估电气设备安全性与可靠性的关键工具。随着市场对产品质量要求的提升,东莞作为制造业重镇,涌现出一批以技术为核心、服务为宗旨…

Oracle 手工备份恢复:DBA 必学的兜底技能,从原理到实操一步到位

Oracle 手工备份恢复:DBA 必学的兜底技能,从原理到实操一步到位本文从基础概念到实战案例,帮你吃透 Oracle UMAN 核心逻辑,关键时刻不慌神。 📚 一、先搞懂基础:3 个核心概念不踩坑 在动手操作前,这些 “底层逻…

2025年诚信的十级无尘车间品牌厂家排行榜

2025年诚信的十级无尘车间品牌厂家排行榜 在当今高科技产业快速发展的背景下,无尘车间已成为半导体、医药、食品、电子等行业不可或缺的基础设施。十级无尘车间(ISO Class 4)对空气洁净度要求极高,每立方米空气中…

2025 年 11 月高精度红外测温仪,双色红外测温仪,温炉红外测温仪厂家最新推荐,技术实力与市场口碑深度解析

引言 在工业制造、光伏能源、半导体等核心领域的智能化升级进程中,高精度、双色及温炉专用红外测温仪作为关键检测设备,其性能直接决定生产安全与产品合格率。据仪器仪表行业协会 2025 年《工业测温设备专项测评报告…