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


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 Array数组对象的扩展函数代码
May 22 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
Jan 09 Javascript
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
jQuery实现下拉框选择图片功能实例
Aug 08 Javascript
预防网页挂马的方法总结
Nov 03 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
Mar 04 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
Vue中的Props(不可变状态)
Sep 29 Javascript
JS html事件冒泡和事件捕获操作示例
May 01 Javascript
如何从头实现一个node.js的koa框架
Jun 17 Javascript
小程序接口的promise化的实现方法
Dec 11 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 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
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
python cs架构实现简单文件传输
2020/03/20 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
利用python实现AR教程
2019/11/20 Python
python接口自动化框架实战
2020/12/23 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
Linux常见面试题
2013/03/18 面试题
优秀德育工作者事迹材料
2014/05/07 职场文书
优秀教师个人总结
2015/02/11 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
日元符号 ¥
2022/02/17 杂记
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
php解析非标准json、非规范json的方式实例
2022/05/10 PHP
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL