日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript 禁止用戶保存圖片的實現代碼

瀏覽:39日期:2023-06-21 13:56:18

添加事件禁止選擇、拖拽、右鍵(簡單的禁止用戶保存圖片,但無法阻止用戶打開控制臺查看,或是直接抓包)將之轉換為 canvas(讓瀏覽器認為不是圖片以此禁止用戶對之進行圖片的操作,但無法阻止抓包)禁止用戶使用控制臺查看源碼(阻止瀏覽器打開控制臺,但無法阻止抓包)傳輸圖片使用自定義格式(可以阻止抓包,但需要后臺配合)

注:以下內容使用 react+ts 實現

添加事件禁止選擇、拖拽、右鍵

簡而言之,這是一種簡單有效的方式,能夠在用戶不打開控制臺的情況下阻止用戶保存圖片。

export function preventDefaultListener(e: any) { e.preventDefault()};<img src={props.url} alt='' style={{ //禁止用戶選擇 userSelect: ’none’, //禁止所有鼠標事件,過于強大,圖片僅用于展示可用 // pointerEvents: ’none’, }} onTouchStart={preventDefaultListener} onContextMenu={preventDefaultListener} onDragStart={preventDefaultListener}/>

參考:https://www.jb51.net/article/185677.htm

將之轉換為 canvas

另一種思路是將圖片轉換為 canvas 避免用戶使用img相關的操作。

將圖片轉成 canvas

export async function imageToCanvas(url: string, canvas: HTMLCanvasElement) { return new Promise((resolve, reject) => { //新建Image對象,引入當前目錄下的圖片 const img = new Image() img.src = url const c = canvas.getContext(’2d’)! //圖片初始化完成后調用 img.onload = function () { //將canvas的寬高設置為圖像的寬高 canvas.width = img.width canvas.height = img.height //canvas畫圖片 c.drawImage(img, 0, 0, img.width, img.height) resolve() } img.addEventListener(’error’, (e) => { reject(e) }) })}

禁用 canvas 事件

const throwFn = () => { throw new Error( 'Uncaught DOMException: Failed to execute ’toDataURL’ on ’HTMLCanvasElement’: Tainted canvases may not be exported.', )}const $canvasRef = useRef<HTMLCanvasElement>(null) useEffect(() => { ;(async () => { await imageToCanvas(props.url, $canvasRef.current!) $canvasRef.current!.toBlob = throwFn $canvasRef.current!.toDataURL = throwFn })() }, []) return ( <canvas ref={$canvasRef} onTouchStart={preventDefaultListener} onContextMenu={preventDefaultListener} /> )

禁止用戶使用控制臺查看源碼

如果能禁止用戶操作控制臺,那么自然能夠避免用戶查看源碼了,下面是一個簡單的實現。

/** * 兼容異步函數的返回值 * @param res 返回值 * @param callback 同步/異步結果的回調函數 * @typeparam T 處理參數的類型,如果是 Promise 類型,則取出其泛型類型 * @typeparam Param 處理參數具體的類型,如果是 Promise 類型,則指定為原類型 * @typeparam R 返回值具體的類型,如果是 Promise 類型,則指定為 Promise 類型,否則為原類型 * @returns 處理后的結果,如果是同步的,則返回結果是同步的,否則為異步的 */export function compatibleAsync<T = any, Param = T | Promise<T>, R = T>( res: Param, callback: (r: T) => R,): Param extends Promise<T> ? Promise<R> : R { return (res instanceof Promise ? res.then(callback) : callback(res as any)) as any}/** * 測試函數的執行時間 * 注:如果函數返回 Promise,則該函數也會返回 Promise,否則直接返回執行時間 * @param fn 需要測試的函數 * @returns 執行的毫秒數 */export function timing<R>( fn: (...args: any[]) => R, // 函數返回類型是 Promise 的話,則返回 Promise<number>,否則返回 number): R extends Promise<any> ? Promise<number> : number { const begin = performance.now() const res = fn() return compatibleAsync(res, () => performance.now() - begin)}/** * 禁止他人調試網站相關方法的集合對象 */export class AntiDebug { /** * 不停循環 debugger 防止有人調試代碼 * @returns 取消函數 */ public static cyclingDebugger(): Function { const res = setInterval(() => { debugger }, 100) return () => clearInterval(res) } /** * 檢查是否正在 debugger 并調用回調函數 * @param fn 回調函數,默認為重載頁面 * @returns 取消函數 */ public static checkDebug( fn: Function = () => window.location.reload(), ): Function { const res = setInterval(() => { const diff = timing(() => { debugger }) if (diff > 500) { console.log(diff) fn() } }, 1000) return () => clearInterval(res) }}

useEffect(() => { const cancel1 = AntiDebug.cyclingDebugger() as any const cancel2 = AntiDebug.checkDebug(() => console.log(’請不要打開調試’), ) as any return () => { cancel1() cancel2() }}, [])return <img src={url} alt='' />

傳輸圖片使用自定義格式

該功能需要服務端配合,故而此處贊不實現,可以參考微信讀書,就是將文本轉為 canvas,數據傳輸也進行了加密,可以在很大程度上防止普通用戶想要復制/下載的行為了。

到此這篇關于JavaScript 禁止用戶保存圖片的文章就介紹到這了,更多相關js 禁止保存圖片內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产乱子精品免费女| 女人av一区| 亚洲免费中文| 国产在线日韩| 久久久久久网| 美女黄网久久| 国产剧情一区二区在线观看| 久久av超碰| 亚洲天堂资源| 亚洲一二三区视频| 亚洲一区免费| 美腿丝袜在线亚洲一区| 91日韩在线| 日韩三区四区| 国产精品超碰| 国产一区二区三区四区五区| 91高清一区| 国产欧美一区二区三区精品观看 | 久久精品观看| 青青草精品视频| 久久裸体视频| 亚洲精品美女| 在线中文字幕播放| 日本不卡一区二区| 精品不卡一区| 爽好多水快深点欧美视频| 日韩av午夜在线观看| 精品国产乱码| 日韩一区二区三免费高清在线观看| 久久免费国产| 国产精品v日韩精品v欧美精品网站 | 激情婷婷综合| 中文字幕成在线观看| 亚洲我射av| 欧美日韩精品一本二本三本 | 黄色av一区| 成人精品高清在线视频| 蜜臀精品一区二区三区在线观看 | 一区二区小说| 精品1区2区3区4区| 国产一区二区三区日韩精品| 91精品丝袜国产高跟在线| 日韩精品一级二级 | 日本大胆欧美人术艺术动态| 亚洲精品888| 不卡一区2区| 久久国产日韩| 国产亚洲一级| 综合视频一区| 午夜电影一区| 国产欧美一级| 精品一区视频| 久久三级福利| 欧美aa国产视频| 亚洲综合日本| 欧美欧美黄在线二区| 日韩不卡一区二区三区| 欧美日韩激情| 国产亚洲精品精品国产亚洲综合| 亚洲香蕉视频| 亚洲精品影视| 久久国产福利| 美女久久一区| 黑丝美女一区二区| 尹人成人综合网| 亚洲激情中文| 亚洲深夜av| 亚洲精品视频一二三区| 亚洲欧美网站在线观看| 婷婷久久免费视频| 亚洲精品护士| 激情自拍一区| 99久久婷婷| 成人av二区| 国产精品嫩草99av在线| 丝袜a∨在线一区二区三区不卡| 999国产精品999久久久久久| 三级精品视频| 免费在线观看成人| 日韩av中文字幕一区二区三区| 日韩国产欧美三级| 久久中文字幕导航| 日韩国产专区| 亚洲激情欧美| 日本中文字幕一区二区视频 | 福利一区在线| 欧美成a人国产精品高清乱码在线观看片在线观看久| 精品一区二区三区中文字幕在线| 欧美久久天堂| 99成人在线视频| 亚洲精选91| 国产精品qvod| 精品国产美女a久久9999| 久久久久久网| 九九在线精品| 亚洲日本三级| 老司机精品在线| 日韩亚洲一区在线| 毛片在线网站| 欧美xxxx中国| 国产91精品对白在线播放| 美女少妇全过程你懂的久久| 亚洲精品成人一区| 成人午夜毛片| 午夜性色一区二区三区免费视频| 黄毛片在线观看| 日韩一区二区三区高清在线观看| 欧美精品资源| 欧美激情日韩| 亚洲精品一区二区在线播放∴| sm捆绑调教国产免费网站在线观看 | 久久字幕精品一区| 热久久久久久久| a日韩av网址| 国产一区2区| 国产美女撒尿一区二区| 亚洲免费网址| 免费久久99精品国产自在现线| 久久国产主播| 亚洲天堂一区二区| 加勒比视频一区| 国产精品jk白丝蜜臀av小说| 日韩一区二区三区精品| 香蕉久久久久久久av网站| 黄页网站一区| 欧美日韩激情| 国模 一区 二区 三区| 97国产精品| 亚洲精品一级二级| se01亚洲视频| 欧美不卡高清| 一区三区视频| 视频一区欧美日韩| 亚洲精品成a人ⅴ香蕉片| 五月亚洲婷婷 | 婷婷视频一区二区三区| 日本vs亚洲vs韩国一区三区二区| 日韩精品一级二级| 亚洲不卡视频| 国产日韩高清一区二区三区在线 | 天堂成人免费av电影一区| 蜜臀av一区二区三区| 亚洲激情二区| 日本麻豆一区二区三区视频| 久久国内精品视频| 国产美女撒尿一区二区| 牛牛精品成人免费视频| 在线一区av| 国产午夜久久| 国产免费av一区二区三区| 国产suv精品一区二区四区视频| 99久久夜色精品国产亚洲1000部| 亚洲激情五月| 国产亚洲电影| 久久精品影视| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品久久久久av蜜臀| 国产精品久久久久毛片大屁完整版| 国产精品久久久久蜜臀| 中文字幕视频精品一区二区三区| 国产精品v亚洲精品v日韩精品| 国产超碰精品| 日韩激情啪啪| 激情综合在线| 国产精品亚洲成在人线| 夜夜嗨av一区二区三区网站四季av| 日韩精品免费一区二区夜夜嗨| 成人在线黄色| 日本99精品| 国产一区日韩一区| 高潮久久久久久久久久久久久久| 蜜桃免费网站一区二区三区| 国产精品久久久免费| 99亚洲视频| 色天使综合视频| 国产探花在线精品一区二区| 亚洲激情av| 97精品在线| 久久99精品久久久野外观看| 人在线成免费视频| 国产一区二区三区四区大秀| 久久精品av麻豆的观看方式| 男女男精品视频网| 久久麻豆精品| 久久午夜影院| 视频一区二区三区在线| 亚洲v在线看| 国产乱码精品一区二区三区四区| 伊人精品久久| 亚洲精品麻豆| 亚洲人www| 蜜臀精品一区二区三区在线观看| 亚洲性图久久| 91精品国产调教在线观看| а√天堂8资源中文在线| 精品国产精品久久一区免费式 | 大香伊人久久精品一区二区| 国产极品久久久久久久久波多结野| 日韩在线网址| 91成人精品在线|