fix(harmony): 修鸿蒙元服务 JSVM 兼容性
基于 .logs/harmony-debug.log 排查,修复 3 类 runtime 错误:
1. isWeChatMiniProgram / cashier autoPay / ai-chat 复制文本
- 鸿蒙 JSVM 没有 navigator 全局, navigator.userAgent 直接 ReferenceError
- 加 typeof navigator === 'undefined' 守卫,Harmony 上返回 false,
业务落到 isWeiXin()(已被 #ifdef H5 框住,Harmony 上也 false)→ 普通登录
2. diy-category getHeightArea
- onShow 在 mounted 前触发,query 还是 undefined
- query 重新尝试创建;createSelectorQuery 不存在则直接 return
- 防止首次进入崩溃
3. goods-detail-view 模板 indexOf
- goodsSkuDetail.support_trade_type 字段偶尔缺失
- 改 (support_trade_type || []).indexOf(...) 兜底
This commit is contained in:
@@ -996,8 +996,11 @@ export default {
|
||||
/**
|
||||
* 判断是否在微信小程序的web-view中打开H5
|
||||
* @returns {boolean} 是否在微信小程序的web-view中
|
||||
*
|
||||
* 鸿蒙元服务(JSVM)没有 navigator 全局,改用 typeof 守卫兜底,让它直接返回 false
|
||||
*/
|
||||
isWeChatMiniProgram() {
|
||||
if (typeof navigator === 'undefined' || !navigator.userAgent) return false;
|
||||
const userAgent = navigator.userAgent.toLowerCase();
|
||||
|
||||
// 微信小程序的web-view User-Agent会包含以下特征之一
|
||||
|
||||
@@ -301,9 +301,20 @@ export default {
|
||||
},
|
||||
/**
|
||||
* 获取高度区间
|
||||
*
|
||||
* 鸿蒙 JSVM 在 mounted() 之前触发 onShow,导致 query 还是 undefined
|
||||
* 加防御性检查,避免上线后第一次进入崩溃
|
||||
*/
|
||||
getHeightArea(index) {
|
||||
let heightArea = [];
|
||||
if (!query || typeof query.selectAll !== 'function') {
|
||||
query = uni.createSelectorQuery && uni.createSelectorQuery().in(this);
|
||||
}
|
||||
if (!query || typeof query.selectAll !== 'function') {
|
||||
// 极端兜底:鸿蒙下若 createSelectorQuery 不存在,跳过计算
|
||||
this.heightArea = heightArea;
|
||||
return;
|
||||
}
|
||||
query
|
||||
.selectAll('.content-wrap .child-category')
|
||||
.boundingClientRect(data => {
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
<view class="box">
|
||||
<block v-for="(item, index) in deliveryType" :key="index">
|
||||
<text
|
||||
v-if="goodsSkuDetail.support_trade_type.indexOf(index) != -1">{{ $lang('goods.detail.express') }}</text>
|
||||
v-if="(goodsSkuDetail.support_trade_type || []).indexOf(index) != -1">{{ $lang('goods.detail.express') }}</text>
|
||||
<!-- {{ item.name }} -->
|
||||
</block>
|
||||
</view>
|
||||
@@ -159,7 +159,7 @@
|
||||
<scroll-view scroll-y class="type-body">
|
||||
<block v-for="(item, index) in deliveryType" :key="index">
|
||||
<view class="type-item"
|
||||
:class="{ 'not-support': goodsSkuDetail.support_trade_type.indexOf(index) == -1 }">
|
||||
:class="{ 'not-support': (goodsSkuDetail.support_trade_type || []).indexOf(index) == -1 }">
|
||||
<text class="iconfont" :class="item.icon"></text>
|
||||
<view class="content">
|
||||
<view class="title">{{ item.name }}</view>
|
||||
|
||||
@@ -1686,7 +1686,7 @@ _handleStreamError(msg) {
|
||||
|
||||
// H5 优先使用 Clipboard API,降级使用 document.execCommand
|
||||
try {
|
||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||
if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) {
|
||||
navigator.clipboard.writeText(finalText).then(() => {
|
||||
uni.showToast({ title: selectedText ? this.$lang('ai-chat.index.copySelected') : this.$lang('ai-chat.index.copySuccess'), icon: 'success' })
|
||||
}).catch(() => {
|
||||
|
||||
@@ -116,7 +116,7 @@ export default {
|
||||
this.confirm();
|
||||
}
|
||||
})
|
||||
} else if (/AlipayClient/.test(window.navigator.userAgent)) {
|
||||
} else if (typeof window !== 'undefined' && window.navigator && /AlipayClient/.test(window.navigator.userAgent || '')) {
|
||||
this.payTypeList.forEach((item, index) => {
|
||||
if (item.type == 'alipay') {
|
||||
this.payIndex = index;
|
||||
|
||||
Reference in New Issue
Block a user