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


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 相关文章推荐
jquery 表单进行客户端验证demo
Aug 24 Javascript
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
Jan 26 Javascript
JS实现带鼠标效果的头像及文章列表代码
Sep 27 Javascript
基于jquery实现图片放大功能
May 07 Javascript
在html中引入外部js文件,并调用带参函数的方法
Oct 31 Javascript
layer弹出层框架alert与msg详解
Mar 14 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
JS解析url查询参数的简单代码
Aug 06 Javascript
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
vue侧边栏动态生成下级菜单的方法
Sep 07 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
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
js实现下一页页码效果
2017/03/07 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
PHP7新特性简述
2017/06/11 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
Saltstack快速入门简单汇总
2016/03/01 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
python归并排序算法过程实例讲解
2020/11/04 Python
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
美国最大点评网站:Yelp
2018/02/14 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
家长通知书家长意见
2014/12/30 职场文书
开幕式邀请函
2015/01/31 职场文书
田径运动会广播稿
2015/08/19 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis