作者:蓝海00
转载链接:https://www.jianshu.com/p/eaccb1ea73f9
之前在网上找了一段代码,可以实现页面水印,但只实现了防止删除,用浏览器审查元素修改元素的属性并未拦截,display:none 直接没了... 故而只能放下我CV程序员的帽子自己丰富代码,新增了可配置某个页面关闭水印和防浏览器修改元素style和class。
- 新增一个ts文件命名随意
let watermark: any = {};// 水印文字let text: any = "默认";// 水印idconst id = '1.23452384164.123412416';let timeId: any = null;const setWatermark = (str: any) => { if (document.getElementById(id) !== null) { document.body.removeChild((document as any).getElementById(id)); } //创建一个画布 const can = document.createElement('canvas'); //设置画布的长宽 can.width = 120; can.height = 120; const cans: any = can.getContext('2d'); //旋转角度 cans.rotate(-15 * Math.PI / 180); cans.font = '18px Vedana'; //设置填充绘画的颜色、渐变或者模式 cans.fillStyle = 'rgba(200, 200, 200, 0.40)'; //设置文本内容的当前对齐方式 cans.textAlign = 'left'; //设置在绘制文本时使用的当前文本基线 cans.textBaseline = 'Middle'; //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置) cans.fillText(str, can.width / 8, can.height / 2); const div = document.createElement('div'); div.id = id; div.style.pointerEvents = 'none'; div.style.top = '0'; div.style.left = '0'; div.style.position = 'fixed'; div.style.zIndex = '100000'; div.style.width = document.documentElement.clientWidth + 'px'; div.style.height = document.documentElement.clientHeight + 'px'; div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'; document.body.appendChild(div); return id;}const config = { // childList: true, attributes: true, // characterData: true, subtree: true, attributeFilter: ["class", "style"] // attributeOldValue: true, // characterDataOldValue: true};const mutationCallback = (mutationList: any) => { for (const mutation of mutationList) { const type = mutation.type; switch (type) { case "childList": // id = setWatermark(str); // console.log("节点被删除或添加"); break; case "attributes": setWatermark(text); console.log(`${mutation.attributeName}属性修改了`); break; case "subtree": // console.log("子树被修改"); break; default: break; } }};// 创建 MutationObserver 实例const observer = new MutationObserver(mutationCallback);// 该方法只允许调用一次watermark.set = (str: any) => { text = str; let id = setWatermark(text); // 禁止删除 timeId = setInterval(() => { if (document.getElementById(id) === null) { id = setWatermark(text); } }, 500); // 开始监控目标节点 observer.observe(document.body, config); window.onresize = () => { setWatermark(text); };}// 关闭水印watermark.close = () => { clearInterval(timeId) const parent = document.body; const child = document.getElementById(id); if (child != null) { parent.removeChild(child); } observer.disconnect()}export default watermark;
- 直接调用
import Watermark from "@/utils/watermark"; - 开启水印
Watermark.set("蓝海") - 关闭水印
Watermark.close()
作者:蓝海00
转载链接:https://www.jianshu.com/p/eaccb1ea73f9