当前位置: 首页 > news >正文

在 React 中实现全局防复制hooks

用于防止页面内容被复制、剪切或通过右键菜单操作。它接受三个可配置参数:disableCopy(禁用复制,默认true)、disableCut(禁用剪切,默认true)和 disableContextMenu(禁用右键菜单,默认true)。通过监听 copycut 和 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]); // 依赖数组确保只有在参数变化时才重新添加/移除监听器
};

http://www.dtcms.com/a/290882.html

相关文章:

  • Java 解析前端上传 ZIP 压缩包内 Excel 文件的完整实现方案
  • Neo4j 5.x版本的导出与导入数据库
  • 易语言+懒人精灵/按键中控群控教程(手机、主板机、模拟器通用)
  • CFD总压边界条件的理解与开发处理
  • DM8数据库Docker镜像部署最佳实践
  • 自学鸿蒙测试day01-插件安装推荐
  • Vue 3 响应式原理详细解读【一】—— Proxy 如何突破 defineProperty 的局限
  • 计算机发展史:晶体管时代的技术飞跃
  • Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法
  • 软件测试 —— A / 入门
  • 数据结构 之 【排序】(直接插入排序、希尔排序)
  • 基于 Nginx 搭建 OpenLab 多场景 Web 网站:从基础配置到 HTTPS 加密全流程
  • Nginx IP授权页面实现步骤
  • Grok网站的后端语言是php和Python2.7
  • Python 变量赋值与切片语法(in-place 修改 vs 重新赋值)
  • 《画布角色的双重灵魂:解析Canvas小游戏中动画与碰撞的共生逻辑》
  • 状压DP学习笔记[浅谈]
  • 计算机网络:概述层---计算机网络的性能指标
  • IFN影视官网入口 - 4K影视在线看网站|网页|打不开|下载
  • 算法训练营DAY37 第九章 动态规划 part05
  • Linux开发⊂嵌入式开发
  • 复制docker根目录遇到的权限问题
  • Mac安装Typescript报错
  • macOS 上安装 Kubernetes(k8s)
  • 深度学习-常用环境配置
  • 基于R语言的分位数回归技术应用
  • next.js刷新页面时二级菜单展开状态判断
  • Java 通过 HttpURLConnection发送 http 请求
  • CG-04 翻斗式雨量传感器 分辨率0.1mm,0.2mm可选择 金属材质
  • 数据结构自学Day11-- 排序算法