JavaScript 는 사용자 가 그림 을 저장 하 는 실현 코드 를 금지 합 니 다.
이 를 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 로 전환 하여 사용자 가 사용 하지 않도록 하 는 것
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 로 바 꾸 고 데이터 전송 도 암호 화 되 어 일반 사용자 가 복사/다운로드 하려 는 행 위 를 어느 정도 방지 할 수 있 습 니 다.
자 바스 크 립 트 에서 사용자 가 그림 을 저장 하지 못 하 게 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 js 에서 그림 을 저장 하지 못 하 게 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.