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


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 相关文章推荐
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
Mar 14 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
判断window.onload是否多次使用的方法
Sep 21 Javascript
使用angular写一个hello world
Jan 23 Javascript
如何编写jquery插件
Mar 29 jQuery
Iscrool下拉刷新功能实现方法(推荐)
Jun 26 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 Javascript
js获取css的各种样式并且设置他们的方法
Aug 22 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
详解jQuery中的prop()使用方法
Jan 05 jQuery
「中高级前端面试」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 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
PHP多个版本的分析解释
2011/07/21 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
php生成word并下载代码实例
2019/03/15 PHP
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
javascript产生随机数方法汇总
2016/01/25 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
NodeJS实现同步的方法
2019/03/02 NodeJs
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
Python yield 使用浅析
2015/05/28 Python
python清理子进程机制剖析
2017/11/23 Python
python正则实现提取电话功能
2018/02/24 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
十岁生日同学答谢词
2014/01/19 职场文书
师德师风承诺书
2014/05/23 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
统计工作个人总结
2015/03/03 职场文书
PyTorch的Debug指南
2021/05/07 Python