微信小程序防止多次点击跳转(函数节流)


Posted in Javascript onSeptember 19, 2019

场景

在使用小程序的时候会出现这样一种情况:当网络条件差或卡顿的情况下,使用者会认为点击无效而进行多次点击,最后出现多次跳转页面的情况,就像下图(快速点击了两次):

微信小程序防止多次点击跳转(函数节流)

解决办法

然后从 轻松理解JS函数节流和函数防抖 中找到了解决办法,就是函数节流(throttle):函数在一段时间内多次触发只会执行第一次,在这段时间结束前,不管触发多少次也不会执行函数。

/utils/util.js:

function throttle(fn, gapTime) {
 if (gapTime == null || gapTime == undefined) {
  gapTime = 1500
 }

 let _lastTime = null
 return function () {
  let _nowTime = + new Date()
  if (_nowTime - _lastTime > gapTime || !_lastTime) {
   fn()
   _lastTime = _nowTime
  }
 }
}

module.exports = {
 throttle: throttle
}
/pages/throttle/throttle.wxml:

<button bindtap='tap' data-key='abc'>tap</button>
/pages/throttle/throttle.js

const util = require('../../utils/util.js')

Page({
 data: {
  text: 'tomfriwel'
 },
 onLoad: function (options) {

 },
 tap: util.throttle(function (e) {
  console.log(this)
  console.log(e)
  console.log((new Date()).getSeconds())
 }, 1000)
})

这样,疯狂点击按钮也只会1s触发一次。

但是这样的话出现一个问题,就是当你想要获取this.data得到的this是undefined, 或者想要获取微信组件button传递给点击函数的数据e也是undefined,所以throttle函数还需要做一点处理来使其能用在微信小程序的页面js里。

微信小程序防止多次点击跳转(函数节流)

出现这种情况的原因是throttle返回的是一个新函数,已经不是最初的函数了。新函数包裹着原函数,所以组件button传递的参数是在新函数里。所以我们需要把这些参数传递给真正需要执行的函数fn。

最后的throttle函数如下:

function throttle(fn, gapTime) {
 if (gapTime == null || gapTime == undefined) {
  gapTime = 1500
 }

 let _lastTime = null

 // 返回新的函数
 return function () {
  let _nowTime = + new Date()
  if (_nowTime - _lastTime > gapTime || !_lastTime) {
   fn.apply(this, arguments) //将this和参数传给原函数
   _lastTime = _nowTime
  }
 }
}

再次点击按钮this和e都有了:

微信小程序防止多次点击跳转(函数节流)

参考

总结

以上所述是小编给大家介绍的微信小程序防止多次点击跳转(函数节流),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery 1.0.4 - New Wave Javascript(js源文件)
Jan 15 Javascript
jQuery标签编辑插件Tagit使用指南
Apr 21 Javascript
简单谈谈JavaScript的同步与异步
Dec 31 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
es6 字符串String的扩展(实例讲解)
Aug 03 Javascript
Three.JS实现三维场景
Dec 30 Javascript
使用JS来动态操作css的几种方法
Dec 18 Javascript
使用JS location实现搜索框历史记录功能
Dec 23 Javascript
JavaScript进阶(三)闭包原理与用法详解
May 09 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
Jul 31 Javascript
React forwardRef的使用方法及注意点
Jun 13 Javascript
layui按条件隐藏表格列的实例
Sep 19 #Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 #Javascript
微信小程序引入VANT组件的方法步骤
Sep 19 #Javascript
iview form清除校验状态的实现
Sep 19 #Javascript
对layui中table组件工具栏的使用详解
Sep 19 #Javascript
layui自定义工具栏的方法
Sep 19 #Javascript
Node 代理访问的实现
Sep 19 #Javascript
You might like
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
简单实现python数独游戏
2018/03/30 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
适用于所有创业者的创业计划书
2014/02/05 职场文书
八年级语文教学反思
2014/02/11 职场文书
厨房管理计划书
2014/04/27 职场文书
李开复演讲稿
2014/05/24 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
主要领导对照检查材料
2014/08/26 职场文书
歌咏比赛主持词
2015/06/29 职场文书