当前位置: 首页 > 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.lryc.cn/news/595246.html

相关文章:

  • MySQL表的基础操作
  • 鸿蒙DevEco Studio找不到JsonFormat插件
  • 虚拟机扩展磁盘容量后扩展分区大小
  • Linux的磁盘存储管理实操——(中)——逻辑卷管理实战
  • Linux find命令:强大的文件搜索工具
  • Apache Ignite Binary Object Restrictions
  • 青少年科学世界名刊分析评介:《生物技术世界》
  • 从 C# 到 Python:项目实战第五天的飞跃
  • Django视图与路由系统
  • 深入解析 Linux 硬链接与软链接:原理、区别及应用场景
  • 可编辑54页PPT | 智慧工业大数据建设方案智慧工厂整体解决方案
  • Git 常用命令与操作步骤
  • 深入理解 消息队列 与 ZeroMQ
  • C语言:20250721笔记
  • 板凳-------Mysql cookbook学习 (十二--------3_1)
  • 位标志法处理多选字段在数据库中的存储方式 查询效率与扩展性之间的权衡
  • 图论基本算法
  • LLaMA-Factory 微调可配置的LoRA参数
  • MySQL:表的增删查改
  • DFS习题篇【上】
  • buntu 22.04 上离线安装Docker 25.0.5(二)
  • 宝塔访问lnmp项目,跳转不到项目根目录问题解决
  • 【每日算法】专题四_前缀和
  • BERT 的“池化策略”
  • 基于WebSocket的安卓眼镜视频流GPU硬解码与OpenCV目标追踪系统实现
  • day058-docker常见面试题与初识zabbix
  • docker 常见命令使用记录
  • 【docker】分享一个好用的docker镜像国内站点
  • 【图论】CF——B. Chamber of Secrets (0-1BFS)
  • 文本数据分析