理解window.undefined = window.undefined

本文探讨了在老版本Internet Explorer中处理undefined属性的方法。通过给window对象的undefined属性赋值为undefined,可以避免因该属性不存在而引发的错误。
在当前流行的Ajax框架源码会看到如下代码:

window.undefined = window.undefined;


或者


window['undefined'] = window['undefined'];



简单的说就是给window对象的undefined子对象赋上undefined, 在较老的浏览器window对象并没有undefined这个子对象, 所以如果使用到undefined的操作将会导致异常, 故采用window.undefined = window.undefined; 咋一看, 写法有点BT, 无法理解。在老版本的IE中window.undefined因为没有这个对象将为返回一个undefined, 在新版的IE中window.undefined = undefined, 所以采用这种方式就会避免版本较老的IE没有undefined这个对象的影响
<think>我们正在解决在uni-app App的webview中遇到`window.uni`为`undefined`的问题。根据引用内容,这个问题通常是因为在webview中引入的`uni.webview.js`脚本中注册的`uni`对象被覆盖了(因为uni-app项目本身也有一个`uni`对象)。以下是解决方案: ### 解决方法 1. **修改`uni.webview.js`源码**:将脚本中注册的`uni`对象改为其他名称(例如`webUni`),以避免与uni-app自带的`uni`对象冲突。具体步骤如下: - 下载`uni.webview.js`文件(例如从阿里云CDN下载:`https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js`)。 - 在文本编辑器中打开该文件,查找所有`uni.`的引用,并将其替换为自定义的名称(例如`webUni`)。 - 注意:主要替换对象注册的代码,例如将`window.uni = ...`改为`window.webUni = ...`。 2. **在HTML文件中使用修改后的脚本**:在`template.h5.html`(或其他HTML模板文件)中引入修改后的`uni.webview.js`文件,然后使用新的对象名(如`webUni`)进行通信。 ```html <script src="修改后的uni.webview.js路径"></script> <script> // 使用webUni代替uni document.addEventListener('UniAppJSBridgeReady', function() { webUni.postMessage({ data: '消息内容' }); }); </script> ``` 3. **在Vue中全局挂载修改后的对象**(可选,但推荐):如果需要在Vue组件中使用,可以在`main.js`中全局挂载修改后的对象(如`webUni`)为`Vue.prototype`的属性,或者使用其他全局方式(如引用[2]所示): ```javascript // main.js // #ifdef H5 import webUni from '@/utils/修改后的uni.webview.js'; // 修改后的文件路径 // #endif // #ifdef H5 Vue.prototype.$webUni = webUni; // 挂载到Vue原型 // #endif ``` 然后,在Vue组件中可以通过`this.$webUni`来访问。 4. **在webview页面中使用新对象**:在webview的H5页面中,使用修改后的对象(如`webUni`)进行通信: ```javascript // 在H5页面中 document.addEventListener('UniAppJSBridgeReady', function() { webUni.postMessage({ data: '消息内容' }); }); ``` ### 注意事项 - **确保引入顺序**:在H5模板中,确保修改后的`uni.webview.js`在uni-app框架加载之后引入,以避免覆盖问题。 - **通信方法**:使用`webUni.postMessage`代替`uni.postMessage`。 - **监听事件**:在H5页面中,仍然需要等待`UniAppJSBridgeReady`事件触发后再调用`webUni.postMessage`。 ### 引用说明 根据引用[1],通过修改`uni.webview.js`中的对象名(例如改为`webUni`)可以解决覆盖问题。引用[2]提供了一种在Vue中全局挂载修改后对象的方法。引用[3]和[4]则提供了背景知识,说明uni-app App端与webview通信的机制。 通过以上步骤,应该能够解决`window.uni`为`undefined`的问题。 [^1]: 引用[1]中提到修改`uni.webview.js`文件,将注册的`uni`对象换名(如`webUni`)。 [^2]: 引用[2]展示了如何在Vue项目中全局挂载修改后的对象。 [^3]: 引用[3]提供了App端与webview通信的背景。 [^4]: 引用[4]是uni-app官方文档关于webview通信的部分。 §§相关问题§§ 1. 如何修改`uni.webview.js`文件以避免覆盖问题? 2. 在uni-app中,如何实现App端与webview的双向通信? 3. 除了修改对象名,还有哪些方法可以解决全局变量冲突问题? </think> ### Uniapp App Webview中`window.uni = undefined`的解决方案 #### 问题原因 在 Uniapp 的 App Webview 中,`window.uni` 被覆盖或未正确初始化,导致为 `undefined`。主要原因是: 1. **对象覆盖冲突**:Uniapp 自带的 `uni` 对象与 `uni.webview.js` 注册的 `uni` 对象冲突(引用[1])。 2. **脚本加载顺序问题**:`uni.webview.js` 未在 UniAppJSBridgeReady 事件后执行(引用[4])。 --- ### 解决方案(分步实现) #### 方法一:修改 `uni.webview.js` 源码(推荐) 1. **下载并修改脚本**: - 从 CDN 下载 `uni.webview.js`(如 `https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js`) - 将文件中所有 `uni.` 替换为 `webUni.`(避免覆盖)[^1] ```javascript // 修改前:window.uni = {...} // 修改后:window.webUni = {...} // 关键修改点 ``` 2. **在 HTML 模板中使用修改后的脚本**(`template.h5.html`): ```html <script src="/修改后的/uni.webview.js"></script> <script> document.addEventListener('UniAppJSBridgeReady', () => { // 使用 webUni 代替 uni webUni.postMessage({ data: "Hello App" }); // ✅ 正常通信 }); </script> ``` #### 方法二:全局挂载新对象(Vue项目) 1. **在 `main.js` 中挂载自定义对象**(引用[2])[^2]: ```javascript // main.js // #ifdef H5 import uWeb from "@/utils/修改后的-uni.webview.js"; // 修改后的文件 Vue.prototype.$uWeb = uWeb; // 挂载到Vue原型 // #endif ``` 2. **在 Webview 页面调用**: ```javascript // Vue组件中 this.$uWeb.postMessage({ data: "消息内容" }); ``` --- ### 完整示例代码 ```html <!-- template.h5.html --> <script> document.addEventListener('UniAppJSBridgeReady', () => { // 检查对象是否存在 if (window.webUni) { webUni.postMessage({ action: "ready" }); // ✅ 成功通信 } else { console.error("webUni undefined!"); // ❌ 错误处理 } }); </script> ``` --- ### 注意事项 1. **事件监听顺序**:必须在 `UniAppJSBridgeReady` 事件触发后调用 `postMessage`(引用[4])[^4]。 2. **iOS 特殊处理**:iOS 需额外配置 `allowsInlineMediaPlayback` 等属性(引用[3])[^3]。 3. **替代方案**:若不想修改源码,可使用 `window.parent.postMessage` 实现跨页面通信(引用[3])[^3]。 > **关键点总结**:通过重命名 `uni.webview.js` 的全局对象(如 `webUni`)避免覆盖,并确保在正确事件中初始化。 : 引用[1]指出需手动修改 `uni.webview.js` 中的对象名避免覆盖。 [^2]: 引用[2]提供全局挂载自定义对象的方案。 [^3]: 引用[3]提到 iOS 设备和跨页面通信的替代方案。 : 引用[4]强调 `UniAppJSBridgeReady` 事件是通信前提。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值