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

vue3前端实现一键复制,wangeditor富文本复制

首先需要拿到要复制的内容,然后调用https的navigator.clipboard方法进行复制,但是这个因为浏览器策略只能在本地localhost和https环境下才能生效,http环境访问不到这个方法,在http环境在可以使用传统方式创建 textarea 进行复制

下面展示我在项目中用到的两种情况下的复制代码:


①复制的内容格式比较复杂,外面的大盒子里展示内容有很多逻辑判断,不方便直接获取到盒子里的内容,这个时候复制的内容需要手动用模板字符串进行拼接

// 获取到要复制的内容,带格式
const copyQuestions = () => {const selected = localQuestions.value.filter((item) => item.isSelected);if (selected.length === 0) return;const text = selected.map((item, idx) => {const topic = item.topic;const options = Object.entries(topic.option).map(([key, val], i) => `选项${String.fromCharCode(65 + i)}:\t${val}`).join("\n");return (`题目${getCircleNumber(idx + 1)}:${questionType[item.topicType]}\n` +`题目内容:\t${topic.question}\n` +options +"\n" +`正确答案:\t${topic.answer}\n` +`答案解析:\t${topic.desc}\n`);}).join("\n");copyToClipboard(text);
};//复制方法
const copyToClipboard = async (text) => {try {if (navigator.clipboard && window.isSecureContext) {// 优先使用现代方式(仅在 HTTPS 或 localhost 下有效)await navigator.clipboard.writeText(text);} else {// 非 HTTPS 环境,使用传统方式创建 textarea 进行复制console.log("非 HTTPS 环境,使用传统方式创建 textarea 进行复制");const textarea = document.createElement("textarea");textarea.value = text;textarea.style.position = "fixed"; // 防止滚动到页面底部textarea.style.opacity = "0";document.body.appendChild(textarea);textarea.focus();textarea.select();const successful = document.execCommand("copy");document.body.removeChild(textarea);if (!successful) {throw new Error("execCommand 复制失败");}}ElMessage.success("复制成功");} catch (err) {console.error("复制失败:", err);ElMessage.error("复制失败,请手动复制");}
};

② 有编辑和非编辑模式,两种模式都支持一键复制,编辑模式用的是@wangeditor/editor-for-vue,5.1.12版本的,复制代码如下


template代码

<template><div v-if="!editMode"><!-- <button @click="editMode = true">编辑</button> --><divclass="text-content"v-html="formattedText"ref="textContainer"></div></div><div v-if="editMode"><!-- <button @click="editMode = false">保存</button> --><Editorref="editorContainer"class="editor_box"style="height: max-content; overflow-y: hidden"v-model="valueHtml":defaultConfig="editorConfig"mode="default"@onCreated="handleCreated"@onChange="handleEditorChange"/></div></template>

script中的代码示例 

const textContainer = ref<HTMLElement | null>(null);const handleCreated = (editor: any) => {editorRef.value = editor; // 记录 editor 实例,重要!
};// 富文本复制(去除高亮样式)
const copyFormattedContent = async () => {try {let html = "";if (props.editMode) {if (!editorRef.value || typeof editorRef.value.getHtml !== "function") {ElMessage.info("编辑器未初始化或类型错误");return;}html = editorRef.value.getHtml();} else {const textToCopy = textContainer.value;if (!textToCopy) {ElMessage.info("复制区域未找到");return;}html = textToCopy.innerHTML;}// ✅ 创建 DOM,清除高亮样式const tempDiv = document.createElement("div");tempDiv.innerHTML = html;// ✅ 清除高亮样式tempDiv.querySelectorAll("span, strong").forEach((el: any) => {const hasBgColor =el.style.backgroundColor ||el.getAttribute("style")?.includes("background");if (hasBgColor) {el.removeAttribute("style");}});// ✅ 移除高亮 class 和 data-wordtempDiv.querySelectorAll(".highlight-word").forEach((el) => {el.classList.remove("highlight-word");el.removeAttribute("data-word");});const cleanedHtml = tempDiv.innerHTML;// ✅ 使用 Clipboard API 复制处理后的 HTMLawait navigator.clipboard.write([new ClipboardItem({"text/html": new Blob([cleanedHtml], { type: "text/html" }),}),]);ElMessage.success("内容已复制");} catch (err) {console.error("复制失败:", err);ElMessage.error("复制失败");}
};

相关文章:

vue3前端实现一键复制,wangeditor富文本复制

首先需要拿到要复制的内容&#xff0c;然后调用https的navigator.clipboard方法进行复制&#xff0c;但是这个因为浏览器策略只能在本地localhost和https环境下才能生效&#xff0c;http环境访问不到这个方法&#xff0c;在http环境在可以使用传统方式创建 textarea 进行复制 …...

小白畅通Linux之旅-----Linux进程管理

目录 一、进程查看命令 1、pstree 2、ps 3、pgrep 4、top、htop 二、进程管理命令 1、kill 2、pkill 和 killall 三、进程类型 1、前台进程 2、后台进程 一、进程查看命令 1、pstree 用于查看进程树之间的关系&#xff0c;谁是父进程&#xff0c;谁是子进程&#…...

【芯片设计中的跨时钟域信号处理:攻克亚稳态的终极指南】

在当今芯片设计中&#xff0c;多时钟域已成为常态。从手机SoC到航天级FPGA&#xff0c;不同功能模块运行在各自的时钟频率下&#xff0c;时钟域间的信号交互如同“语言不通”的对话&#xff0c;稍有不慎就会引发亚稳态、数据丢失等问题。这些隐患轻则导致功能异常&#xff0c;重…...

接地气的方式认识JVM(一)

最近在学jvm&#xff0c;浮于表面的学了之后&#xff0c;发现jvm并没有我想象中的那么神秘&#xff0c;这篇文章将会用接地气的方式来说一说这些jvm的相关概念以及名词解释。 带着下面两个问题来阅读 认识了解JVM大致有什么在代码运行时的都在背后做了什么 JVM是个啥&#xf…...

教师申报书课题——项目名称: 基于DeepSeek-R1与飞书妙记的课堂话语智能分析实践计划

明白了!针对教师个人能力范围(无需编程、无需服务器、零预算),我设计一个纯手工+免费工具组合的极简技术方案,用飞书基础功能和DeepSeek网页版就能实现核心分析。申报书重点突出 “轻量、易用、快速启动”。 项目申报书(极简个人实践版) 项目名称: 基于DeepSeek-R1与飞…...

JAVA:Kafka 消息可靠性详解与实践样例

🧱 1、简述 Apache Kafka 是高吞吐、可扩展的流处理平台,在分布式架构中广泛应用于日志采集、事件驱动和微服务解耦场景。但在使用过程中,消息是否会丢?何时丢?如何防止丢? 是很多开发者关心的问题。 Kafka 提供了一套完整的机制来保障消息从生产者 ➜ Broker ➜ 消费…...

【前端】Twemoji(Twitter Emoji)

目录 注意使用Vue / React 项目 验证 Twemoji 的作用&#xff1a; Twemoji 会把你网页/应用中的 Emoji 字符&#xff08;如 &#x1f604;&#xff09;自动替换为 Twitter 风格的图片&#xff08;SVG/PNG&#xff09;&#xff1b; 它不依赖系统字体&#xff0c;因此在 Android、…...

Electron 桌面程序读取dll动态库

序幕&#xff1a;被GFW狙击的第一次构建 当我在工位上输入npm install electron时&#xff0c;控制台跳出的红色警报如同数字柏林墙上的一道弹痕&#xff1a; Error: connect ETIMEDOUT 104.20.22.46:443 网络问题不用愁&#xff0c;请移步我的另外文章进行配置&#xff1a;…...

实时技术对比:SSE vs WebSocket vs Long Polling

早期网站仅展示静态内容&#xff0c;而如今我们更期望&#xff1a;实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢&#xff1f;三大经典技术各显神通&#xff1a; • SSE&#xff08;Server-Sent Events&#xff09;&#xff1a;轻量级单向数据…...

js 手写promise

const PENDING pending; const FULFILLED fulfilled; const REJECTED rejected;class MyPromise {#status PENDING;#result undefined;#handler undefined;constructor(executor) {// 不能写在外面&#xff0c;因为this指向会出问题const resolve (data) > {this.#ch…...

HTTP 与 HTTPS 深度解析:原理、实践与大型项目应用

1. HTTP 与 HTTPS 基础概念 1.1 HTTP&#xff08;超文本传输协议&#xff09; 定义&#xff1a;应用层协议&#xff0c;基于 TCP/IP 通信&#xff0c;默认端口 80 特点&#xff1a; 无状态协议&#xff08;需 Cookie/Session 维护状态&#xff09; 明文传输&#xff08;易被…...

QT6.9中opencv引用路径的其中一种设置

RC_ICONSappimage.ico unix|win32: LIBS -L$$PWD/opencv455/vc15/lib/ -lopencv_world455 INCLUDEPATH $$PWD/opencv455/include DEPENDPATH $$PWD/opencv455/include RC_ICONS为指定图标文件&#xff0c;只写图标名appimage.ico&#xff0c;那么一般和pro文件在同一目录…...

k8s pod启动失败问题排查

1. 查看日志 kubectl describe pod xxx -n xxx kubectl logs podname -n xxx --tail200 2. 镜像 到pod所在主机检查pod所需的镜像是否能成功拉取&#xff08;docker images&#xff09; 3.硬件资源 检查pod所在服务器的磁盘空间是否被占满&#xff08;df -h 和 du -sh /&a…...

Java类中各部分内容的加载执行顺序

目录 1. 静态初始化&#xff08;类加载阶段&#xff09; 示例代码 输出 2. 实例初始化&#xff08;对象创建阶段&#xff09; 详细顺序 示例代码 输出 3. 关键规则总结 4. 注意事项 5. 完整流程图 在Java中&#xff0c;类的实例化过程&#xff08;对象创建&#xff0…...

git提交信息错误,如何修改远程git提交的备注信息

有时候我们在git提交时没有按照规范提交。此时就需要修改远程git提交的备注信息。 一、修改最近几次提交 首先确保当前分支没有未提交的更改 git status使用交互式rebase修改历史记录&#xff08;假设要修改最近3次提交&#xff09; git rebase -i HEAD~3在打开的编辑器中&…...

API Gateway CLI 实操入门笔记(基于 LocalStack)

API Gateway CLI 实操入门笔记&#xff08;基于 LocalStack&#xff09; Categories: Cloud Google Rank Proof: No Last edited time: May 26, 2025 4:18 AM Status: Early draft Tags: aws 主要先简单的走一下流程&#xff0c;熟悉一下在 terminal 操作 API Gateway local…...

基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法

基于MATLAB实现SFA&#xff08;Slow Feature Analysis&#xff0c;慢特征分析&#xff09;算法的代码示例&#xff1a; % SFA慢特征分析 % 需要signal处理工具箱% 生成示例信号 t linspace(0,1,1000); x sin(2*pi*10*t) sin(2*pi*20*t) randn(size(t));% 定义滤波器 b fi…...

数据分析案例-基于红米和华为手机的用户评论分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

leetcode617.合并二叉树:递归思想下的树结构融合艺术

一、题目深度解析与核心规则 题目描述 合并两棵二叉树是一个经典的树结构操作问题&#xff0c;题目要求我们将两棵二叉树合并成一棵新二叉树。合并规则如下&#xff1a; 若两棵树的对应节点都存在&#xff0c;则将两个节点的值相加作为新节点的值若其中一棵树的节点存在&…...

深度学习入门:从零搭建你的第一个神经网络

深度学习入门&#xff1a;从零搭建你的第一个神经网络 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 深度学习入门&#xff1a;从零搭建你的第一个神经网络摘要引言第一章&#xff1a;神经网络基础原理1.1 神经元…...

【HTML-13】HTML表格合并技术详解:打造专业数据展示

表格是HTML中展示结构化数据的重要元素&#xff0c;而表格合并则是提升表格表现力的关键技术。本文将全面介绍HTML中的表格合并方法&#xff0c;帮助您创建更专业、更灵活的数据展示界面。 1. 表格合并基础概念 在HTML中&#xff0c;表格合并主要通过两个属性实现&#xff1a…...

鸿蒙OSUniApp 制作自定义的进度条组件#三方框架 #Uniapp

使用 UniApp 制作自定义的进度条组件 在移动应用开发中&#xff0c;进度条是非常常见的 UI 组件&#xff0c;无论是文件上传、下载、任务进度还是表单填写反馈&#xff0c;进度条都能为用户提供直观的进度提示。虽然 UniApp 提供了一些基础的进度条能力&#xff0c;但在实际项…...

【Python办公】Excel简易透视办公小工具

目录 专栏导读1. 背景介绍2. 功能介绍3. 库的安装4. 界面展示5. 使用方法6. 实际应用场景7. 优化方向完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系…...

m1 运行renrenfastvue出现的问题和解决方案

1. chromedriver 报错解决&#xff1a;执行 npm install --ignore-scripts。 2. node-sass 报错 "Node Sass does not yet support your current environment: OS X Unsupported ...": - 降低 Node 版本至 14。 - 安装版本控制工具&#xff1a;sudo npm insta…...

开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM-Docker(二)

一、前言 在AI模型部署效率竞争日益激烈的当下,如何将前沿大模型与高效推理框架结合,成为开发者关注的焦点。Qwen3-8B作为阿里云推出的混合推理模型,凭借80亿参数规模与128K超长上下文支持,展现了“快思考”与“慢思考”的协同能力,而vLLM框架则通过优化内存管理与并行计算…...

【C/C++】记录一次麻烦的Kafka+Json体验

文章目录 麻烦的KafkaJson体验1 目标2 工程搭建2.1 docker配置2.2 代码2.3 工程压缩包 3 执行结果 麻烦的KafkaJson体验 1 目标 初心&#xff1a;结合kafka json docker&#xff0c;验证基本的数据生产/消费。 Kafka 配合 JSON 工具&#xff0c;主要是为了数据的序列化和反…...

Linux系列-2 Shell常用命令收集

背景 本文用于收集Linux常用命令(基于Centos7)&#xff0c;是一个持续更新的博客&#xff0c;建议收藏&#xff0c;编写shell时遇到问题可以随时查阅。 1.Shell类型 shell是用C语言编写的程序&#xff0c;作为命令解释器连接着用户和操作系统内核。常见的shell有sh(Bourne She…...

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值 excel中表格中数据格式&#xff0c;多行 lonlatdata1data2data3117380.11100 clear;close all; figure(Position,[100 100 800 800]);num_points 14; [num,txt,raw] xlsread(test.xlsx); x num(:,1); y num(:,2);d…...

mysql:MVCC机制

MVCC机制 MVCC机制主要是mysql的多版本并发控制的一个机制&#xff0c;它主要是允许mysql去保存同一时间对同一份数据的不同历史版本的&#xff0c;从而避免读写之间的锁竞争&#xff0c;从而去提高并发的性能。 像传统的锁机制&#xff08;读写互斥锁&#xff08;Read-Write …...

Vue3 + Element Plus 实现树形结构的“单选 + 只选叶子节点 + 默认选中第一个子节点”

在 Vue 项目中&#xff0c;我们常使用树形结构组件来展示层级数据。本文将介绍如何使用 Element Plus 的 <el-tree> 组件&#xff0c;在 Vue3 中实现以下需求&#xff1a; ✅ 只能勾选叶子节点 ✅ 每次只能选中一个节点&#xff08;单选&#xff09; ✅ 页面加载时默认…...