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


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的目的分析
Jan 05 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
Mar 10 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
Sep 10 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
详解AngularJS中ng-src指令的使用
Sep 07 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
Sep 28 Javascript
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
JQuery表单元素取值赋值方法总结
May 12 jQuery
axios解决高并发的方法:axios.all()与axios.spread()的操作
Nov 09 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 jQuery
原生JavaScript实现进度条
Feb 19 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
php编写一个简单的路由类
2011/04/13 PHP
openPNE常用方法分享
2011/11/29 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
JS数组去重与取重的示例代码
2014/01/24 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
深入探究node之Transform
2017/07/20 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
python ip正则式
2009/05/07 Python
Python os模块介绍
2014/11/30 Python
如何在Python中编写并发程序
2016/02/27 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
c语言常见笔试题总结
2016/09/05 面试题
爱岗敬业演讲稿范文
2014/01/14 职场文书
医学求职自荐信
2014/06/21 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2014年政协工作总结
2014/12/09 职场文书
教代会闭幕词
2015/01/28 职场文书
药店营业员岗位职责
2015/04/14 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
一文弄懂MySQL索引创建原则
2022/02/28 MySQL