详解小程序如何避免多次点击,重复触发事件


Posted in Javascript onApril 08, 2019

作为前端开发,我们经常会遇到的场景,比如用户点击获取验证码按钮时,没有反应,大部分用户都会接着点击,这就会造成用户收到多条验证码,这是因为后台api请求比较慢,而客户端体验又做得不到位,导致用户以为没点击到或者是页面假死,在上次请求还没处理完,就再次点击按钮。这对于我们开发来说,这是bug。

如何解决或避免这个问题呢?一般来说有两种情况。

1、点击事件是执行网络请求(提交评论,验证码,支付)

这种情况下可以在请求执行之前显示一个模式的加载框,请求完成后再关闭加载框。

由于小程序在1.1.0版本基础库才支持wx.showLoading,因此需要对低版本做兼容处理,代码如下:

function showLoading(message) {
 if (wx.showLoading) {
  // 基础库 1.1.0 微信6.5.6版本开始支持,低版本需做兼容处理
  wx.showLoading({
   title: message,
   mask: true
  });
 } else {
  // 低版本采用Toast兼容处理并将时间设为20秒以免自动消失
  wx.showToast({
   title: message,
   icon: 'loading',
   mask: true,
   duration: 20000
  });
 }
}
 
function hideLoading() {
 if (wx.hideLoading) {
  // 基础库 1.1.0 微信6.5.6版本开始支持,低版本需做兼容处理
  wx.hideLoading();
 } else {
  wx.hideToast();
 }
}

我们可以将显示加载框和关闭加载框的代码放在公共的代码里面比如util,然后在使用时直接调用即可。

function request() {
 util.showLoading('加载中...');
 wx.request({
  url: app.globalData.host + 'xxx',
  data: {...},
  method: 'GET',
  success: function (res) {
   util.hideLoading()
   ...
  },
  fail: function (res) {
   util.hideLoading()
   ...
  }
 })
}

2、点击事件是页面跳转

当点击事件需要页面跳转时,不太适合显示加载框,但小程序的页面跳转并不是很快,如果不作处理又会导致用户反复点击打开多个页面,这里可以使用限制按钮或控件的点击间隔的方式处理,同样可以将这个方法放到公共的代码里面比如util,然后在使用时直接调用即可。

function buttonClicked(self) {
 self.setData({
  buttonClicked: true
 })
 setTimeout(function () {
  self.setData({
   buttonClicked: false
  })
 }, 500)
}

首先需要在页面对应的js文件里面增加一个buttonClicked数据对象,然后在点击事件里面调用上述方法。

Page({
 data: {
  buttonClicked: false
 },
 click: function (e) {
  util.buttonClicked(this);
  var id = e.currentTarget.dataset.id;
  wx.navigateTo({
   url: '../detail/detail?id=' + id
  })
 },
})

另外,在wxml的点击控件中通过buttonClicked判断是否可以点击,可以用bindtap也可以用disabled

<view bindtap="{{!buttonClicked?'click':''}}" data-id="{{id}}" />
<button bindtap="{{!buttonClicked?'click':''}}" data-id="{{id}}" />
<button bindtap="click" disabled="buttonClicked" data-id="{{id}}" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript学习笔记7 原型链的原理
Jan 11 Javascript
两个数组去重的JS代码
Dec 04 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
jQuery的ready方法详解
Nov 27 Javascript
JavaScript使用function定义对象并调用的方法
Mar 23 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
json+jQuery实现的无限级树形菜单效果代码
Aug 27 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
Dec 12 Javascript
js删除数组中的元素delete和splice的区别详解
Feb 03 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
vue elementui tree 任意级别拖拽功能代码
Aug 31 Javascript
JS函数式编程实现XDM一
Jun 16 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
Apr 08 #Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
Apr 08 #Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 #Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 #Javascript
微信小程序实现bindtap等事件传参
Apr 08 #Javascript
详解vue中axios请求的封装
Apr 08 #Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 #Javascript
You might like
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
javascript 快速排序函数代码
2012/05/30 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
python求素数示例分享
2014/02/16 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
利用Python优雅的登录校园网
2020/10/21 Python
python数据抓取3种方法总结
2021/02/07 Python
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
经理助理岗位职责
2014/03/05 职场文书
妇女干部培训方案
2014/05/12 职场文书
环境保护标语
2014/06/20 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
课外访万家心得体会
2014/09/03 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
歌剧魅影观后感
2015/06/05 职场文书
网络妈妈观后感
2015/06/08 职场文书
安全教育主题班会总结
2015/08/14 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL