rich-text 组件在小程序端直接过滤 <video> 标签,因其不在平台白名单中;应改用 uParse 插件或手动拆解 HTML 混合渲染,并注意 iOS 宽高设置及 z-index 冲突。

rich-text 组件在小程序端根本不会解析 <video> 标签——它不是渲染异常,是直接过滤。别浪费时间调样式或加事件监听,这个标签从解析阶段就被丢弃了。
为什么 rich-text 里 <video> 会消失
uni-app 的 rich-text 在小程序平台底层走的是 WXML 节点映射,而微信/支付宝等平台原生不允许多媒体标签混入富文本流。官方白名单里明确不含 video、audio、iframe,所有这类节点会被静默剔除,连 warning 都不抛。你看到的“空白”,其实是 DOM 树里压根没生成对应节点。
- 传字符串时,
<video src="xxx.mp4"></video>整段被跳过,不进nodes数组 - 即使手动构造
nodes数组并塞入name: 'video',也会被内部校验拦截,降级为空对象 - 小程序平台对
<video>有独立生命周期和上下文(如全屏控制、后台播放权限),无法与富文本滚动同步
用 uParse 替代 rich-text 渲染含视频的 HTML
uParse 是目前最稳妥的跨端方案,它不依赖 rich-text,而是将 HTML 字符串在运行时解析为各平台原生可识别的组件树,<video> 会被自动转成 <video> 组件而非丢弃。
- 必须从 DCloud 插件市场下载官方版,npm 安装的某些 fork 版本依赖
document,小程序里直接报错 - 引入后替换原
<rich-text :content="html"></rich-text>为<u-parse :content="html"></u-parse> - 视频默认不自动播放,需显式加
controls属性:在传入前用正则补上,例如html.replace(/<video/gi, '<video controls') - 若需自定义封面图或点击行为,监听
@preview事件,在回调里调用uni.createVideoContext
手动拆解 HTML + 混合渲染(适合轻量场景)
如果项目已上线、无法引入插件,或只需支持单个视频,可用正则提取 + 原生组件组合的方式绕过限制。
- 用
/<video[^>]*src=[\'"]([^\'"]+)[\'"][^>]*>/gi提取所有视频 URL,再用split()切割 HTML 字符串为纯文本段和视频段 - 渲染时用
v-for遍历分段数组:v-if="item.type === 'text'"用<rich-text :nodes="item.nodes"></rich-text>;v-else-if="item.type === 'video'"用<video :src="item.src" controls></video> - 注意 iOS 小程序中
<video>必须设width和height,否则可能不触发渲染,建议固定宽高比容器 +object-fit: cover - 不要用
v-html渲染文本段——它在小程序端完全无效,仍得走rich-text或nodes构造
真正麻烦的不是怎么让视频出来,而是视频加载时机、全屏退出后页面滚动位置丢失、以及 iOS 下 video 组件与 rich-text 内容区域的 z-index 冲突。这些细节不写进初始化逻辑,上线后就会变成深夜排查的 bug。


















