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


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 toggle后元素隐藏的解决方法
Mar 27 Javascript
jQuery瀑布流插件Wookmark使用实例
Apr 02 Javascript
使用变量动态设置js的属性名
Oct 19 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
利用express启动一个server服务的方法
Sep 17 Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
vue element动态渲染、移除表单并添加验证的实现
Jan 16 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
微信用户访问小程序的登录过程详解
Sep 20 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
Protoss建筑一览
2020/03/14 星际争霸
php中几种常见安全设置详解
2010/04/06 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
PHP小技巧之函数重载
2014/06/02 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
php实现微信公众号无限群发
2015/10/11 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
动态添加js事件实现代码
2009/03/12 Javascript
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
Python中decorator使用实例
2015/04/14 Python
图文详解WinPE下安装Python
2016/05/17 Python
Python Socket传输文件示例
2017/01/16 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
素质教育标语
2014/06/27 职场文书
暑期培训班策划方案
2014/08/26 职场文书
六查六看剖析材料
2014/10/06 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
电台广播稿范文
2015/08/19 职场文书