用于防止頁面內容被復制、剪切或通過右鍵菜單操作。它接受三個可配置參數:disableCopy
(禁用復制,默認true)、disableCut
(禁用剪切,默認true)和?disableContextMenu
(禁用右鍵菜單,默認true)。通過監聽?copy
、cut?
和?contextmenu?
事件并阻止默認行為來實現防復制功能,并在組件卸載時自動移除事件監聽器。該Hook使用?useEffect?
管理事件監聽器的生命周期,確保只有在配置參數變化時才重新添加/移除監聽器。
?useAntiCopy - 用于在頁面中禁用復制、剪切和右鍵菜單行為的 Hook。
- ?param options 配置項:
- ?? ?disableCopy:是否禁用復制操作(默認 true)
- ?? ?disableCut:是否禁用剪切操作(默認 true)
- ?? ?disableContextMenu:是否禁用右鍵菜單(默認 true)
import { useEffect } from 'react';/*** useAntiCopy - 用于在頁面中禁用復制、剪切和右鍵菜單行為的 Hook。** @param options 配置項:* - disableCopy:是否禁用復制操作(默認 true)* - disableCut:是否禁用剪切操作(默認 true)* - disableContextMenu:是否禁用右鍵菜單(默認 true)*/
interface UseAntiCopyOptions {disableCopy?: boolean;disableCut?: boolean;disableContextMenu?: boolean;
}export const useAntiCopy = (props: UseAntiCopyOptions = {}) => {const { disableCopy, disableCut, disableContextMenu } = props;// 處理復制事件const handleCopy = (e: ClipboardEvent) => {if (disableCopy) {e.preventDefault(); // 阻止默認的復制行為}};// 處理剪切事件const handleCut = (e: ClipboardEvent) => {if (disableCut) {e.preventDefault(); // 阻止默認的剪切行為}};// 處理右鍵菜單事件const handleContextMenu = (e: MouseEvent) => {if (disableContextMenu) {e.preventDefault(); // 阻止右鍵菜單彈出}};// 使用 useEffect 管理事件監聽器的生命周期useEffect(() => {// 添加事件監聽器if (disableCopy) {document.addEventListener('copy', handleCopy);}if (disableCut) {document.addEventListener('cut', handleCut);}if (disableContextMenu) {document.addEventListener('contextmenu', handleContextMenu);}// 組件卸載或 disableCopy 為 false 時移除監聽return () => {if (disableCopy) {document.removeEventListener('copy', handleCopy);}if (disableCut) {document.removeEventListener('cut', handleCut);}if (disableContextMenu) {document.removeEventListener('contextmenu', handleContextMenu);}};}, [disableCopy, disableCut, disableContextMenu]); // 依賴數組確保只有在參數變化時才重新添加/移除監聽器
};