之前在网上找了一段代码,可以实现页面水印,但只实现了防止删除,用浏览器审查元素修改元素的属性并未拦截,display:none 直接没了... 故而只能放下我CV程序员的帽子自己丰富代码,新增了可配置某个页面关闭水印和防浏览器修改元素style和class。
- 新增一个ts文件命名随意
let watermark: any = {};
// 水印文字
let text: any = "默认";
// 水印id
const 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()
网友评论