From 6617a0b36cd9a666181283eb04571b1952f7a9c8 Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Sat, 4 Jul 2026 11:26:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(harmony):=20=E4=BF=AE=E9=B8=BF=E8=92=99?= =?UTF-8?q?=E5=85=83=E6=9C=8D=E5=8A=A1=20JSVM=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基于 .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(...) 兜底 --- common/js/util.js | 3 +++ components-diy/diy-category.vue | 11 +++++++++++ .../goods-detail-view/goods-detail-view.vue | 4 ++-- pages_tool/ai-chat/ai-chat-message.vue | 2 +- pages_tool/pay/cashier.vue | 2 +- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/common/js/util.js b/common/js/util.js index e0083dd..587887a 100644 --- a/common/js/util.js +++ b/common/js/util.js @@ -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会包含以下特征之一 diff --git a/components-diy/diy-category.vue b/components-diy/diy-category.vue index 29c3555..8ef0406 100644 --- a/components-diy/diy-category.vue +++ b/components-diy/diy-category.vue @@ -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 => { diff --git a/pages_goods/_components/goods-detail-view/goods-detail-view.vue b/pages_goods/_components/goods-detail-view/goods-detail-view.vue index 0b18b0c..da84a7b 100644 --- a/pages_goods/_components/goods-detail-view/goods-detail-view.vue +++ b/pages_goods/_components/goods-detail-view/goods-detail-view.vue @@ -65,7 +65,7 @@ {{ $lang('goods.detail.express') }} + v-if="(goodsSkuDetail.support_trade_type || []).indexOf(index) != -1">{{ $lang('goods.detail.express') }} @@ -159,7 +159,7 @@ + :class="{ 'not-support': (goodsSkuDetail.support_trade_type || []).indexOf(index) == -1 }"> {{ item.name }} diff --git a/pages_tool/ai-chat/ai-chat-message.vue b/pages_tool/ai-chat/ai-chat-message.vue index b0fe5a8..8ed8f5f 100644 --- a/pages_tool/ai-chat/ai-chat-message.vue +++ b/pages_tool/ai-chat/ai-chat-message.vue @@ -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(() => { diff --git a/pages_tool/pay/cashier.vue b/pages_tool/pay/cashier.vue index c5ff6a8..c9a2eff 100644 --- a/pages_tool/pay/cashier.vue +++ b/pages_tool/pay/cashier.vue @@ -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;