navigator.clipboard/ textarea 选择剪切

55 篇文章 0 订阅
14 篇文章 0 订阅

浏览器提供的 navigator.clipboard API 来复制文本。

如果不支持或者用户没有授权访问剪贴板,代码会回退到使用一个不可见的 textarea 元素来实现复制功能。

// 导入antd的message组件,用于显示操作反馈信息
import { message } from "antd";
import { MouseEvent } from "react";

// 定义一个异步函数copyNow,用于将文本复制到剪贴板
export async function copyNow(text: string) {
  try {
    // 尝试使用navigator.clipboard API复制文本
    await navigator.clipboard.writeText(text);
    // 如果复制成功,显示成功信息
    message.success("已复制到剪贴板");
  } catch (error) {
    // 如果复制失败,使用传统的textarea方法尝试复制
    const textArea = document.createElement("textarea");
    textArea.value = text;
    // 将textarea添加到文档中,使其可操作
    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();
    try {
      // 使用document.execCommand方法复制文本
      document.execCommand("copy");
      // 如果复制成功,显示成功信息
      message.success("已复制到剪贴板");
    } catch (error) {
      // 如果复制失败,显示错误信息
      message.error("复制失败,请赋予剪切板权限");
    }
    // 最后从文档中移除textarea
    document.body.removeChild(textArea);
  }
}

// 定义函数selectOrCopy,用于处理复制操作或者判断是否有文本被选中
export function selectOrCopy(content: string) {
  // 获取当前的文本选择对象
  const currentSelection = window.getSelection();

  // 判断当前是否有文本被选中
  if (currentSelection?.type === "Range") {
    return false;
  }

  // 如果没有文本选中,则调用copyNow函数复制内容
  copyNow(content);

  return true;
}

// 定义函数copyToClipboard,用户触发复制到剪贴板的操作
export function copyToClipboard(message: string, e?: MouseEvent<HTMLDivElement>,) {
  // 调用selectOrCopy函数进行复制操作
  if (selectOrCopy(message)) {
    // 如果复制操作被执行,阻止默认的鼠标事件(如点击跳转等)
    if(e) e.preventDefault();
  }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值