【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题

在开发 Web 应用时,尤其是集成了 Unity WebGL 内容的页面,遇到一个问题:当 Unity WebGL 渲染内容嵌入到一个 Tab 中时,切换 Tab 后画面会变黑,直到用户点击黑屏区域,才会恢复显示。

这个问题通常是因为 Unity 渲染在 Tab 切换时被暂停或未能获得焦点所致。

在本文中,我们将介绍如何在使用 Layui 框架时,通过监听 Tab 切换事件并强制 Unity WebGL 渲染恢复,来解决这一问题。

1. 问题描述

当 Unity WebGL 内容嵌入到页面中的多个 Tab 中时,用户切换 Tab 时,Unity 渲染内容可能会变黑。问题的根源通常是 Unity 渲染在 Tab 切换后没有正确地恢复,导致渲染被暂停或者丢失。

2. 解决思路

要解决这个问题,关键是确保每次切换到包含 Unity WebGL 的 Tab 时,Unity 渲染能够继续运行。具体思路如下:

  • 监听 Tab 切换事件:通过 Layui 框架提供的事件,监听 Tab 切换,获取当前激活的 Tab。
  • 强制 Unity canvas 获取焦点:每当 Tab 切换时,通过 JavaScript 强制切换到的 Tab 中的 Unity canvas 元素获得焦点,这样 Unity 渲染就能继续正常显示。

3. 解决方案实现

步骤 1:监听 Tab 切换事件

Layui 框架中的 element 模块提供了 tab 事件,可以用于监听 Tab 的切换。当 Tab 切换时,可以通过事件获取到当前活动 Tab 的索引值,并确定哪个 Tab 中包含 Unity WebGL 内容。

步骤 2:获取当前 Tab 中的 Unity canvas

Unity WebGL 通常嵌入在一个 iframe 中,iframe 内部包含 Unity 渲染的 canvas 元素。在 Tab 切换时,我们需要访问该 iframe,并获取其中的 Unity canvas 元素。

步骤 3:强制获取焦点

JavaScript 的 focus() 方法可以确保 canvas 元素获得焦点,从而恢复 Unity 的渲染。

完整代码实现
layui.use(['element'],function(){var element = layui.element;// 监听 Tab 切换事件 element.on('tab(xbs_tab)',function(data){// 获取当前选中的 tab 对应的 iframevar activeTabId = data.index;var iframe =$('.x-iframe').eq(activeTabId);// 获取当前 tab 对应的 iframe// 获取 iframe 中的 Unity canvas 元素,若存在,则主动获取焦点var unityCanvas = iframe.contents().find('#unity-canvas')[0];if(unityCanvas){ unityCanvas.focus();// 强制 Unity canvas 获取焦点}});});

4. 代码解析

  • layui.use(['element'], function() {...}):加载 Layuielement 模块,使用 element 模块来处理 Tab 事件。
  • element.on('tab(xbs_tab)', function(data) {...}):监听 tab(xbs_tab) 事件,用户切换 Tab 时触发该回调函数。
  • $('.x-iframe').eq(activeTabId):通过 activeTabId 获取当前选中的 Tab 对应的 iframe 元素。
  • iframe.contents().find('#unity-canvas')[0]:获取当前 iframe 中的 Unity WebGL canvas 元素。
  • unityCanvas.focus():强制 Unity canvas 获取焦点,确保渲染恢复。

5. 测试与优化

在实现了上述代码后,切换 Tab 时 Unity 渲染应能正常恢复。如果仍然存在渲染延迟或异常的情况,可以尝试以下优化措施:

  • Tab 切换时延迟处理:如果需要在 Unity WebGL 内容加载完成后再恢复渲染,可以在切换 Tab 后稍作延迟再调用 focus() 方法。
  • 确保 iframe 加载完成:确保 iframe 中的内容加载完成后再进行焦点恢复操作。可以通过监听 iframe 的加载事件来控制焦点的恢复时机。

6. 总结

通过监听 Layui 框架的 Tab 切换事件并强制 Unity WebGL 的 canvas 元素获取焦点,我们成功解决了 Unity 渲染在 Tab 切换时变黑的问题。这个方法简单有效,不依赖于浏览器的 focusvisibilitychange 事件,因此在 Tab 切换时能够稳定地恢复渲染。

如果你在开发过程中遇到类似问题,希望本篇博客能为你提供一些帮助和启发。如果有任何问题或其他解决方案,欢迎在评论区交流!

Read more

【博主推荐】 Microi吾码开源低代码平台,快速建站,提高开发效率

【博主推荐】 Microi吾码开源低代码平台,快速建站,提高开发效率

🍬引言 🍬什么是低代码平台? 低代码平台(Low-Code Platform)是一种使开发人员和业务用户可以通过图形化界面和少量的编程来创建应用程序的开发工具。与传统的编程方式相比,低代码平台大大简化了开发过程,允许用户使用拖放、配置和自动化功能来构建应用程序。其核心理念是通过预建的模板和组件,降低编程门槛,减少开发时间。 低代码平台的目标是让更多的人能够参与到应用程序的开发过程中,不仅是程序员,甚至业务人员也能参与进来,推动业务需求和技术实现的快速对接。 🍬低代码平台有什么用? 低代码平台的主要用途包括: * 快速应用开发:开发人员可以利用预构建的模块和模板迅速创建应用程序,减少从设计到交付的时间。 * 业务人员参与开发:低代码平台通常提供简化的图形界面和配置工具,让非技术人员(如业务人员)也能在一定程度上参与应用开发和定制。 * 简化维护和迭代:通过简化代码和自动化部署,低代码平台使得应用的更新和维护更加简单,尤其是在频繁变化的业务环境中。 * 支持多平台开发:许多低代码平台支持跨平台开发,意味着开发者可以一次性创建的应用可以运行在多个平台(如Web、

By Ne0inhk
开源本地AI助手OpenClaw详解:从零开始,手把手安装

开源本地AI助手OpenClaw详解:从零开始,手把手安装

在AI助手遍地开花的今天,一款能让你完全掌控数据、兼具强执行力与高灵活性的工具显得尤为珍贵——OpenClaw便是这样一款开源个人AI助手。它打破了传统云端AI的局限,运行在你的本地设备上,可通过WhatsApp、Telegram等10+主流聊天平台交互,既能操作系统、控制浏览器,也能扩展技能、持久记忆,堪称你的“私人数字员工”。 1 OpenClaw为什么值得安装? 直接一张图告诉你为什么选OpenClaw: 当 Claude Code 和 OpenCode 还在局部战场较量时,OpenClaw 已构建起完整的能力闭环。尤其是“自我修复”和“原生本地自动化”这两项,让它真正具备了处理复杂连续性任务的能力,优势不止一点点。 2 环境安装 2.1 NodeJS安装 安装OpenClaw的前提条件是安装Node 22或者以上的版本,如图所示: 下载位置:Node.js 双击打开之后,按照以下步骤操作: 这里选择安装位置之后,点击Next: 使用以下命令检查是否安装成功: node--version

By Ne0inhk

阿里开源 OpenClaw:5分钟本地搞定多 Agent 团队!

大家好,我是玄姐。 阿里开源 Team 版 OpenClaw:HiClaw 发布,5分钟本地搞定多 Agent 团队! 作为模型服务的新入口,OpenClaw 曾凭借强大的自动化能力(写代码、查邮件、操作 GitHub、设置定时任务)让无数开发者大呼过瘾。这种通过 IM 直接下发指令的交互创新,确实带来了极大的“爽感”。 但是,随着你的指令积压、Long Horizon(长周期)项目越来越多,原生 OpenClaw 的短板开始暴露: * 安全风险在裸奔:每个 Agent 都要配置自己的 API Key。GitHub PAT、LLM Key 散落各处。2026年初的漏洞事件提醒我们,这种 "self-hackable"

By Ne0inhk
gitee:The requested URL returned error: 400,The requested URL returned error: 403,已解决

gitee:The requested URL returned error: 400,The requested URL returned error: 403,已解决

🛠️ The requested URL returned error: 400,The requested URL returned error: 403, Gitee代码推送问题排查与解决复盘 1. idea推送突然遇到的报错现象,同时用命令行推送也出现同样的问题: 🔴 现象一:403 Forbidden * 报错信息:fatal: unable to access '...': The requested URL returned error: 403 🔴 现象二:400 Bad Request * 报错信息:remote: [session-xxx] reject by [gitee] ... error: 400 2. ❌ 尝试过但失败的方案 (HTTPS) 尝试了以下 HTTPS 修复手段,

By Ne0inhk