wangeditor富文本编辑器+vue3粘贴内容样式处理

又是一个风格和日立的上午,某只菜鸟高高兴兴的骑着小电驴去上班,本着上班只要不迟到的理念飞速前行(迟到扣钱啊~),高高兴兴的行走在路上。来到工位刚拴上我的绳子组长就开始滴滴俺,顿时我心中大感不妙,此时组长笑脸盈盈的走了过来说“今天有个任务交给你,至于是啥,你随我上电脑瞅瞅”。定睛一看,原来是富文本出了问题。废话不多说直接开始这个美丽的故事.......

        wangeditor富文本功能挺强大的。官网链接:优势 | wangEditor

        本文主要讲到粘贴文字这一块的处理,从浏览器上粘过来的文字一般都带有一些自己的样式,可能肉眼看到是黑色,其实是个灰色,主要修改粘贴后文字默认展示黑色。

一、粘贴函数介绍

customPaste用于处理粘贴的函数,官网有介绍。

<Editorv-model="valueHtml":defaultConfig="editorConfig":mode="mode":style="{'height': props.height,'overflow-y': 'hidden','width': `${100}%`}"@on-created="handleCreated"@on-change="onChange"@custom-paste="customPaste"

二、customPaste函数逻辑

// 自定义粘贴处理器
const customPaste = (editor: any, event: any) => {// 在preventDefault之前先获取内容const clipboardData = event.clipboardData;const html = clipboardData.getData('text/html');const text = clipboardData.getData('text/plain');event.preventDefault(); // 阻止默认粘贴行为// 如果有HTML内容,进行处理if (html) {console.log("开始处理HTML内容");// 创建临时DOM元素const tempDiv = document.createElement('div');tempDiv.innerHTML = html;// 遍历所有元素,移除 style.color 属性const elements = tempDiv.querySelectorAll('*');elements.forEach(el => {const element = el as HTMLElement;if (element.style.color) {element.style.removeProperty('color');}// 也可以考虑移除 background-color 如果需要// if (element.style.backgroundColor) {//   element.style.removeProperty('background-color');// }});// 获取清理后的 HTML 字符串const cleanHtml = tempDiv.innerHTML;// 将处理后的HTML插入编辑器editor.dangerouslyInsertHtml(cleanHtml);} else if (text) {// 处理纯文本内容// 插入纯文本,并可以设置默认样式editor.insertText(text);}
}

三、如果想加强一下效果

设置默认值,加强魔法

const editorConfig = {placeholder: "请输入内容...",MENU_CONF: {},readOnly: props.readOnly,// 设置默认文本颜色为黑色defaultStyle: {color: '#000000'}
};

四、完整代码

<script setup lang="ts">
import { uploadFile } from "@/utils/upload/upload.js";
import { onBeforeUnmount, ref, shallowRef, defineProps } from "vue";
import "@wangeditor/editor/dist/css/style.css";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { getObjVal, to } from "@iceywu/utils";
import { ElLoading } from "element-plus";defineOptions({name: "PicUpload"
});
const props = defineProps({isOpen: {type: Boolean,default: true},height: {type: String,default: "500px"},readOnly: {type: Boolean,default: false}
});
const emit = defineEmits(["handleChange"]);const valueHtml = defineModel<string>({default: ""
});const mode = "default";
// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef();// 内容 HTML
// const valueHtml = ref(
//   "<p>仅提供代码参考,暂不可上传图片,可根据实际业务改写</p>"
// );
const toolbarConfig: any = { excludeKeys: "fullScreen" };
const editorConfig = {placeholder: "请输入内容...",MENU_CONF: {},readOnly: props.readOnly,// 设置默认文本颜色为黑色defaultStyle: {color: '#000000'}
};// 更多详细配置看 https://www.wangeditor.com/v5/menu-config.html#%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87
editorConfig.MENU_CONF["uploadImage"] = {// 服务端上传地址,根据实际业务改写server: "",// form-data 的 fieldName,根据实际业务改写fieldName: "file",// 选择文件时的类型限制,根据实际业务改写allowedFileTypes: ["image/png", "image/jpg", "image/jpeg"],// 自定义上传async customUpload(file: File, insertFn: any) {const loading = ElLoading.service({ text: "上传中..." }) as any;const result = (await to(uploadFile(file, res => {const { percent, stage = "upload" } = res;loading.text = `上传中...${percent}%`;})))[1] as any;console.log("🍭-----result-----", result);loading.close();// const { url, name } = result || {};const url = getObjVal(result, "data.url", "");const name = getObjVal(result, "data.fileName", "");console.log("🐬-----url, name-----", url, name);insertFn(url, name, url);}
};
editorConfig.MENU_CONF["uploadVideo"] = {// 服务端上传地址,根据实际业务改写server: "",// form-data 的 fieldName,根据实际业务改写fieldName: "file",// 选择文件时的类型限制,根据实际业务改写allowedFileTypes: ["video/*"],// 自定义上传async customUpload(file: File, insertFn: any) {const loading = ElLoading.service({ text: "上传中..." }) as any;const result = (await to(uploadFile(file, res => {const { percent, stage = "upload" } = res;loading.text = `上传中...${percent}%`;})))[1] as any;console.log("🍭-----result-----", result);loading.close();// const { url, name } = result || {};const url = getObjVal(result, "data.url", "");const name = getObjVal(result, "data.fileName", "");console.log("🐬-----url, name-----", url, name);insertFn(url, name, url);}
};const handleCreated = editor => {// 记录 editor 实例,重要!editorRef.value = editor;
};// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {const editor = editorRef.value;if (editor == null) return;editor.destroy();
});
const onChange = (val: any) => {const valTemp = val.getHtml();emit("handleChange", valTemp);
};// 自定义粘贴处理器
const customPaste = (editor: any, event: any) => {// 在preventDefault之前先获取内容const clipboardData = event.clipboardData;const html = clipboardData.getData('text/html');const text = clipboardData.getData('text/plain');event.preventDefault(); // 阻止默认粘贴行为// 如果有HTML内容,进行处理if (html) {console.log("开始处理HTML内容");// 创建临时DOM元素const tempDiv = document.createElement('div');tempDiv.innerHTML = html;// 遍历所有元素,移除 style.color 属性const elements = tempDiv.querySelectorAll('*');elements.forEach(el => {const element = el as HTMLElement;if (element.style.color) {element.style.removeProperty('color');}// 也可以考虑移除 background-color 如果需要// if (element.style.backgroundColor) {//   element.style.removeProperty('background-color');// }});// 获取清理后的 HTML 字符串const cleanHtml = tempDiv.innerHTML;// 将处理后的HTML插入编辑器editor.dangerouslyInsertHtml(cleanHtml);} else if (text) {// 处理纯文本内容// 插入纯文本,并可以设置默认样式editor.insertText(text);}
}
</script><template><div class="wangeditor"><Toolbarv-if="props.isOpen":editor="editorRef":defaultConfig="toolbarConfig":mode="mode"style="border-bottom: 1px solid #ccc"/><Editorv-model="valueHtml":defaultConfig="editorConfig":mode="mode":style="{'height': props.height,'overflow-y': 'hidden','width': `${100}%`}"@on-created="handleCreated"@on-change="onChange"@custom-paste="customPaste"/></div>
</template><style lang="scss" scoped>
.table_top {background-color: #fff;
}:deep(.w-e-text-container) {.w-e-scroll {p {margin: 5px !important;}}
}
:deep(.w-e-text-placeholder) {left: 14px;top: 1px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实测,大模型谁更懂数据可视化?

大家好&#xff0c;我是 Ai 学习的老章 看论文时&#xff0c;经常看到漂亮的图表&#xff0c;很多不知道是用什么工具绘制的&#xff0c;或者很想复刻类似图表。 实测&#xff0c;大模型 LaTeX 公式识别&#xff0c;出乎预料 前文&#xff0c;我用 Kimi、Qwen-3-235B-A22B、…

深度学习-梯度消失和梯度爆炸

梯度消失 在某些神经网络中&#xff0c;随着网络深度的增加&#xff0c;梯度在隐藏层反向传播时倾向于变小&#xff0c;这就意味着&#xff0c;前面隐藏层中的神经元要比后面的学习起来更慢&#xff0c;这种现象就叫做“梯度消失”&#xff1b; 梯度爆炸 如果我们进行一些特殊…

Go 语言基础 2 Func,流程控制

更多个人笔记见&#xff1a; github个人笔记仓库 gitee 个人笔记仓库 个人学习&#xff0c;学习过程中还会不断补充&#xff5e; &#xff08;后续会更新在github上&#xff09; 文章目录 Func 函数函数栈概念 函数表示类型 Anonymous func 匿名函数closure 闭包基础示例http利…

【Linux 学习计划】-- 倒计时、进度条小程序

目录 \r 、\n、fflush 倒计时 进度条 进度条进阶版 结语 \r 、\n、fflush 首先我们先来认识这三个东西&#xff0c;这将会是我们接下来两个小程序的重点之一 首先是我们的老演员\n&#xff0c;也就是回车加换行 这里面其实包含了两个操作&#xff0c;一个叫做回车&…

从零实现wss通信示例(WebSocket SSL)

客户端和服务端代码框架跟上一篇一致,仅增加了ssl的证书部分用于加密通信,明文通信(ws协议)见上一篇【https://blog.csdn.net/suoxd123/article/details/148093934】 1. 证书创建 1. 安装openssl 【官网地址】:https://slproweb.com/products/Win32OpenSSL.html 1.2 …

mysql 索引失效有哪些

InnoDB存储引擎根据索引类型不同&#xff0c;分为聚簇索引和二级索引 聚簇索引&#xff1a;叶子节点存放的是实际数据 二级索引&#xff1a;存放的是主键值&#xff0c;不是实际数据 1.对索引使用左或者左右模糊匹配 select * from t_user where name like %林‘&#xff1b…

LabVIEW通用测控平台设计

基于 LabVIEW 图形化编程环境&#xff0c;设计了一套适用于工业自动化、科研测试领域的通用测控平台。通过整合研华、NI等品牌硬件&#xff0c;实现多类型数据采集、实时控制及可视化管理。平台采用模块化架构&#xff0c;支持硬件灵活扩展&#xff0c;解决了传统测控系统开发周…

华为OD机试真题——智能驾驶(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

速卖通,国际站测评补单,如何平衡效率和安全

测评能够帮助卖家让平台更喜欢自己的产品&#xff0c;给予更好排名的同时也让后续进入店铺的买家更容易认可自己的产品。这是进行真实交易后形成的评价&#xff0c;而不是通过机器软件生成&#xff0c;形成虚拟数据后&#xff0c;那种刷评形式产生的评论。它符合任何电商平台的…

学习路之PHP--easyswoole3.3入门及文件热加载

学习路之PHP--easyswoole入门 一、框架说明二、常用命令三、文件热加载 一、框架说明 目录结构 目录结构 project 项目部署目录 ├─App 应用目录(可以有多个) │ ├─HttpController 控制器目录 │ │ └─Index.php …

设计模式26——解释器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 解释器模式&#xff08;Interp…

第三届宁波技能大赛网络安全赛项样题

2025 第三届宁波技能大赛网络安全赛项样题 模块A: 网络安全事件响应、数字取证调查和应用安全任务一:应急响应任务二:操作系统取证任务三:网络数据包分析任务四:代码审计 模块B:CTF 夺旗-攻击模块C:CTF 夺旗-防御需要环境培训可以私信博主&#xff01;&#xff01;&#xff01;…

GO语言进阶:掌握进程OS操作与高效编码数据转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

IO进程(进程 Process)

什么是进程&#xff1f; 1.概念 程序&#xff1a;编译好的可执行文件&#xff0c;存放在磁盘上的指令和数据的有序集合。 由此可见程序是静态的&#xff0c;没有执行的概念。 进程&#xff1a;是程序的一次执行的过程&#xff0c;是一个可调度的任务&#xff0c;也是执行一…

CSS传统布局与定位详解与TDK三大标签SEO优化

一、传统布局基础 1. 文档流布局 浏览器默认的文档流布局方式遵循以下规则&#xff1a; 块级元素&#xff08;如<div>、<p>、<h1>&#xff09;&#xff1a; 独占一行宽度默认100%可以设置宽高、内外边距 div {width: 500px;height: 200px;margin: 10px …

【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案

深入解析 Apollo Client&#xff1a;从架构到实践的一站式 GraphQL 解决方案 1. 引言 GraphQL 作为现代 API 开发的核心技术&#xff0c;其灵活性和高效性正在重塑数据交互模式。Apollo Client 作为 GraphQL 生态中最受欢迎的客户端库&#xff0c;凭借强大的缓存机制、框架集…

docker学习基本使用教程

docker是一款用于开发部署和运行容器化平台&#xff0c;能将应用及其依赖打包成轻量级、可移植的容器&#xff0c;实现一次构建&#xff0c;随处运行。docker是cs架构程序&#xff08;客户端和服务端&#xff09;&#xff0c;docker客户端向docker守护进程发送请求&#xff0c;…

万字详解RTR RTSP SDP RTCP

目录 1 RTSP1.1 RTSP基本简介1.2 RSTP架构1.3 重点内容分析 2 RTR2.1 RTR简介2.2 RTP 封装 H.2642.3 RTP 解封装 H.2642.4 RTP封装 AAC2.5 RTP解封装AAC 3 SDP3.1 基础概念3.2 SDP协议示例解析3.3 重点知识 4 RTCP4.1 RTCP基础概念4.2 重点 5 总结 1 RTSP 1.1 RTSP基本简介 一…

唯一原生适配鸿蒙电脑的远程控制应用,向日葵正式上线

近日&#xff0c;华为正式发布鸿蒙电脑新品&#xff0c;标志着HarmonyOS在PC端生态的进一步拓展。作为远程控制领域的先行者&#xff0c;贝锐科技旗下的向日葵远程控制软件也在第一时间完成了对鸿蒙电脑系统的原生适配&#xff0c;并已正式上线华为鸿蒙电脑应用市场&#xff0c…

vue2中,codemirror编辑器的使用

交互说明 在编辑器中输入{时&#xff0c;会自动弹出选项弹窗&#xff0c;然后可以选值插入。 代码 父组件 <variable-editorv-model"content":variables"variables"placeholder"请输入模板内容..."blur"handleBlur" />data…