uni-app 的 web-view 加载 某些H5页面时,点击返回报错 mui is not defined

本文介绍如何在使用MUI开发的网页中,通过注入JS代码禁用返回键的监听功能,避免页面意外关闭。具体操作是在web-view加载完成后,使用evalJS方法执行mui.init配置,将backbutton选项设为false。

因为这些网页是用 mui 开发的,需要将 mui 的返回关闭

mui.init({
  keyEventBind: {
  backbutton: false //关闭back按键监听
  }
});

可以在 web-view 里向 这些页面注入 这段js

onReady() {
            // #ifdef APP-PLUS
            var currentWebview = this.$scope.$getAppWebview().children()[0];
            //监听注入的js
            currentWebview.addEventListener("loaded", function() {
                currentWebview.evalJS(
                  "mui.init({keyEventBind: {backbutton: false }});"
                );
            });
            // #endif
        },

### H5 `web-view` 嵌套其他程序出现 `'Uncaught ReferenceError: uni is not defined'` 错误的解决方案 当在 H5 页面中通过 `web-view` 组件嵌套另一个程序,如果遇到 `'Uncaught ReferenceError: uni is not defined'` 的错误,通常是因为目标页面尝试访问 `uni` 对象,而此对象仅在原生环境中可用,而在纯浏览器环境下不可用。 以下是可能的原因分析以及对应的解决方法: #### 1. **原因分析** -Uni-app 中,`uni` 是一个全局对象,用于提供 API 调用功能。然而,当使用 `web-view` 加载外部 H5 页面,这些页面运行于独立的 WebView 容器中,无法直接访问宿主应用中的 `uni` 对象[^3]。 - 如果目标页面依赖 `uni` 进行某些操作(如导航、弹窗等),则会抛出 `'uni is not defined'` 的错误。 --- #### 2. **解决方法** ##### 方法一:修改目标页面逻辑 确保目标页面不会直接调用 `uni` 对象的功能。可以通过条件判断来兼容不同环境下的行为: ```javascript if (typeof uni !== 'undefined') { // 使用 uni 提供的功能 uni.showToast({ title: '这是一个提示', icon: 'none' }); } else { // Fallback 到 Web 环境的行为 alert('这是一个提示'); } ``` 这种方法适用于开发者能够修改目标页面源码的情况[^3]。 --- ##### 方法二:通过 JavaScript 注入实现跨容器通信 利用 `evalJS` 或者 `window.postMessage` 实现宿主页面与子页面之间的数据交互。例如,在宿主页面中向子页面注入自定义函数作为替代方案: ```javascript onReady() { const currentWebview = this.$mp.page.$getAppWebview(); // 获取当前 WebView 实例 currentWebview.addEventListener('loaded', () => { currentWebview.evalJS(` window.uni = {}; window.uni.showToast = function(options) { alert(options.title); }; `); }); } ``` 这样可以在子页面中模拟部分 `uni` 功能,从而避免因未定义而导致的错误[^3]。 --- ##### 方法三:调整加载策略 如果多个地方都需要加载类似的外部链接,则可以创建统一的内部页面模板专门处理此类需求。具体做法是在项目目录下新增一个通用页面(如 `external-link.vue`),并通过参数动态指定要加载的内容地址[^2]: ```html <template> <web-view :src="url"></web-view> </template> <script> export default { data() { return { url: '' } }, onLoad(option) { this.url = option.link; } }; </script> ``` 之后只需传入对应 URL 即可完成跳转,同减少重复编码工作量。 --- ##### 方法四:检查是否存在第三方库冲突 有该问题也可能源于所使用的前端框架版本差异引起。比如旧版 MUI 初始化过程中可能会意外覆盖掉一些必要的变量声明,进而引发连锁反应。此建议升级至最新稳定发行版或者按照官方文档重新配置初始化流程[^1]。 另外需要注意的是,对于特定场景还需要考虑是否遗漏了必要插件安装或是开启了实验性特性开关等问题[^4]^。 --- ### 总结 综上所述,“`uni is not defined`”的主要成因在于跨平台适配不足所致;针对这一现象我们分别探讨了几种可行的技术手段加以应对——既包括直接改造业务代码本身使其具备更强健性的思路,也有借助中间层代理机制间接解决问题的办法等等。实际运用当中可根据具体情况灵活选用最合适的那一种方式进行优化改进即可有效规避同类异常再次发生的风险。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值