玖叶教程网

前端编程开发入门

页面水印 (防删、防浏览器修改元素、可配置关闭)



作者:蓝海00

转载链接:https://www.jianshu.com/p/eaccb1ea73f9

之前在网上找了一段代码,可以实现页面水印,但只实现了防止删除,用浏览器审查元素修改元素的属性并未拦截,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()


作者:蓝海00
转载链接:https://www.jianshu.com/p/eaccb1ea73f9

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言