微信小程序的兼容处理汇总(不定期更新)

2023-11-20

目录

1.名词统一

2.兼容问题的几种情况

3.问题分类

3.1.Api相关

3.1.1.wx.makePhoneCall()拨打电话页面样式不一致

3.1.2.wx.enableAlertBeforeUnload()监听右滑返回上一页询问对话框不弹出

3.2.JS处理相关

3.2.1.ios做new Date()时,时间格式不兼容

 3.2.2.if(!!data) 双重感叹号取非不生效

3.3.官方组件库及样式(以下简称官方)相关

3.3.1.官方textarea的maxlenght属性不限制字符长度

3.4.第三方组件库(使用的是Vant Weapp)及样式(以下简称Vant)相关

3.4.1.Cell单元格内容显示不全

3.4.2.Popup等组件和原生textarea等标签层级冲突


1.名词统一

红色(编译)=黄色(预览):本地开发(以下简称开发版)。

蓝色(真机调试):分为真机调试1.0、真机调试2.0(本文使用2.0模式,以下简称调试版)。

绿色(上传):线上体验版(以下简称体验版)。

2.兼容问题的几种情况

(1)开发版/调试版/体验版问题不一致。

大部分情况为开发版/调试版正常,体验版报错,需要发布线上版打印报错信息进行调试;

少部分为真机调试1.0和2.0不一致,保持真机2.0调试,以新版为准去更改;

极少部分开发版正常,调试版报错,这种情况修改后,线上版基本是不会报错了。

(2)手机系统/手机型号/微信版本的兼容问题。

目前仅遇到手机系统导致的兼容性问题,手机型号和微信版本暂无。

3.问题分类

3.1.Api相关

3.1.1.wx.makePhoneCall()拨打电话页面样式不一致

具体表现场景:

ios调用wx.makePhoneCall()时,先有自下而上的弹窗,点击弹窗上的电话,再拨打电话;

Android和鸿蒙在调用wx.makePhoneCall()时,直接复制电话号码,并跳转到手机拨打电话页面。

解决方案:

文档已说明,ios出于安全自动带从下到上的弹窗,确认后才会拨打电话;非ios会自动跳转拨打电话页。如果业务需求需要和ios调用拨打电话方式完全统一,需要:(1)模拟ios 弹窗手写一个自定义电话弹窗组件;(2)在调用拨打电话api前,判断设备型号(获取系统信息wx.getSystemInfo() 异步调用同步返回/wx.getSystemInfoAsync()异步返回),非ios优先展示自定义电话弹窗组件,点击“电话号码”时再调用拨打电话事件,ios直接调用api。

3.1.2.wx.enableAlertBeforeUnload()监听右滑返回上一页询问对话框不弹出

具体表现场景:

安卓右滑正常弹出询问对话框,【取消】留在当页,【确定】返回上一页;

ios无弹窗拦截。

解决思路:

该api仅支持安卓右滑手势,不支持ios。同时,wx.enableAlertBeforeUnload()仅作弹框提示,不支持自定义样式和按钮文字。回调函数是个摆设,不能写入任何事件,如果在当前页面销毁时有其他动作,应注意ios兼容问题,在onLoad周期中做销毁动作。同时,建议在onLoad周期中也写入wx.disableAlertBeforeUnload()取消监听,避免其他页面可能会弹出弹窗的情况。

3.2.JS处理相关

3.2.1.ios做new Date()时,时间格式不兼容

具体表现场景:

ios做时间转换处理时,报错Cant'findundefined;

安卓正常。

解决思路:

ios时间处理方式不兼容(暂时涉及到的内容有时间picker组件、new Data时间处理等),ios时间处理不支持yyyy-mm-dd,处理时间时变成了NaN,事件报错Cant'findundefined,需替换为yyyy/mm/dd,再进行计算。

// 正则yyyy-mm-dd 转换 yyyy/mm/dd
let newTime = oldTime.replace(/-/g,'/')

 3.2.2.if(!!data) 双重感叹号取非不生效

业务处理与具体表现场景:

请求单张图片接口时,(1)根据返回的文件流判断是否可以渲染页面,有值时处理文件流,(2)无值时/没有任何返回时,url赋值为空,为空时,页面显示默认图片。

安卓判断生效,整个逻辑没有问题。

ios在(2)的情况下,依然走(1)的逻辑,导致正确的文件流时,页面不显示默认图片。

解决方案:

前端因为做的 'data:image/png;base64,' 拼接,图省事直接在页面 wx:if 判断时候加了判断条件  wx:if=”{{ 原有验证条件 && icon.length !== 22}}” 。

3.3.官方组件库及样式(以下简称官方)相关

3.3.1.官方textarea的maxlenght属性不限制字符长度

具体表现场景:

业务要求限制最大输入长度为196位,且右下角显示【输入位数/196】,ios正常限制;

安卓和鸿蒙可以输入197位,同时右下角显示【197/196】;

安卓复制粘贴,粘贴到197位,但右下角显示:【所有文字的位数/196】。

解决思路:

文档说明<textarea>支持maxlenght长度上限为140,但开发版实际可以输入到196位,调试版ios可以输入到200(没有测试能否>200)。

所以在用户输入的时候用原生JS截取字符串处理,同时在≥196位时,限制右下角数字长度为196,三个系统显示一致。

let inputValNew = e.detail.value  //绑定bindinput事件取值
if (inputValNew.length >= 196) {
  this.setData({
    extension: e.detail.value.slice(0, 196),  //输入框文字
    textnum: 196  //右下角文字长度
  })
} else {
  this.setData({
    extension: e.detail.value,
    textnum: e.detail.value.length
  })
}

3.4.第三方组件库(使用的是Vant Weapp)及样式(以下简称Vant)相关

3.4.1.Cell单元格内容显示不全

具体表现场景:

ios和Android内容随高度撑开,多行文本显示;

鸿蒙单行文本显示部分文字。

解决思路:

尽管已对Cell单元格右侧内容样式类value-class设置跟随内容撑开,但内容为数字时依然单行文本显示部分文字(全英文、英文+数字的情况下,未测试展示效果)。将Cell单元格更换为Field输入框,同时配置:autosize(内容随高度自适应),disabled,input-align:right。

3.4.2.Popup等组件和原生textarea等标签层级冲突

具体表现场景:

鸿蒙系统,如果页面有弹出层或者其他标签在整个页面最上层,placeholder会穿透所有组件/标签,变成整个页面最上层,有时textarea依然可以输入内容(第一张图是popup被穿透,第二张图是view被穿透);

ios和Android显示正常。

解决思路:

textarea是原生组件,原生组件包括:camera、canvas、video、map、live-player、live-pusher、textarea、input(仅在 focus 时表现为原生组件)。组件层级排序为原生>官方(可能)=第三方。(由微信小程序原生组件层级引发的“血案” - 腾讯云开发者社区-腾讯云 (tencent.com)

目前小程序官方已修复ios和安卓textarea的placeholder层级穿透的问题。但部分安卓机型和鸿蒙有时仍会复现。

解决方向有两个:(1)z-index设置层级;(2)绝大部分时候z-index无法解决,可以写一个textarea同级标签用来显示输入值,在出现穿透情况时,显示同级标签,隐藏textarea(解决textarea的placeholder层级穿透的问题 | 微信开放社区 (qq.com))。

<view wx:if="{{showText}}">{{extension}}</view>
<textareavalue="{{extension}}" wx:else bindinput="extensionChange" placeholder="请输入原因(最多196字)" disable-default-padding="true">
</textarea>

// .js中根据需求控制showText变量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序的兼容处理汇总(不定期更新) 的相关文章

  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 固定 div 位于居中 div 旁边

    我有一个网页 其中有可滚动的内容 此内容包含在 content 内 位于页面的中心 现在我希望导航栏出现在内容左侧 50 像素处 该栏应具有固定位置 不应滚动 这是我到目前为止所尝试过的 nav position fixed top 50
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 两列表:一列尽可能小,另一列占据其余部分

    我在 div 中有一个 to columns 表 div table tbody tr td class action a a td td class content p Bigger text variable size p td tr
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

    问题 我正在转换目前仅适用于 Internet Explorer 的相对较大的 Javascript 代码 以便使其也适用于其他浏览器 由于代码广泛使用 XPath 我们做了一些兼容性功能以使事情变得更容易 function selectN
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下

随机推荐