这是 Tiny Cloud 和 TinyMCE Enterprise 的发行说明。有关 TinyMCE 最新社区版本的信息,请参阅TinyMCE 更新日志。

概述

TinyMCE 8.7.0 于 2026 年 6 月 30 日星期二为 TinyMCE Enterprise 和 Tiny Cloud 发布。这些发行说明提供了 TinyMCE 8.7.0 变更的概述,包括:

  • 配套的 Premium 插件变更

  • 改进

  • 新增

  • 变更

  • Bug 修复

配套的 Premium 插件变更

以下 Premium 插件更新与 TinyMCE 8.7.0 一同发布。

Revision History

TinyMCE 8.7.0 版本包含了配套发布的 Revision History Premium 插件。

Revision History 包含以下新增内容。

修订可标记为 AI 并显示 AI 徽标

修订现在支持可选的 metadata 属性。将其 source 字段设置为 'ai' 会将修订标记为 AI 辅助,允许集成者追踪由 TinyMCE AI 插件生成的内容。默认情况下,AI 辅助修订的卡片上会渲染 AI 徽标。将新的 revisionhistory_ai_attribution 选项设置为 false 即可隐藏该徽标。

有关将修订归属于 AI 的详细信息,请参阅 归属 AI 辅助修订。

有关 Revision History 插件的信息,请参阅:Revision History。

Suggested Edits

TinyMCE 8.7.0 版本包含了配套发布的 Suggested Edits Premium 插件。

Suggested Edits 包含以下改进和新增内容。

AI 辅助建议可显示 AI 徽标

Suggested Edits 现在将使用 TinyMCE AI 插件进行的编辑记录为 AI 辅助。默认情况下,这些编辑的卡片上会显示 AI 徽标。将新的 suggestededits_ai_attribution 选项设置为 false 即可隐藏该徽标。

suggestededits_model schema 现为版本 2。加载时,使用版本 1 保存的模型将自动迁移。

现在可以切换建议追踪

Suggested Edits 现在支持在编辑时切换建议追踪。新的 suggestededits-tracking 工具栏按钮和 菜单项,以及 SuggestedEditsToggleTracking 命令,让用户可以在将编辑作为建议追踪或直接应用于内容之间切换。suggestededits_auto_approve 配置选项现在也控制它们的默认状态。

由于切换追踪从根本上改变了 Suggested Edits 的使用体验,该按钮和菜单项默认不包含在内。必须在编辑器配置中将其显式添加到工具栏或菜单中。

Suggested Edits hasChanges 事件现在也会在审查完成时触发

以前,SuggestedEditsHasChangesUpdate 事件只会伴随其他编辑器事件(如输入、选择或聚焦)一起触发。单独完成审查并不会触发该事件,因此 hasChanges API 返回的值可能会过时。因此,任何依赖该 API 的集成在审查完成时都不会收到更新。

在 TinyMCE 8.7.0 中,只要 hasChanges API 中的值发生变化,SuggestedEditsHasChangesUpdate 事件就会触发,包括审查完成时。

有关 Suggested Edits 插件的信息,请参阅:Suggested Edits。

Export to PDF

TinyMCE 8.7.0 版本包含了配套发布的 Export to PDF Premium 插件。

Export to PDF 包含以下新增内容。

现在可以在 getContent 的事件和 nodeFilter 中使用 export 类型。

Export to PDF 插件现在会调用设置了 export 属性为 pdf 的 tinymce.editor.getContent()。TinyMCE 会将此属性传递给 GetContent 事件和序列化器节点过滤器,因此集成者可以应用针对 PDF 导出的内容过滤,而不会影响常规内容检索。

有关在导出期间过滤内容的信息,请参阅:导出特定的内容过滤。有关 Export to PDF 插件的信息,请参阅:Export to PDF。

Export to Word

TinyMCE 8.7.0 版本包含了配套发布的 Export to Word Premium 插件。

Export to Word 包含以下新增内容。

现在可以在 getContent 的事件和 nodeFilter 中使用 export 了。

Export to Word 插件现在会调用 tinymce.editor.getContent(),并设置 export 属性为 word。TinyMCE 会将此属性传递给 GetContent 事件和序列化器的节点过滤器,以便集成商可以针对 Word 导出进行内容过滤,而不会影响常规的内容获取。

有关在导出期间过滤内容的信息,请参阅:Export-specific content filtering。有关 Export to Word 插件的信息,请参阅:Export to Word。

Page Embed

TinyMCE 8.7.0 版本包含了 Page Embed 高级插件的配套发布。

Page Embed 包含以下修复。

使用 pageembed 插件插入的 Iframe 无法使用左对齐、居中和右对齐工具栏按钮进行对齐。

此前,左对齐、居中和右对齐工具栏按钮对使用 Page Embed 插件插入的 iframe 无效。选择嵌入的 iframe 并选择对齐方式并不会改变其位置。

在 TinyMCE 8.7.0 中,左对齐、居中和右对齐工具栏按钮可以对齐使用 Page Embed 插件插入的 iframe。

有关 Page Embed 插件的信息,请参阅:Page Embed。

Inline CSS

TinyMCE 8.7.0 版本包含了 Inline CSS 高级插件的配套发布。

Inline CSS 包含以下修复。

在使用 inline CSS 获取 HTML 内容时,未包含 fullpage 的页眉和页脚

此前,当启用了 Full Page HTML 插件时,Inline CSS 插件的 getContent API 不会返回完整的 HTML 文档。文档周围的页眉和页脚被省略,导致输出不适合用于生成电子邮件文档等用例。

在 TinyMCE 8.7.0 中,Inline CSS 插件会检测何时启用了 Full Page HTML 插件,并在其输出中包含文档的页眉和页脚。getContent API 现在可以按预期返回完整的 HTML 文档。

有关 Inline CSS 插件的信息,请参阅:Inline CSS。

TinyMCE AI

TinyMCE 8.7.0 版本包含了 TinyMCE AI 高级插件的配套发布。

TinyMCE AI 包含以下改进、修复和新增功能。

将 TinyMCE AI 插件添加到 npm-premium + ZIP 下载中。

从 TinyMCE 8.7.0 开始,TinyMCE AI 插件首次可供自托管客户使用。此前,该插件只能从 Tiny Cloud CDN 加载。

从此版本开始,tinymceai 插件包含在 tinymce-premium NPM 包中,并可作为独立的附加组件 .zip 下载,从 Tiny Account 获取。该插件仅作为附加组件分发,不包含在任何 TinyMCE ZIP 捆绑包中。

自托管插件仍然必须连接到 AI 服务的实例。将其指向托管的 Tiny Cloud AI 服务,或部署 自托管 AI 服务,以将内容保留在主机网络内。有关安装步骤,请参阅:快速开始:从 NPM 或 Yarn 使用 TinyMCE。有关插件配置的信息,请参阅:TinyMCE AI。

当 body 元素在自定义 content_style 中使用 position: relative 时,差异覆盖层可能会错位

此前,当编辑器 body 元素在自定义 content_style 中使用 position: relative 时,预览如翻译等快速操作会显示错位的差异覆盖层。覆盖层使用 body 元素作为其包含块,但定位逻辑仍然使用视口。因此,高亮切除区域看起来偏离了翻译文本。打印样式布局和定位 body 元素的文档模板可能会使预览难以使用。

在 TinyMCE 8.7.0 中,差异覆盖层独立于编辑器内容样式进行渲染。无论自定义 body 定位如何,覆盖层都会与翻译文本对齐,并且切除区域会按预期高亮显示活动的翻译内容。

新增 tinymceai_tool_data_callback 选项,用于自定义在 Model Context Protocol (MCP) 工具运行时显示的状态消息

TinyMCE AI 插件现在支持 tinymceai_tool_data_callback 选项。当 MCP 服务器在流式响应期间发送 mcp-tool-result 或 mcp-tool-notification 事件时,会运行此函数。该函数应返回一个字符串,作为 AI 模型调用 MCP 工具时在 Chat 侧边栏中显示的状态消息。

自定义审查 textarea 在为空时显示滚动条。

之前,TinyMCE AI 审查侧边栏的“自定义审查”部分中的文本区域即使为空时也会显示滚动条。占位符文本可能会滚动,并且文本区域的角落看起来被截断,这使得控件看起来损坏了。

在 TinyMCE 8.7.0 中,自定义审查文本区域使用更大的默认高度,因此占位符适配而无需滚动条,并且文本区域在为空时正确渲染。

当未提供 tinymceai_default_model 时,插件不再显示控制台警告。

之前,当未设置 tinymceai_default_model 选项时,TinyMCE AI 插件会记录一个控制台警告,尽管省略该选项是有效的。警告暗示配置错误并引起了混淆。

在 TinyMCE 8.7.0 中,当未提供 tinymceai_default_model 选项时,TinyMCE AI 插件不再记录控制台警告。

聊天和操作预览模式中高亮显示的建议在点击时不再显示为选中状态,因为无法对这些建议执行后续操作。

之前,在 TinyMCE AI 聊天和 TinyMCE AI 快速操作的预览模式中,点击高亮显示的建议会显示选中状态,尽管预览模式不提供对高亮显示建议的操作。选中状态使建议看起来是交互式的,导致用户期望预览模式不提供的后续操作。

在 TinyMCE 8.7.0 中,预览模式中 TinyMCE AI 聊天和 TinyMCE AI 快速操作的高亮显示建议不响应点击并且不再显示选中状态。高亮显示保持可见以供参考,因此预览模式呈现最终文本的只读视图。

TinyMCE AI 插件现在将 ai 属性添加到 SetContent 和 BeforeSetContent 事件有效载荷中

之前,TinyMCE AI 插件将内容设置到编辑器中而未将其标记为 AI 生成的。监听 BeforeSetContent 和 SetContent 事件的集成没有可靠的方法来区分此内容和其他来源设置的内容,也无法应用基于来源的处理、跟踪或分析。

在 TinyMCE 8.7.0 中,当 TinyMCE AI 插件设置内容时,会将 ai 属性添加到 BeforeSetContent 和 SetContent 事件有效载荷中。事件处理程序可以检查此属性以检测 TinyMCE AI 生成的内容并根据其来源进行响应。

现在可以在上下文源仍在加载时将其移除

之前,用户无法在文件仍在上传时从 TinyMCE AI 对话中移除上下文源。添加了大文件(如图像或 PDF)的用户必须等待上传到 AI 服务完成后才能移除它。插件没有提供取消正在进行的请求的方法。

在 TinyMCE 8.7.0 中,上下文源的移除按钮现在会立即取消正在进行的上传。用户可以在上下文源仍在加载时将其移除,而无需等待请求完成。

聊天现在可以更新空文档

之前,聊天在生成内容时不会更新空文档。聊天仅在聊天侧边栏中显示生成的内容,因为 AI 服务无法在文档没有内容时应用编辑。

在 TinyMCE 8.7.0 中,AI 聊天现在可以处理更新空文档。当编辑器为空时,生成的内容现在会直接插入到文档中,而不仅仅显示在侧边栏中。

审查模式键盘导航现在与聊天侧边栏匹配

之前,审查侧边栏中的键盘导航与聊天侧边栏不匹配,因此在两个侧边栏之间切换时,仅使用键盘的工作流行为不一致。按 Esc 还可能会拒绝所有待处理的建议而不是移动焦点,这意味着仅使用键盘的用户可能会无意中丢弃建议。

在 TinyMCE 8.7.0 中,审查侧边栏中的键盘导航与聊天侧边栏匹配。Ctrl+Alt+S 快捷键打开并聚焦到审查侧边栏。Tab 和 Shift+Tab 在建议卡片和每张卡片上的按钮之间移动。Esc 现在移动焦点而不是拒绝待处理的建议。仅使用键盘的用户可以导航并应用建议而无需鼠标。

新的 tinymceai_reviews_change_tone_menu 选项用于控制更改语气审查菜单

TinyMCE 8.7.0 为 TinyMCE AI 添加了 tinymceai_reviews_change_tone_menu 选项。此选项控制更改语气审查中显示哪些语气选项及其顺序。仅支持预设语气 ID。重复的 ID 会被移除,并且菜单按配置的顺序显示语气。如果选项包含无效的语气 ID,则配置会被拒绝并使用默认语气。有关有效语气 ID 和选项详细信息,请参阅 tinymceai_reviews_change_tone_menu。

审查侧边栏在应用审查后不再显示“未找到改进”

之前,如果在模型仍在响应时隐藏了审查侧边栏,并且随后从预览页脚应用或跳过了生成的建议,则审查状态不会重置。重新打开审查侧边栏会显示“审查完成 — 未找到改进”而不是审查列表,尽管审查已经完成。恢复审查选项的唯一方法是重新加载编辑器。

在TinyMCE 8.7.0中,当侧边栏隐藏时,从预览页脚应用或跳过建议后,审查状态现在会正确重置。重新打开审查侧边栏会再次显示审查列表,因此无需重新加载编辑器即可继续进行审查。

现在展开嵌套列表项的提示词会保留内容

之前,当模型将嵌套块展开为顶级块(例如将<li>项转换为<p>段落)时,会重用原始元素的ID。差异比较逻辑将重用的ID视为对嵌套元素的更新,因此某些提示词会间歇性地删除内容而非展开。现在,仅当重用的ID指向顶级元素时,才会将其视为现有块;否则将作为新元素处理。展开嵌套元素的编辑现在能可靠应用并保留内容。

返回之前的会话时现在会继续该会话

之前,一个回归问题导致无法在聊天侧边栏中正确加载之前的会话。开始新聊天后,返回到之前的会话并发送提示词会开始一次断开的交流,而非继续原线程。切换到现有会话现在会恢复其会话ID,因此后续提示词会继续所选会话。

图像编辑现在会正确定位包含多张图像内容中的图像

之前,发送给模型的图像没有唯一标识,因此引用特定图像的提示词可能会将一张图像误认为另一张,并将更改(如alt文本更新)应用到错误的图像。TinyMCE AI现在会为每个img元素添加唯一标签,因此不太容易混淆。图像编辑现在会应用到目标图像,即使内容包含多张图像。

集成者现在可以使用tinymceai_reviews选项添加自定义AI审查

之前,审查侧边栏仅支持一组固定的内置审查,通过tinymceai_reviews选项按ID选择。集成者没有受支持的方式添加命名审查、参数化提示词或混合内置和自定义审查的菜单。集成者只能依赖通用流程(如自定义审查),而非审查侧边栏中的专用审查操作。

在TinyMCE 8.7.0中,tinymceai_reviews选项还接受集成者定义的审查对象以及现有的内置字符串ID。集成者可以定义simple、list和input审查类型,每种类型都有自定义名称、描述和提示词。有关完整模式和示例,请参阅tinymceai_reviews选项。

替换内容时,AI建议预览不再显示已删除的文本

之前,在审查AI建议时,对于替换操作,预览会并排显示已删除的文本和插入的文本。这会使预览杂乱且难以阅读,因为必须同时解析原始内容和新内容,尤其是当文档包含多个替换时。

在TinyMCE 8.7.0中,预览会隐藏替换操作中已删除的文本,仅显示新内容。当选择替换时,会显示并高亮插入的内容,而删除的文本保持隐藏。单独的删除操作在选择时仍会显示删除的文本,因此纯删除操作完全可见。这使得在审查AI生成的更改时,预览更简洁且易于阅读。

AI预览与编辑器内容结构不匹配,导致样式渲染差异

之前,AI建议预览会在预览iframe的body内的一个包装元素中渲染内容,而非像编辑器那样直接渲染到iframe的body中。由于预览和编辑器的结构不同,注入的样式可能会以不同方式渲染。绝对定位的元素和body级CSS规则不一定以相同方式应用,这可能导致诸如表格页眉和页脚错位等问题。

在TinyMCE 8.7.0中,预览会将内容直接插入iframe的body中,使其结构与编辑器一致。注入的样式现在会在两者中产生相同的视觉效果,预览会与编辑器一致渲染。

审查AI建议时的批量操作按钮现在会反映当前进度

之前,在审查AI建议时,批量操作按钮总是显示跳过剩余和应用剩余,即使在尚未应用或跳过任何建议之前也是如此。这很令人困惑,因为尚未做出任何决定。

在TinyMCE 8.7.0中,批量操作按钮会反映当前进度。在首次决定之前,它们会显示全部跳过和全部应用,然后在至少应用或跳过一个建议后切换为跳过剩余和应用剩余。这种行为在聊天和快速操作流程中一致。

现在,仅当内容过长无法完整显示时才会出现某些工具提示

之前,TinyMCE AI界面中的某些工具提示只要满足触发条件就会显示,即使内容已完全可见。这会增加不必要的视觉杂乱。

在TinyMCE 8.7.0中,仅当内容因过长无法完整显示而被截断时,这些工具提示才会出现。这减少了不必要的工具提示,使界面更简洁。

用户提示词中的空白在AI聊天历史记录中未正确渲染

此前,AI 聊天历史中显示的用户提示词会合并连续的空格和换行符。多行提示词会显示为一行连在一起的文字,因此聊天线程中的消息与输入内容不匹配。

在 TinyMCE 8.7.0 中,AI 聊天历史中的用户提示词会保留原始的换行和间距,同时长行仍会在消息内自动换行。提示词现在按输入时的原样显示。

将 AI 建议预览中的纯图标按钮替换为带标签的“应用”和“跳过”按钮

此前,AI 建议预览使用仅含图标的接受和拒绝按钮,因此每个操作的含义依赖于图标及其工具提示。这使得这些操作含糊不清且更难被发现。

在 TinyMCE 8.7.0 中,AI 建议预览使用带标签的按钮:一个主要 应用按钮用于接受建议,一个次要 跳过按钮用于拒绝建议。更清晰的标签使每个操作一目了然,并提高了可访问性。

调整浏览器窗口大小时,AI 建议差异覆盖层并不总能保持对齐

此前,在 AI 聊天生成新内容后,调整浏览器窗口大小可能会导致 AI 建议差异覆盖层与底层文本不对齐。在某些布局中,高亮显示会脱离其标记的内容,使得建议预览看起来损坏了。

在 TinyMCE 8.7.0 中,预览覆盖层会追踪窗口调整大小时发生的更广泛的尺寸变化。差异覆盖层现在能与生成的内容保持对齐,从而确保 AI 建议预览的准确性。

减少了 AI 审查建议卡片的间距

此前,AI 审查侧边栏中的审查建议卡片使用的内边距比预期的要多,这使得卡片布局看起来与设计不一致。

在 TinyMCE 8.7.0 中,卡片标题与正文之间的间距已减小以匹配设计。审查建议卡片现在具有更紧凑、一致的外观。

使用高级 Snow 皮肤时,编辑器内容会透过 AI 建议预览可见

此前,使用高级 Snow 皮肤时,AI 建议预览覆盖层的背景是透明的。底层的编辑器内容会透过预览显示出来,这使得阅读和评估 AI 生成的建议变得困难。

在 TinyMCE 8.7.0 中,AI 建议预览在 Snow 皮肤中使用纯白色背景。建议现在显示在干净、无遮挡的背景上。

预览页脚中的键盘导航现在会聚焦当前活动的视图模式,而不是总是聚焦第一个视图模式

此前,将键盘焦点移到 AI 聊天预览页脚时,总是会落在第一个视图模式选项上,而不是当前活动的那个选项。这使得在差异模式和预览标签页之间的键盘导航变得不太可预测。

在 TinyMCE 8.7.0 中,焦点会移动到预览页脚中当前活动的视图模式。键盘导航现在能反映当前的选中项。

现在,在离开未解决的建议之前(例如在快速操作期间切换到另一个侧边栏或打开侧边栏时)会显示确认对话框

此前,当 AI 建议仍未解决时,在 AI 聊天和审查侧边栏之间切换,或在快速操作期间打开侧边栏,会永久丢弃这些建议及任何已应用的更改。一次意外的点击就可能导致进度丢失。

在 TinyMCE 8.7.0 中,在离开未解决的建议之前会显示确认对话框。该操作仅在确认后才会执行,从而防止意外丢失进行中的更改。

在 Safari 中,将鼠标悬停在因省略号而缩短的上下文源或对话标题上时,会同时显示两个工具提示

此前,在 Safari 中,将鼠标悬停在因省略号而缩短的文本(如 AI 聊天对话标题或上下文源)上时,可能会同时显示两个工具提示:浏览器的原生工具提示和插件的自定义工具提示。

在 TinyMCE 8.7.0 中,对于 Safari 中的这些元素,只显示原生工具提示。现在,悬停时会按预期显示单个工具提示。

中止并开始新对话时可能会报告错误

此前,中止流式传输的 AI 响应并开始新对话可能会报告错误。中止响应会触发一个文档删除操作,而该操作有时会失败。

在 TinyMCE 8.7.0 中,当 AI 请求被中止时,文档不再被删除。中止响应并开始新对话不再报告此错误。

AI 响应的 HTML 在显示到预览中之前,现在会通过编辑器的内容管道进行过滤

此前,AI 预览中显示的内容在应用之前不会被编辑器的内容规则过滤。如果配置了严格的 schema,一个更改可能看起来在预览中存在、被接受,然后在应用到编辑器时被移除,因此最终结果与预览不匹配。

在 TinyMCE 8.7.0 中,AI 响应的 HTML 在显示到预览中之前会先通过编辑器的内容管道过滤。预览现在反映了将要添加到编辑器中的内容,如果过滤移除了所有内容,用户会收到通知。

如果在模型开始响应之前关闭侧边栏,AI 聊天状态会丢失

此前,如果聊天侧边栏在模型开始响应提示词之前关闭,AI 聊天对话的状态可能会丢失。插件只在响应开始时才记录是哪个侧边栏启动了响应,因此提前关闭侧边栏不会留下记录。重新打开侧边栏会重置对话和任何待处理的预览。

在 TinyMCE 8.7.0 中,一旦发送提示,Chat 侧边栏即会记录。在响应准备好之前关闭并重新打开 Chat 侧边栏不再重置对话。

有关 TinyMCE AI 插件的信息,请参见:TinyMCE AI。

改进

TinyMCE 8.7.0 还包括以下改进:

移除了表情符号对话框 All 标签页上的 300 项限制

以前,表情符号对话框将 All 标签页限制为 300 项。此限制是一种变通方法,因为渲染所有可用的表情符号(超过 1,200 个)会导致性能问题和卡顿体验。

在 TinyMCE 8.7.0 中,表情符号对话框的渲染性能已得到优化,并且 All 标签页上的 300 项限制已被移除。现在所有可用的表情符号都会显示。

在打开的菜单上按 Tab 或 Shift+Tab 现在会关闭菜单并将焦点移动到下一个或上一个可聚焦元素

以前,在打开的下拉菜单内按 Tab 或 Shift+Tab 会循环遍历菜单项,而不是关闭菜单。这种行为不符合无障碍指南,该指南建议 Tab 键应关闭菜单并将焦点移动到 tab 顺序中的下一个或上一个元素。因此,对于依赖键盘或辅助技术的用户来说,通过菜单的键盘导航不太可预测。

在 TinyMCE 8.7.0 中,在打开的菜单上按 Tab 或 Shift+Tab 现在会关闭菜单并将焦点移动到 tab 顺序中的下一个或上一个可聚焦元素。这使得键盘导航更加可预测,并使下拉菜单行为与无障碍指南一致。

编辑器调整大小手柄现在使用浏览器指针事件,以便在不同的集成环境中更可靠地工作

以前,编辑器调整大小手柄依赖一个覆盖层元素来捕获指针移动,这需要提高编辑器的堆叠顺序。这导致在编辑器调整大小时,编辑器出现在 TinyMCE AI 插件使用的浮动侧边栏上方。

在 TinyMCE 8.7.0 中,调整大小手柄改为使用现代浏览器指针事件。这消除了对覆盖层元素和提高的堆叠顺序的需求,在不同的集成环境中提供更可靠的调整大小功能,并解决了与浮动侧边栏的重叠问题。

新增功能

TinyMCE 8.7.0 还包括以下新增功能:

用于屏幕阅读器公告的新 tinymce.dom.AriaAnnouncer API

TinyMCE 8.7.0 添加了 tinymce.dom.AriaAnnouncer API,用于通过 aria-live 区域向屏幕阅读器发送消息,而不会移动焦点。announce 方法接受一个消息和一个可选的 { assertive } 设置。集成者可以使用它来公告格式更改,例如通过监听 FormatApply 和 FormatRemove 事件。

tinymce.dom.AriaAnnouncer.announce('Bold on');
tinymce.dom.AriaAnnouncer.announce('Error occurred', { assertive: true });

更改

TinyMCE 8.7.0 还包括以下更改:

将 LESS 数学模式从 always 更改为 parens-division。

以前,Oxide Less 编译器使用 math: 'always' 运行,该模式将每个 / 字符都视为除法运算符。使用现代 CSS 颜色语法,Oxide Less 编译器可能会错误地编译函数,如 rgb(10 10 10 / 10%) 或 hsl(from var(--color) h s l / 10%)。在某些情况下,编译器会静默产生不正确的值,而不会发出警告,例如 rgb(10 10 10 / 10%) 变成 rgb(10, 10, 1),而不是保留 alpha 通道。

在 TinyMCE 8.7.0 中,Oxide Less 编译器使用 parens-division 数学模式。编译器仅在操作被包裹在括号中时才评估除法,并在 CSS 颜色语法中保留 /。TinyMCE 更新了 Oxide Less 文件中的现有除法表达式,以将除法包裹在括号中。编译 Oxide Less 的自定义皮肤作者必须将除法运算包裹在括号中。

从源代码构建 TinyMCE 现在使用 Bun 而不是 Yarn

以前,从源代码构建 TinyMCE 需要 Yarn,并且仓库提供了一个 yarn.lock 文件来锁定依赖项版本。贡献者和自定义皮肤作者运行诸如 yarn、yarn build 和 yarn oxide-start 之类的命令。

在 TinyMCE 8.7.0 中,仓库使用 Bun 进行包管理和构建脚本,并提供一个 bun.lock 文件来代替 yarn.lock。等效的命令是 bun install、bun run build 和 bun oxide-start。Yarn 不再解析仓库依赖项。此更改不影响从 npm 安装 TinyMCE 或从内容交付网络 (CDN) 加载它的集成者。有关更新的皮肤构建步骤,请参见创建皮肤。

错误修复

TinyMCE 8.7.0 还包括以下错误修复:

块格式现在在跨表格单元格选择时以正确的元素为目标

以前,当选择多个表格单元格时,检查块是否可以重命名时不会检查嵌套元素。例如,当一个 blockquote 包含一个标题时,应用新的标题格式会更改 blockquote 而不是标题。

在 TinyMCE 8.7.0 中,检查会检查嵌套元素,因此块格式会应用于正确的元素。

当选择不可编辑的内联元素时,现在可以应用块格式

此前,当选择一个内联的contenteditable="false"元素(例如,由媒体插件包裹的iframe)并应用块级格式(例如自定义类或标题样式)时,操作会静默失败,并且不产生任何效果。

在 TinyMCE 8.7.0 中,这种情况下块级格式将应用于最近的可编辑父级块,包括添加类和样式,以及更改块标签。

缩进现在应用于所有选中的表格单元格

此前,当选中多个表格单元格并应用缩进时,只会影响指针松开时所在的单元格。该操作使用的是浏览器的原生选区,而非编辑器的单元格选区,因此其余选中的单元格保持不变。

在 TinyMCE 8.7.0 中,缩进将应用于选区中的所有单元格。

拖放或复制粘贴图片时,未在标签中添加width和height属性。

此前,当用户将图片拖放或复制粘贴到编辑器中时,TinyMCE 会插入一个不带width和height属性的img标签。插入的img标签缺少图片对话框所添加的尺寸属性。

在 TinyMCE 8.7.0 中,编辑器会读取拖放或粘贴图片的尺寸,并将width和height属性添加到img标签中。拖放或粘贴的图片现在包含了与图片对话框所添加的相同的width和height属性。

当编辑器托管在 shadow DOM 中,且其父级元素使用了overflow:scroll时,工具提示会被裁剪。

此前,当 TinyMCE 在 shadow DOM(如 Web 组件)中运行时,如果宿主的父级元素使用了overflow: scroll,则任何超出宿主元素边界的工具提示都会被该元素裁剪。被裁剪的工具提示可能会变得无法阅读。

TinyMCE 8.7.0 将工具提示的定位限制在宿主元素的边界内。现在,当 TinyMCE 在 shadow DOM 中运行时,工具提示会重新定位以保持在宿主元素内,并保持可见。

删除列表项内的换行符会删除整个列表项。

此前,在仅有一个换行符(<br>)的空列表项中,按 Backspace 键删除换行符会移除整个列表项,而不仅仅是换行符。此问题影响了通过 Shift + Enter 创建的列表(包括嵌套列表),并会在没有警告的情况下删除内容。

在 TinyMCE 8.7.0 中,Backspace 键只会移除换行符,并保留空的列表项。

解析时,style 属性中的 CSS 自定义属性名称和颜色值会被转换为小写

此前,TinyMCE 样式解析器在读取style属性时,会将 CSS 自定义属性名称(如--MyColor)以及color和background-color的值转换为小写。这改变了区分大小写的值,包括 CSS 自定义属性、模板占位符(如{{FooBar}})和十六进制颜色(如#AABBCC),因此受影响的样式有时无法按设计原样呈现。

在 TinyMCE 8.7.0 中,样式解析器保留了 CSS 自定义属性名称以及color和background-color值的原始大小写。标准属性名称仍然会转换为小写,其他处理(如 RGB 到十六进制的转换、简写合并和安全过滤)保持不变。区分大小写的颜色和自定义属性现在将完全按设计原样保留。

深色模式下,获得焦点的链接文本颜色与背景色相同

此前,在深色模式下,获得焦点或被选中的链接所显示的文本颜色与背景色相同。这使得链接文本在被选中时无法阅读。

在 TinyMCE 8.7.0 中,深色模式下被选中的链接文本将以白色显示。链接在获得焦点时保持可读,这改善了深色模式下的可访问性。

位置为 'line' 的上下文工具栏在溢出视口时,不会重新定位到另一侧

此前,一个配置了position: 'line'的上下文工具栏(例如 quickbar)在溢出视口边缘时不会重新定位。在这种情况下,工具栏可能会被截断,导致用户无法点击其按钮。

在 TinyMCE 8.7.0 中,当空间不足时,使用position: 'line'的上下文工具栏现在会翻转到另一侧。在受限布局中,工具栏保持完全可见和可用。

部分标注的文本在打印时应显示,却被隐藏

此前,由标注功能(如拼写指示器)标记的文本在页面打印时可能会被隐藏。这些标注被包裹在内部的占位符元素中,这些占位符元素在打印时会被隐藏,从而也隐藏了其中的文本。

在 TinyMCE 8.7.0 中,仅作为包裹元素的占位符元素在打印时会隐藏其样式,而不是其内容。标注高亮在打印输出中仍然隐藏,而底层文本则按预期打印。

修复了一个 Chromium 浏览器 bug,即点击li右侧可能失败

此前,点击列表项内容右侧的位置可能会将光标置于列表项的开头,而不是实际点击的位置。这是由一个 Chromium 浏览器 bug 引起的,该 bug 会将插入符移动到不正确的位置。

在 TinyMCE 8.7.0 中,一个针对性的变通方案可以检测这种情况并校正插入符位置。现在,点击列表项右侧会将光标放置在预期位置。

使用撤销键盘快捷键无法正确恢复编辑器选区

此前,在删除选区后按撤销快捷键(Ctrl+Z 或 macOS 上的 Cmd+Z)可能会导致光标停留在错误的位置。之前的一项更改会在每次按下 Ctrl 或 Cmd 时注册一个多余的撤销步骤,因此该步骤会在被删除内容恢复之前被记录下来。

在 TinyMCE 8.7.0 中,TinyMCE 仅在按下 Ctrl 或 Cmd 键的同时按下 Backspace 或 Delete 键时才会注册该撤销步骤,而不是每次按下 Ctrl 或 Cmd 键时都注册。现在,撤销对选区的删除操作可以正确恢复内容和原始选区。

在没有本地构建的情况下启动 Oxide 皮肤演示会失败,且错误信息不明确

此前,如果在从仓库根目录构建 TinyMCE 之前启动 Oxide 皮肤演示,将会出现 chalk.red is not a function 错误。演示构建任务尝试报告缺失的本地构建,然后替换为托管在云端的 TinyMCE 副本。但报告步骤反而引发了错误。自定义皮肤作者无法运行演示来测试皮肤更改,并且错误消息未将缺失的本地构建识别为原因。

在 TinyMCE 8.7.0 中,演示构建任务会停止并显示一条消息,指出所需的步骤:

Local TinyMCE build not found. Run `bun run build` in the repository root to build TinyMCE before starting the skin demo.

演示构建任务不再替换为托管在云端的 TinyMCE 副本,因此演示始终会针对本地构建运行。自定义皮肤作者现在可以在启动演示之前构建 TinyMCE 来解决该失败问题。