![[1.15.0] Under certain interactions, objects underneath a toast become unclickable](https://www.chat-gpts.plus/wp-content/uploads/2026/06/38047-55a7553c.jpg)
[1.15.0] Under certain interactions, objects underneath a toast become unclickable
快速结论:该报错通常发生在 Dify Studio 内点击 Toast 通知后,Toast 容器在消失动画完成后仍残留在 DOM 中,形成一层不可见但拦截点击的透明层。优先排查 Toast 容器的 pointer-events 属性设置,确保容器在动画完成后立即设置 pointer-events-none。
问题场景
用户运行 Dify(Self Hosted Docker 部署,版本 1.15.0),在 Studio 中打开应用,执行 Publish → Publish Update 操作。点击 Toast 的关闭按钮(X)后,在 Toast 淡出动画尚未完全完成前,再次点击 Toast 的中央区域。此后 Toast 虽然从视觉上消失,但其下方的 Features 按钮和 Publish 按钮变得不可点击。
报错原文
Looking at it in DevTools, it seems like a leftover fragment of the toast remains on the upper layer.
没有显式的 JavaScript 报错信息,仅表现为 UI 交互失效。DevTools 元素检查中可见 Toast 的 DOM 片段仍停留在页面上层,遮挡了后续元素。
原因分析
已知这是一个 pointer-events 相关问题。Toast 容器在关闭动画完成后可能未被正确设置 pointer-events: none,导致虽然视觉上透明不可见,但容器依然拦截其下方 DOM 元素的所有鼠标/触摸事件。
考虑到用户的行为(在淡出动画未完成时再次点击),可能原因是一个时序竞争条件(race condition):点击操作重新注册了该 Toast 元素,使其无法在动画完成后被正确从 DOM 中移除。类似问题在 Dify 的 Toast 系统中曾多次出现,比如 PR #25339 对 PublishToast 的修复,以及 PR #32820 引入的 unmountAndRemove 清理逻辑。本场景可能与当前最新的 Toast 组件(位于 @langgenius/dify-ui 包,PR #34433 迁移)的清理时机有关。
环境排查
- Dify 版本:1.15.0(确认为自托管 Docker 部署)
- 浏览器及版本:不限,但需确认无禁用 JavaScript 或样式覆盖
- Dify 部署方式:Self Hosted (Docker)
- 相关依赖包:
@langgenius/dify-ui中 Toast 组件的当前实现版本 - 操作步骤复现:严格按照 Issue 中描述的三步操作(打开应用 → Publish → 关闭 Toast → 动画未结束时再次点击)
解决步骤
- 确认问题现象:在 DevTools 的 Elements 面板中检查 Toast 关闭后的 DOM 结构,观察是否仍有 Toast 容器
<div>(可能包含role="toast"或类似属性)残留在页面中,即使其opacity或transform已为 0。该残留容器会继续阻挡点击事件。 - 应用
pointer-events修复:对 Toast 容器根元素(wrapper)应用 CSS 属性pointer-events: none,同时确保只有可交互子元素(如关闭按钮)保留pointer-events: auto。这可以防止容器本身在不可见时拦截底层元素的事件。 - 检查动画完成后的 DOM 清理:查看 Toast 组件中
unmountAndRemove或类似的清理逻辑。PR #32820 引入了unmountAndRemove用于在动画完成后及时移除 DOM 节点。确认当前 Toast 版本是否有正确的超时清理(例如在动画结束后设置setTimeout移除节点),避免因再次点击重新注册导致节点无法移除。 - 如果上述步骤未生效,可优先尝试:检查 PR #25339 中针对
PublishToast的修复模式,并将类似逻辑应用到当前 Toast 组件——确保在打开新 Toast 前,先强制移除或标记上一个 Toast 容器为已废弃,或使用ReactDOM.createPortal的唯一 portal 容器来避免残留。
验证方法
按照 Issue 中的步骤复现:在 Studio 中打开任意应用 → 点击 Publish → 点击 Publish Update → 点击 Toast 关闭按钮(X) → 在淡出动画完成前再次点击 Toast 中央区域。验证 Toast 完全消失后,其原本覆盖位置的 Features 按钮和 Publish 按钮是否可以正常点击。同时使用 DevTools 确认 Toast 容器的 DOM 元素已被完全移除,或已正确设置 pointer-events: none 且不存在残留层。



