自定义指令v-watermark
封装
const globalCanvas = null;
const globalWaterMark = null;
let style = `
display: block;
overflow: hidden;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-repeat: repeat;
pointer-events: none;`;
const getDataUrl = ({
font,
fillStyle,
textAlign,
textBaseline,
text,
rotate = -20,
}) => {
font = font || "16px normal";
fillStyle = fillStyle || "rgba(180, 180, 180, 0.2)";
text = text || "";
const canvas = globalCanvas || document.createElement("canvas");
const ctx = canvas.getContext("2d");
ctx.rotate((rotate * Math.PI) / 180);
ctx.font = font;
ctx.fillStyle = fillStyle;
ctx.textAlign = textAlign || "left";
ctx.textBaseline = textBaseline || "middle";
ctx.fillText(text, canvas.width / 10, canvas.height / 2);
return canvas.toDataURL("image/png", 1);
};
const setWaterMark = (el, binding) => {
const parentElement = el.parentElement;
const url = getDataUrl(binding);
const waterMark = globalWaterMark || document.createElement("div");
waterMark.className = "water-mark";
style = `${style}background-image: url(${url});`;
waterMark.setAttribute("style", style);
parentElement.setAttribute("style", "position: relative;");
parentElement.appendChild(waterMark);
};
const createObserver = (el, binding) => {
const waterMarkEl = el.parentElement.querySelector(".water-mark");
const observer = new MutationObserver((mutationsList) => {
if (mutationsList.length) {
const { removedNodes, type, target } = mutationsList[0];
const currStyle = waterMarkEl?.getAttribute("style");
if (removedNodes[0] === waterMarkEl) {
observer.disconnect();
init(el, { value: binding });
} else if (
type === "attributes" &&
target === waterMarkEl &&
currStyle !== style
) {
waterMarkEl.setAttribute("style", style);
}
}
});
observer.observe(el.parentElement, {
childList: true,
attributes: true,
subtree: true,
});
};
const init = (el, binding) => {
setWaterMark(el, binding.value);
createObserver(el, binding.value);
};
const directives = {
inserted(el, binding) {
init(el, binding);
},
};
export default {
name: "watermark",
directives,
};
使用
1、引入
main.js
import waterMark from './directives/waterMark.js'
Vue.directive('watermark', waterMark.directives)
2、使用
<div id="app" v-watermark="{ text: '绝密资料,请勿外传' }">
<router-view />
</div>
const prohibitOpenConsole = () => {
document.addEventListener('keydown', (e) => {
if (e.key === 'F12' || (e.ctrlKey && e.shiftKey && e.key === 'i') || (e.metaKey && e.altKey && e.key === 'i')) {
e.preventDefault()
e.returnValue = false
}
})
document.addEventListener('contextmenu', (e) => {
e.preventDefault()
e.returnValue = false
})
}