wangEditor 富文本编辑器移动端兼容性实测:4 类高频症状逐一定位
【免费下载链接】wangEditorwangEditor, open-source Web rich text editor 开源 Web 富文本编辑器项目地址: https://gitcode.com/gh_mirrors/wa/wangEditor
wangEditor 5.1.23 以原生 contenteditable 加 Slate 数据层构建,移动端表现高度依赖浏览器内核对选区、beforeInput、组合输入事件的实现。本文基于仓库真实源码与测试配置,梳理 4 个主流浏览器组合的适配现状、3 步真机自测法,以及光标漂移、粘贴丢样式、输入法干扰三类症状的代码级定位路径,读完后你可直接按图索骥修改自己的集成方式。
适配现状速览
先说结论:wangEditor 当前版本没有独立的"移动端模式"开关,配置项集中在 IEditorConfig 接口 中,不存在mobile、isMobile这类字段。仓库里针对移动设备的显式适配集中在两点:ua.ts 导出的IS_IOS环境标记,以及针对各内核选区行为的条件分支。各浏览器组合的实际情况如下:
| 浏览器组合 | 系统范围 | 内核能力 | 仓库内处理逻辑 | 风险点 |
|---|---|---|---|---|
| Safari | iOS 12–16 | beforeInput、选区 API 完整 | blur 时强制清除残留选区;组合输入分内核走不同分支 | 失焦后选区可能残留 |
| 微信 / X5 内核 | iOS 12+、Android 8+ | 取决于宿主 App 版本 | 复用 Safari 与 Chrome 两条既有分支 | 剪贴板数据经常取不到富文本 |
| Chrome for Android | 8–13 | beforeInput 完整 | 默认走 beforeInput 输入管线 | 软键盘挤压布局,需业务层处理 |
| Chrome 75 以下 / Edge 78 以下 | 旧系统存量 | beforeInput 缺失或异常 | 通过HAS_BEFORE_INPUT_SUPPORT判定后降级 | 粘贴、拖放走 paste / keydown 兼容路径 |
| Firefox | 桌面为主 | 支持 beforeInput,选区行为有差异 | keydown 与 composition 中单独分支 | 移动端非主要场景 |
IS_IOS的判定同时检查navigator、window是否存在,再匹配 UA 中的 iPad/iPhone/iPod 字样并排除 MSStream,避免桌面伪装 UA 误判。
3 分钟自测:你的环境踩坑了吗
自测目标只有一个:确认你的目标浏览器落在哪条代码路径上。
第 1 步:引入与初始化。用官方 CDN 或 npm 都行,以 npm 为例:
import { Boot, DomEditor } from '@wangeditor/editor' import '@wangeditor/editor/dist/css/style.css' Boot.registerModules(Boot.BASIC_MODULES) const editor = DomEditor.create({ selector: '#editor', placeholder: '开始输入', })第 2 步:移动端视口。页面meta viewport保持默认缩放,给工具栏容器加横向滚动,避免按钮被压缩到无法点按:
.w-e-bar { overflow-x: auto; white-space: nowrap; }第 3 步:跑三个动作。在目标真机上依次执行:连续快速输入 20 个汉字、从系统备忘录粘贴一段带加粗的富文本、点入编辑器再点出再点回。预期表现分别是:光标始终停在指尖位置、粘贴后加粗样式保留、第二次点入时光标回到原文本末尾而非跳到开头。任何一项不符,对照下一节按症状查。
按症状定位:高频问题拆解
光标漂移与选区残留
这个症状在 iOS Safari 上最典型,根源是 contenteditable 失焦后 DOM 选区不自动清除。仓库在 blur 钩子里对 Safari 做了强制处理:
// packages/core/src/text-area/event-handlers/blur.ts if (IS_SAFARI) { const domSelection = root.getSelection() domSelection?.removeAllRanges() }Android Chrome 上的漂移多是页面被软键盘挤压后元素重排、光标坐标跟着偏移,编辑器不直接处理布局问题,通常靠业务层调整容器高度解决。每次 change 后 syncSelection.ts 会比对 Slate 选区与 DOM 选区,不一致时回写并用scrollIntoView把光标滚进可视区,排查时可断点确认走的是哪条分支。
粘贴丢样式
微信、备忘录复制出的 HTML 常带冗余 div 包裹,iOS 上clipboardData有时取不到富文本数据,只能拿到纯文本。默认粘贴流程在 paste.ts 中:若配置了customPaste钩子则优先执行,返回false时完全接管粘贴行为;否则在beforeInput可用时走统一输入管线,不可用时回退到editor.insertData(data)。业务侧净化 HTML 的推荐入口就是customPaste,在那里做标签过滤与样式白名单处理。
中文输入法干扰与光标跳位
搜狗、百度等输入法在组合输入阶段会持续改写 DOM,此时若把 Slate 选区强行写回,光标会反复跳位。TextArea实例上有isComposing标记,syncSelection 中明确在组合期跳过选区回写:
if (textarea.isComposing && !focus) return组合输入的细节处理集中在 composition.ts,对 Safari、Chrome、Firefox 各写了一条分支,修改中文输入相关行为前建议先读这个文件。
旧浏览器 beforeInput 缺失
Chrome 75 以下与 Edge 78 以下对beforeInput支持不完整,ua.ts通过正则把这两个环境标为 legacy,并汇总为HAS_BEFORE_INPUT_SUPPORT常量。不支持时,粘贴与拖放自动走 paste、drop 兼容路径,无需业务层干预;但自定义输入扩展时注意别假设beforeInput一定存在。
调试工具链与源码入口
仓库没有专门的移动端日志开关,排查依赖三条链路。其一,yarn e2e:dev启动 Cypress 交互模式,用例位于 cypress/integration/editor.spec.ts,yarn test跑 Jest 单元测试,编写规范见 docs/test.md。其二,按模块定位:
- UA 与环境判定:
packages/core/src/utils/ua.ts - 选区同步:
packages/core/src/text-area/syncSelection.ts - 粘贴钩子:
packages/core/src/text-area/event-handlers/paste.ts - 组合输入:
packages/core/src/text-area/event-handlers/composition.ts
其三,初始化时用onCreated回调把 UA、视口尺寸、HAS_BEFORE_INPUT_SUPPORT取值打进日志,真机复现问题时一并上报,能省去大部分环境猜测。
后续计划与参与方式
后续维护以各包 CHANGELOG 为准,兼容性修复会按包独立记录。真机问题反馈建议附带设备型号、系统版本、浏览器名称与可复现步骤,新测试用例按docs/test.md的规范放入cypress/integration目录,贡献流程见 docs/join.md。
【免费下载链接】wangEditorwangEditor, open-source Web rich text editor 开源 Web 富文本编辑器项目地址: https://gitcode.com/gh_mirrors/wa/wangEditor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考