点击文本将内容填入tinymce-vue 富文本编辑器的光标处

富文本编辑器组件

<template><div ref="tinymceBox" class="tinymce-box"><Editor id="myEditor" v-model="contentValue" :init="init" :disabled="disabled" @blur="inputBlur" @click="onClick" /></div>
</template><script>
const api = import.meta.env.VITE_APP_API_FILE
import { post } from '@/services/http'// 引入tinymce编辑器
import Editor from '@tinymce/tinymce-vue'// 引入node_modules里的tinymce相关文件文件
import tinymce from 'tinymce/tinymce' // tinymce默认hidden,不引入则不显示编辑器
import 'tinymce/themes/silver' // 编辑器主题,不引入则报错
import 'tinymce/icons/default' // 引入编辑器图标icon,不引入则不显示对应图标// 引入编辑器插件(基本免费插件都在这儿了)
// import 'tinymce/plugins' //高级列表
// import 'tinymce/plugins/anchor' //锚点
// import 'tinymce/plugins/autolink' //自动链接
// import 'tinymce/plugins/autoresize' //编辑器高度自适应,注:plugins里引入此插件时,Init里设置的height将失效
// import 'tinymce/plugins/autosave' //自动存稿
// import 'tinymce/plugins/charmap' //特殊字符
import 'tinymce/plugins/code' // 编辑源码
import 'tinymce/plugins/codesample' // 代码示例
import 'tinymce/plugins/directionality' // 文字方向
// import 'tinymce/plugins/emoticons' //表情
// import 'tinymce/plugins/fullpage' //文档属性
import 'tinymce/plugins/fullscreen' // 全屏
// import 'tinymce/plugins/help' //帮助
import 'tinymce/plugins/hr' // 水平分割线
import 'tinymce/plugins/image' // 插入编辑图片
// import 'tinymce/plugins/importcss' //引入css
// import 'tinymce/plugins/insertdatetime' //插入日期时间
import 'tinymce/plugins/link' // 超链接
import 'tinymce/plugins/lists' // 列表插件
import 'tinymce/plugins/media' // 插入编辑媒体
// import 'tinymce/plugins/nonbreaking' //插入不间断空格
// import 'tinymce/plugins/pagebreak' //插入分页符
// import 'tinymce/plugins/paste' //粘贴插件import 'tinymce/plugins/preview' // 预览
import 'tinymce/plugins/print' // 打印
// import 'tinymce/plugins/quickbars' //快速工具栏
// import 'tinymce/plugins/save' //保存
// import 'tinymce/plugins/searchreplace' //查找替换
// import 'tinymce/plugins/spellchecker'  //拼写检查,暂未加入汉化,不建议使用
// import 'tinymce/plugins/tabfocus' //切入切出,按tab键切出编辑器,切入页面其他输入框中
import 'tinymce/plugins/table' // 表格
// import 'tinymce/plugins/template' //内容模板
// import 'tinymce/plugins/textcolor' //文字颜色
// import 'tinymce/plugins/textpattern' //快速排版
// import 'tinymce/plugins/toc' //目录生成器
import 'tinymce/plugins/visualblocks' // 显示元素范围
// import 'tinymce/plugins/visualchars' //显示不可见字符
import 'tinymce/plugins/wordcount' // 字数统计
export default {name: 'TEditor',components: {Editor},props: {value: {type: String,default: ''},disabled: {type: Boolean,default: false},plugins: {type: [String, Array],// powerpastedefault:'print code codesample preview directionality visualblocks fullscreen image link media table hr lists wordcount indent2em wordlimit'},toolbar: {type: [String, Array],// undo redo media visualblocks fontselect 隐藏工具default:'fullscreen code codesample restoredraft forecolor backcolor bold italic underline strikethrough link | formatselect fontsizeselect lineheight | alignleft aligncenter alignright alignjustify | indent2em outdent indent | bullist numlist | blockquote removeformat | table image charmap hr print preview | '},fileType: {type: String,default: ''},supportBase64: {type: Boolean,default: true},maxLimit: {type: Number,default: 500},placeholder: {type: String,default: ''}},data() {return {dom: null,init: {language_url: '/tinymce/langs/zh_CN.js', // 引入语言包文件language: 'zh_CN', // 语言类型skin_url: '/tinymce/skins/ui/oxide', // 皮肤:浅色// skin_url: '/tinymce/skins/ui/oxide-dark',//皮肤:暗色plugins: this.plugins, // 插件配置toolbar: this.toolbar, // 工具栏配置,设为false则隐藏menubar: false, // 菜单栏配置,设为false则隐藏external_plugins: {// powerpaste: `/tinymce/powerpaste/plugin.min.js`,indent2em: `/tinymce/indent2em/plugin.min.js`,wordlimit: `/tinymce/wordlimit/plugin.min.js`},fontsize_formats: '12px 14px 16px 18px 20px 22px 24px 28px 32px 36px 48px 56px 72px', // 字体大小font_formats: `思源宋体='思源宋体';微软雅黑='微软雅黑';宋体='宋体';黑体='黑体';仿宋='仿宋';楷体='楷体';隶书='隶书';幼圆='幼圆';Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings`, // 字体样式lineheight_formats: '0.5 0.8 1 1.2 1.5 1.75 2 2.5 3 4 5', // 行高配置,也可配置成"12px 14px 16px 20px"这种形式// height: 400, //注:引入autoresize插件时,此属性失效min_height: 300,max_height: 500,toolbar_mode: 'sliding',placeholder: this.placeholder || '在这里输入描述',branding: false, // tiny技术支持信息是否显示resize: true, // 编辑器宽高是否可变,false-否,true-高可变,'both'-宽高均可,注意引号// statusbar: false,  //最下方的元素路径和字数统计那一栏是否显示elementpath: false, // 元素路径是否显示content_style: 'img {max-width:100%;} .mce-item-anchor {display:none !important}', // 直接自定义可编辑区域的css样式content_css: 'tinymce/skins/content/default/content.css', // 以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入// images_upload_url: '/apib/api-upload/uploadimg',  //后端处理程序的url,建议直接自定义上传函数image_upload_handler,这个就可以不用了// images_upload_base_path: '/demo',  //相对基本路径--关于图片上传建议查看--http://tinymce.ax-z.cn/general/upload-images.phpwordlimit: {max: this.maxLimit, // 最多可以输入多少字spaces: false, // 是否含空格isInput: false, // 是否在超出后还可以输入maxMessage: `超出最大输入字符数量,最多允许${this.maxLimit}个字符!`},setup(editor) {// 设置默认字体样式editor.on('init', function (e) {this.getBody().style.lineHeight = '2'this.getBody().style.fontFamily = '微软雅黑'})},urlconverter_callback: (url, node, onSave, name) => {if (node === 'img' && url.startsWith('blob:')) {tinymce.activeEditor && tinymce.activeEditor.uploadImages()}return url},// paste_preprocess: (editor, args) => {//     if (this.disabled) {//         args.content = ''//     }// },end_container_on_empty_block: true,powerpaste_html_import: 'merge',powerpaste_word_import: 'merge',powerpaste_allow_local_images: true,paste_data_images: true, // 图片是否可粘贴images_upload_handler: (blobInfo, success, failure) => {let file = nullconst fileSize = 3const fileType = ['jpg', 'png']if (blobInfo.blob() instanceof Blob) {file = new File([blobInfo.blob()], blobInfo.blob().name || 'image.png', { type: 'image/png' })} else {file = blobInfo.blob()}const suffix = file.name.substring(file.name.lastIndexOf('.') + 1).toLocaleLowerCase()const allowType = fileType.map(v => v.toLocaleLowerCase()).includes(suffix)const allowSize = file.size / 1024 / 1024 < fileSizeif (!allowType) {failure('上传失败,仅支持上传JPG、PNG格式的图片')} else if (!allowSize) {failure(`上传失败,图片大小请控制在 ${fileSize}M 以内`)} else {const params = new FormData()params.append('file', file)params.append('type', this.fileType || 'product')const config = {headers: {'Content-Type': 'multipart/form-data','Client-Type': 0}}const AuthorizationInfo = localStorage.getItem('AuthorizationInfo')if (AuthorizationInfo) {const { tokenHeader, tokenHead, token } = JSON.parse(AuthorizationInfo)config.headers[tokenHeader] = `${tokenHead} ${token}`}post(api, params, config, '/').then(res => {success(res.url) // 上传成功,在成功函数里填入图片路径}).catch(() => {// 是否支持上传图片为base64格式if (!this.supportBase64) {const imgReg = /<img.*?(?:>|\/>)/gi // 匹配图片中的img标签this.contentValue = this.contentValue.replace(imgReg, (match, capture) => (match.indexOf('base64') == -1 ? match : ''))}failure('上传出错,服务器开小差了呢')})}}},contentValue: this.value}},watch: {value(newValue) {this.contentValue = newValue},contentValue(newValue) {this.$emit('input', newValue)}},mounted() {tinymce.init({})},methods: {// 添加相关的事件,可用的事件参照文档=> https://github.com/tinymce/tinymce-vue => All available eventsonClick(e) {this.$emit('onClick', e, tinymce)},// 清空内容clear() {this.contentValue = ''},// 失去焦点inputBlur() {this.$emit('blur')}}
}
</script><style lang="less" scoped>
.tinymce-box {min-height: 300px;
}
</style>

项目中引用
注意:要给组件加上id

  <TEditorid="myEditor"ref="tEditorRef"fileType="supply/hr/report"v-model:value="formState.emailContent"@input="e => (formState.emailContent = e)":maxLimit="10000"placeholder="请输入邮件内容"/>// 点击标签
const changeLabel = item => {const editor = tinymce.get('myEditor')if (editor) {editor.focus()editor.selection.setContent(`<div>【${item}】</div>`)}state.labelCount++if (state.labelCount <= 2) {formState.emailSubject += `${item}`}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3.2cpu

这个转换原理是基于&#xff0c;地址号*大小页内偏移量&#xff0c;通过页表使逻辑号和内存号之间建立起联系&#xff0c;从而实现地址的转换 按字节寻址&#xff0c;意思是说一个地址的大小是一个字节 页表记录的是逻辑块号与实际存储的主存块号之间的映射关系&#xff0c;是…

SQLI LABS | Less-35 GET-Bypass Add Slashes (we dont need them) Integer Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-35/ 话不多说…

小北的字节跳动青训营与LangChain实战课:深入探索输出解析器与Pydantic解析器重构(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

Leetcode 两数之和 Ⅱ - 输入有序数组

这段代码实现了在一个非递减排序的数组中找到两个数&#xff0c;使它们的和等于目标值的算法。算法使用了双指针技术&#xff0c;具体思想如下&#xff1a; 算法思想&#xff1a; 初始化指针&#xff1a;定义两个指针 left 和 right&#xff0c;分别指向数组的起始位置和末尾位…

UE5.4 PCG 复制关卡实例

关卡实例&#xff1a;最大层级的管理&#xff0c;方便关卡级别的复制、重载 1.创建关卡实例&#xff0c;右箭生成PCG设置。注意&#xff1a;当关卡实例发生变化&#xff0c;需要重新手动再创建一次PCG设置 2.直接拖放到PCG图&#xff0c;设置如下 说明&#xff1a;PCG设置文…

C++ | Leetcode C++题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; class Solution { public:bool checkRecord(string s) {int absents 0, lates 0;for (auto &ch : s) {if (ch A) {absents;if (absents > 2) {return false;}}if (ch L) {lates;if (lates > 3) {return false;}} else {lates…

Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)

目录 安装所需库 Python获取PDF页数 Python获取PDF页面尺寸 Python获取PDF页面旋转角度 Python获取PDF页面方向 Python获取PDF页面标签 Python获取PDF页面边框信息 了解PDF页面信息对于有效处理、编辑和管理PDF文件至关重要。PDF文件通常包含多个页面&#xff0c;每个页…

设计模式(主要的五种)

1.设计模式&#xff1a; 设计模式就是代码设计经验 2.设计模式的类型&#xff1a; 分为三大类&#xff1a;创建型模式&#xff0c;结构型模式&#xff0c;行为模式 创建型模式&#xff1a; 单例模式&#xff1a;某个类只能有一个实例&#xff0c;提供一个全局的访问点。 工…

【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案

本章节对应资料在网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \07_Android 系统开发配套资料\08_Android12 摄像头使用配套资料”目录下下载。 2.1 Android12 前摄后摄 网盘中默认的 Android12 源码支持四个摄像头单独打开&#xff0c;本小节我们来修改源码…

Javascript如何实现继承?

#一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念。 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称为“A的子类”&#xff0c;而把A称为“B的父类别”也可以称“A是B的超类” 继承的优点 继承可以使得子类具有父类别的…

测度论原创(三)

Morden Prob 文章目录 Morden ProbWeek3多维扩展和随机向量定理3.1推论&#xff1a;random variable的变换定理3.2 连续函数的可测性定理3.3 可测函数的线性组合关于拓展实数集的延伸定理3.4 可测函数的极限依旧为可测性随机变量的概率律&#xff08;Law of X X X&#xff09;…

Sql面试题二:请查询出用户连续三天登录的所有数据记录

问题&#xff1a; 现有用户登录记录表&#xff0c;请查询出用户连续三天登录的所有数据记录 id dt 1 2024-04-25 1 2024-04-26 1 2024-04-27 1 2024-04-28 1 2024-04-30 1 2024-05-01 1 2024-05-02 1 2024-05-04 1 2024-05-05 2 2…

vite中env uat/dev文件项目配置

1&#xff1a;图示 在vscode中显示的是&#xff08;在文件中显示不是文件夹而在vscode中显示是文件夹-- .env 而这个.env也是有内容的&#xff09; 2&#xff1a;.env文件内容 # 标题 VITE_APP_TITLE管理系统# 项目本地运行端口号 VITE_PORT80# open 运行 npm run dev 时自动打…

ssm基于JAVA的网上订餐管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

向日葵远程桌面Visual Studio白屏

问题描述 今天没带笔记本&#xff0c;想着拿 Ipad 远程写会代码&#xff0c;打开VS发现白屏了&#xff0c;看了看向日葵里面的设置有GPU加速&#xff0c;发现是和VS的GPU加速冲突了 解决方案&#xff08;远程同样可用&#xff09; ALT T 弹出工具菜单O 打开选项菜单A会取消…

Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法

类型转换 传统方法astype使用value_counts统计通过apply替换并使用astype转换 pd.to_numericx对连续变量进行转化⭐参数&#xff1a;返回值&#xff1a;示例代码&#xff1a; isnull不会检查空字符串 数据准备 有一组数据信息如下&#xff0c;其中主要将TotalCharges、MonthlyC…

Python+Appium编写脚本

一、环境配置 1、安装JDK&#xff0c;版本1.8以上 2、安装Python&#xff0c;版本3.x以上&#xff0c;用来解释python 3、安装node.js&#xff0c;版本^14.17.0 || ^16.13.0 || >18.0.0&#xff0c;用来安装Appimu Server 4、安装npm&#xff0c;版本>8&#xff0c;用…

WPF MVVM入门系列教程(三、数据绑定)

本文主要介绍WPF的数据绑定&#xff08;Data Binding&#xff09;功能&#xff0c;如果你已经熟悉本文的内容&#xff0c;可以跳过并直接阅读后面的文章。 什么是数据绑定 我们先来看一下MSDN上的说明&#xff1a; 数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。 如…

关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1

这里写自定义目录标题 关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1操作步骤 关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1 操作步骤 -开机后 按 Ctrl R 进入 RAID卡 配置界面&#xff0c;如下&#xff1a;-下面图片是 服务器中硬盘都已经准备好&#xff0c;并…

Qt Udp的组播(多播)、广播和单播

UDP通讯的基本概念和特点‌ UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是‌TCP/IP协议族中的一种无连接协议&#xff0c;主要用于那些对实时性要求较高而可靠性要求较低的应用场景。UDP的主要特点包括&#xff1a; ‌无连接‌&#xff1a;…