vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 , 这次的功能是将公式能插入编辑器以及修改

1、Tinymce 自定义 LateX 按钮,打开公式编辑器窗口 LateX.vue

  window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton('LateX', {text: 'LateX', // 按钮文本onAction: function () {// 1. 获取当前光标位置const latexEditorBookmark = ed.selection.getBookmark(2); // 获取光标位置const editorId = ed.id; // 保存当前编辑器 IDconsole.log('activeEditorId:', editorId);// 2. 生成一个随机的 ID,用于 wmath 标签const uid = 'wmath-' + Math.random().toString(36).substr(2, 9);// 3. 创建一个 <wmath> 标签并插入到光标处const wmathHtml = `<wmath contenteditable="false" data-id="${uid}" data-latex=""></wmath>`;ed.insertContent(wmathHtml); // 在光标位置插入 wmath 标签// 4. 打开公式编辑器窗口,并传递光标位置、编辑器 ID 和 wmathIdconst url = `/LateX?editorId=${editorId}&wmathId=${uid}`;window.open(url, '_blank', 'width=1000,height=800,scrollbars=no,resizable=no');}});//点击数字公式时打开窗口进行编辑var currentWmathElement = null;ed.on('click', function (e) {const wmathElement = e.target.closest('wmath');if (wmathElement) {currentWmathElement = wmathElement; // 👈 保存当前点击的元素const latexContentRaw = wmathElement.getAttribute('data-latex') || '';console.log('at line 488: raw =', latexContentRaw);// 去除所有 $ 符号const latexContent = latexContentRaw.replace(/\$/g, '').trim();console.log('at line 489: cleaned =', latexContent);// 编码后用于传递到弹窗const encoded = encodeURIComponent(latexContent);// 给 wmath 添加唯一 data-id,方便后续精准替换let wmathId = wmathElement.getAttribute('data-id');if (!wmathId) {wmathId = 'wmath-' + Math.random().toString(36).substr(2, 9);wmathElement.setAttribute('data-id', wmathId);}// 当前编辑器 ID 也保存下来(如果你有多个编辑器)const editorId = ed.id;// 打开编辑窗口并传参(传递 data-id + 内容)window.open(`/LateX?id=${encoded}&wmathId=${wmathId}&editorId=${editorId}`,'_blank','width=1000,height=800,scrollbars=no,resizable=no');}});}})//监听子页面数据if (!window._wmath_listener_registered) {// 💾 新增公式插入点记录let latexEditorBookmark = null;let activeEditorId = null;// 👂 message 监听器:处理编辑 + 新增两种情况window.addEventListener('message', function (event) {const data = event.data;console.log('data at line 648:', data);// ✅ 编辑现有公式:替换或删除if (data && data.type === 'update-wmath') {const { editorId, wmathId, latex } = data;const newLatex = latex ? latex.trim() : '';if (!editorId || !wmathId) return;const targetEditor = tinymce.get(editorId);if (!targetEditor) return;const targetWmath = targetEditor.dom.select(`wmath[data-id="${wmathId}"]`, targetEditor.getBody())[0];if (targetWmath) {if (!newLatex) {// ❌ 删除公式targetEditor.dom.remove(targetWmath);} else {// ✅ 更新公式targetWmath.setAttribute('data-latex', newLatex);targetWmath.innerHTML = newLatex;setTimeout(() => {if (typeof renderMathJax === 'function') {this.window.renderMathJax(editorId);}}, 10);}}}});// 🚩 标记为已注册,防止重复window._wmath_listener_registered = true;}

注意:所有的公式都是 $$ 公式 $$ 并且都是反斜杠
富文本存储的时候 <wmath data-latex="$$ 公式 $$"> $$ 公式 $$ </wmath>

这里解释一下为什么不直接存储$$ 公式 $$
原因:
1、我们是用户编辑内容,最终有后端形成word文件,编辑在进行处理,这就会导致不能随意存储数据
2、所有直接$$ 公式 $$ 渲染之后 会取代原内容 转成这样的标签 并且不会记录公式,所以我才想着在套一个自定义的标签在这里插入图片描述
3、为什么不能渲染的时候直接把公式赋值到父级span标签上呢,由于原因1,我是不能存储span 以及 p这种常规的标签 如果把公式放到标签上 也没办法保证用户就只录入一个公式 而且这种直接赋值也是js去渲染的比较慢

综上所述还是自定义标签比较好 ,
在这里插入图片描述
id是数字公式 wmathid 是 公式 唯一的id editorId则是编辑器的id 因为我会存在多个
在这里插入图片描述

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

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

相关文章

python数据增强和转换

数据增强和转换 固定转换随机转换概率控制的转换 固定转换 边缘补充像素(Pad)尺寸变换(Resize)中心截取(CenterCrop)顶角及中心截取(FiveCrop)尺灰度变换(GrayScale) 概率控制的转换 随机垂直翻转(RandomVerticalFlip)随机应用(RandomApply) # -*- coding: utf-8 -*- fro…

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知&#xff0c;Ubuntu默认使用Nouveau开源驱动&#xff0c;其性能受限&#xff0c;因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单&#xff0c;只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…

05_循环结构三目运算符

目录 一、双重for循环 练习 二、break关键字 三、continue 关键字 练习 四、三元运算 / 三目运算 一、双重for循环 外层循环 循环一次&#xff0c;&#xff0c;&#xff0c;内层循环 循环一圈&#xff01;&#xff01;&#xff01; 循环里嵌套循环&#xff1a; for(var…

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…

鸿蒙HarmonyOS NEXT之无感监听

鸿蒙中存在一些无感监听&#xff0c;这些监听经过系统API封装使用很简单&#xff0c;但是对实际业务开发中有很重要&#xff0c;例如埋点业务、数据统计、行为上报、切面拦截等。 Navigation的页面切换 在鸿蒙中Navigation被用来作为路由栈进行页面跳转&#xff0c;如果你想知…

批量处理word里面表格的空白行

1&#xff0c;随便打开一个word文档。 2&#xff0c;按下Alt F11 VBA编辑器,在左侧的「工程资源管理器」窗口中找到Normal 项目,右键选择插入->模块。 弹出一下弹窗 3&#xff0c;输入一下代码 代码&#xff1a; Sub RemoveEmptyTableRows()Dim tbl As TableDim row As R…

3ds Max 2026 新功能全面解析

一、视口性能与交互体验升级 1. Hydra 2.0 视口渲染引擎 3ds Max 2026 引入了 Hydra 2.0&#xff0c;大幅优化了视口渲染性能&#xff0c;尤其是在处理复杂场景和高质量实时预览时&#xff0c;流畅度提升显著。 支持USD&#xff08;通用场景描述&#xff09;格式&#xff0c…

JVM垃圾回收笔记02-垃圾回收器

文章目录 前言1.串行(Serial 收集器/Serial Old 收集器)Serial 收集器Serial Old 收集器相关参数-XX:UseSerialGC 2.吞吐量优先(Parallel Scavenge 收集器/Parallel Old 收集器)Parallel Scavenge 收集器Parallel Old 收集器相关参数-XX:UseParallelGC ~ -XX:UseParallelOldGC-…

图解AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP 网络管理 (UdpNm) 技术详解 基于 AUTOSAR 规范的 UDP 网络管理模块可视化指南 目录 AUTOSAR UDP 网络管理 (UdpNm) 技术详解 目录1. 概述2. UdpNm 状态机 2.1 状态机概述2.2 主要状态说明2.3 状态转换机制2.4 并行状态3. UdpNm 架构设计 3.1 架构概述3.2 接口设计3…

android 图形开发的技能学习路线

需要以下几个方面的知识&#xff1a; OpenGL ES的基础和高级应用图形渲染管线的工作原理3D数学&#xff08;矩阵、向量、四元数&#xff09;着色器编程&#xff08;GLSL&#xff09;libGDX框架的使用和定制性能优化和内存管理跨平台渲染技术 接下来&#xff0c;考虑如何结构化…

使用AI一步一步实现若依(26)

功能26&#xff1a;新增一个新员工培训页面 功能25&#xff1a;角色管理 功能24&#xff1a;菜单管理 功能23&#xff1a;从后端获取路由/菜单数据 功能22&#xff1a;用户管理 功能21&#xff1a;使用axios发送请求 功能20&#xff1a;使用分页插件 功能19&#xff1a;集成My…

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…

无人机航电系统电池技术解析!

1. 常用电池类型 锂聚合物电池&#xff08;LiPo&#xff09; 特点&#xff1a;高能量密度、轻量化、放电效率高&#xff0c;是目前主流选择。 缺点&#xff1a;对过充/过放敏感&#xff0c;需严格管理&#xff0c;存在轻微膨胀或起火风险。 锂离子电池&#xff08;Li-ion…

ubuntu下终端打不开的排查思路和解决方法

问题现象描述&#xff1a;ubuntu开机后系统桌面显示正常&#xff0c;其他图形化的app也都能打开无异常&#xff0c;唯独只有terminal终端打不开&#xff0c;无论是鼠标点击终端软件&#xff0c;还是ctrlaltt&#xff0c;还是altF2后输入gnome-terminal后按回车&#xff0c;这三…

Maven入门

1、简介 Apache Maven是一个项目管理及自动构建工具&#xff0c;由Apache软件基金会所提供。基于项目对象模型&#xff08;缩写&#xff1a;POM&#xff09;概念&#xff0c;Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 2、作用 1&#xff09;依赖导…

Rk3588,Opencv读取Gmsl相机,Rga yuv422转换rgb (降低CPU使用率)

RK3588, 使用OpenCv 读取 gmsl 相机,获得yuv422格式图像, 使用 rga 转换 rgb 图像。减少cpu占用率. 查看相机信息 v4l2-ctl --all -d /dev/cam0 , 查看自己相机分辨率,输出格式等信息,对应修改后续代码测试… Driver Info:Driver name : rkcifCard type : rkc…

鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)

引言&#xff1a;为什么我要写这份开发指南&#xff1f; 作为一名老技术&#xff0c;最近特别喜欢研究鸿蒙相机功能&#xff0c;而且目前已经更新到API15了&#xff0c;那么咱们更要好好研究一下。而且从手持云台到车载记录仪&#xff0c;每个项目都面临独特挑战&#xff1a;车…

【NLP 49、提示工程 prompt engineering】

目录 一、基本介绍 语言模型生成文本的基本特点 提示工程 prompt engineering 提示工程的优势 使用注意事项 ① 安全问题 ② 可信度问题 ③ 时效性与专业性 二、应用场景 能 ≠ 适合 应用场景 —— 百科知识 应用场景 —— 写文案 应用场景 —— 解释 / 编写…

数字转换(c++)

【题目描述】 如果一个数 xx 的约数和 yy &#xff08;不包括他本身&#xff09;比他本身小&#xff0c;那么 xx 可以变成 yy &#xff0c;yy 也可以变成 xx 。例如 44 可以变为 33 &#xff0c;11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行&#xff0c;…

如何同步fork的更新

当你fork了一个代码仓库后&#xff0c;要将其与原始源码保持同步&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 添加原始仓库作为远程源 在本地命令行中&#xff0c;进入到你fork后的代码仓库目录&#xff0c;然后使用以下命令添加原始仓库&#xff08;通常称为upstr…