异常描述:

点击按钮获取用户手机号码,有的时候会出现点击无反应或很久之后才弹出用户授权获取手机号码的弹窗,这种情况下,也会出现点击穿透的问题(详见:微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理

异常解析:

1. getPhoneNumber的使用:

对于 getPhoneNumber(OBJECT) API,由于小程序需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发(具体使用方法详见getPhoneNumber(OBJECT))。

 <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> </button> 

对于使用方法,官方文档是这么说的:

需要将 <button> 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

2. getPhoneNumber函数的执行时间:

由粗体部分内容可知 bindgetphonenumber 绑定的是 open-type 为 getPhoneNumber 的按钮触发调用获取用户手机号API的回调事件事件,而非单击事件。

经验证,从按钮点击到回调事件响应是有一定延迟的,而且会受网络及微信服务器影响(回调事件开头可以写个console.log(e),就能在开发这工具控制台监控到这个延迟了)。

如果网络非常卡——那么等微信服务器响应的时间可能就比较长了(iphone 6 plus,iphone7 plus比较明显,延迟1000ms以上甚至无反应的感觉)

 Page({
getPhoneNumber: function(e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
}
})

所以,即使你在 getPhoneNumber 方法中写了loading的代码,也只能等微信服务器响应之后才能生效了,这并不符合我们的需求。那么怎么解决这个问题呢?

解决方法:

方法其实很简单,真的很简单——使用bindtap绑定一个单击事件就可以了。虽然这是一个特殊的按钮,但本质上还是一个按钮的,单击事件仍然是有的。

被官方文档误导了,一直强调getPhoneNumber 这个绑定的回调事件,且在取消、确认授权及获取加密数据操作都是在这个事件中处理的,潜意识中已经以为这就是这个特殊按钮单击事件了。

给getPhoneNumber 按钮绑定一个单击事件,如下:

<buttonopen-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" bindtap='showLoading' 
style='background: url({{btnImg}}) top center no-repeat;background-size:cover;border:0px;color:#ffffff;' plain="true">获取用户手机号码</button>
   /**
* 获取手机号码单击事件(在回调事件之前执行,预先显示loading,防授权弹窗弹出延迟)
* loading使用自定义组件(小程序原生loading加载有延迟,无法完全防止点击穿透)
*/
showLoading:function(){
this.setData({
loading: true
})
}

如此,问题解决,在点击按钮的时候,就能及时显示loading。

个人原创博客,转载请注明来源地址:https://www.cnblogs.com/xyyt/p/9729578.html

最新文章

  1. 51. N-Queens
  2. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
  3. Dynamics CRM 2016 的新特性
  4. Python pass语句作用与用法
  5. PHP将在对象被销毁前调用这个函数.它称为析构函数
  6. python的元组和列表使用之一
  7. 使用Machin公式计算
  8. 初次接触Object对象变量
  9. layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案
  10. QLineEdit
  11. C# 导出word文档及批量导出word文档(4)
  12. 跨域 Iframe 通信解决方案(兼容 IE 系列浏览器。)
  13. STM32硬件IIC操作
  14. SqlHelper帮助类_上(SQLServer数据库含Connection详解)
  15. [论文阅读] ImageNet Classification with Deep Convolutional Neural Networks(传说中的AlexNet)
  16. 关于table表格 td里内容较多换行的处理方法
  17. 微信小程序开发 [06] 一些补充的知识点
  18. 置换群和Burnside引理,Polya定理
  19. windows下nodejs服务器的安装与配置
  20. (转)js函数前加分号和感叹号是什么意思?有什么用?

热门文章

  1. js/jquery this 坑
  2. Django权限auth模块详解
  3. 继承标签extend
  4. mac下shell给文件名批量加前缀
  5. Sonya and Exhibition 1004B
  6. 尚硅谷springboot学习17-SpringBoot日志
  7. HTTP、TCP、IP协议常见面试题
  8. 1test
  9. python模块os
  10. Python模块和类.md