<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家平時在開發中或者在面試中,難免都會遇到一個問題——給頁面加水印,其實這並不難,但是也是有一些注意點的,所以說看似簡單的功能,要盡力做到:
其實實現水印並不難,只需要利用自定義指令 + canvas + background-image即可,實現起來也非常方便:
import type { Directive, App } from 'vue' interface Value { font?: string textColor?: string text?: string } const waterMarkId = 'waterMark' const canvasId = 'can' const drawWatermark = (el, value: Value) => { const { font = '16px Microsoft JhengHei', textColor = 'rgba(180, 180, 180, 0.3)', text = '三心大菜鳥', } = value // 建立一個canvas標籤 const canvas = document.getElementById(canvasId) as HTMLCanvasElement // 如果已有則不再建立 const can = canvas || document.createElement('canvas') can.id = canvasId el.appendChild(can) // 設定寬高 can.width = 400 can.height = 200 // 不可見 can.style.display = 'none' const ctx = can.getContext('2d')! // 設定畫布的樣式 ctx.rotate((-20 * Math.PI) / 180) ctx.font = font ctx.fillStyle = textColor ctx.textAlign = 'left' ctx.textBaseline = 'middle' ctx.fillText(text, can.width / 3, can.height / 2) // 水印容器 const waterMaskDiv = document.createElement('div') waterMaskDiv.id = waterMarkId // 設定容器的屬性樣式 // 將剛剛生成的canvas內容轉成圖片,並賦值給容器的 background-image 樣式 const styleStr = ` width: 100%; height: 100%; position: fixed; z-index: -1; top: 0; left: 0; pointer-events: none; background-image: url(${can.toDataURL('image/png')}) ` waterMaskDiv.setAttribute('style', styleStr) // 將水印容器放到目標元素下 el.appendChild(waterMaskDiv) return styleStr } const watermarkDirective: Directive = { mounted(el, { value }) { // 接收styleStr,後面可以用來對比 el.waterMarkStylestr = drawWatermark(el, value) } }
使用的時候直接以v-watermark
來使用:
<div v-watermark=" { text: '水印名稱', textColor: 'rgba(180, 180, 180, 0.3)' } " >
得到的效果如下:
咱們完成了水印功能,但是咱們來想一想,水印有啥用?或者說我們為什麼要給一個頁面加水印呢?答案就是:防偽
是的,我們的水印是用來防偽的,但是像我們剛剛那麼做真的能防偽嗎?我們回憶一下我們剛剛的加水印思路:
看似完成了水印功能,但是其實破綻百出!!!比如:
如果一切別有用心的人做了這兩件事,這都會導致我們頁面上剛剛所做的水印直接消失!!!
所以咱們得監控這些人的惡意行為,那咋做呢?MutationObserver
出場了!!!
MutationObserver
的具體用法大家可以去MDN
上看,這裡我就簡言意駭地說一下他的作用:監控DOM元素的變化
是的,它的作用就是:監控DOM元素的變化,所以他能阻止那些惡意使用者破壞水印,因為我們剛剛說了,惡意使用者可以使用以下兩種方法進行破壞水印:
而這兩點都涉及到DOM的修改,所以都會引起MutationObserver
的監控觸發,所以咱們可以利用MutationObserevr
來監控。這裡用到它的範例的兩個方法:
observe
:開啟監控DOM變化disconnect
:停止監控DOM變化const watermarkDirective: Directive = { mounted(el, { value }) { // 接收styleStr,後面可以用來對比 el.waterMarkStylestr = drawWatermark(el, value) // 先定義一個MutationObserver el.observer = new MutationObserver(() => { const instance = document.getElementById(waterMarkId) const style = instance?.getAttribute('style') const { waterMarkStylestr } = el // 修改樣式 || 刪除div if ((instance && style !== waterMarkStylestr) || !instance) { if (instance) { // div還在,說明只是修改style instance.setAttribute('style', waterMarkStylestr) } else { // div不在,說明刪除了div drawWatermark(el, value) } } }) // 啟動監控 el.observer.observe(document.body, { childList: true, attributes: true, subtree: true, }) }, unmounted(el) { // 指定元素銷燬時,記得停止監控 el.observer.disconnect() el.observer = null }, }
現在,你修改style
或者刪除容器div
,都會重新生成水印,這樣惡意使用者就無法得逞啦!!!當然可能還有漏洞,大家可以給給建議!!
以上就是MutationObserver在頁面水印實現起到的作用詳解的詳細內容,更多關於MutationObserver頁面水印的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45