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


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 相关文章推荐
3Z版基于jquery的图片复选框(asp.net+jquery)
Apr 12 Javascript
Javascript 面向对象 命名空间
May 13 Javascript
JavaScript伸缩的菜单简单示例
Dec 03 Javascript
简介JavaScript中strike()方法的使用
Jun 08 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
Dec 29 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
Ionic2调用本地SQlite实例
Apr 22 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
原生javascript单例模式的应用实例分析
Feb 23 Javascript
js实现简单选项卡制作
Aug 05 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
uniapp开发打包多端应用完整方法指南
Dec 24 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
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
python输入多行字符串的方法总结
2019/07/02 Python
python绘制多个子图的实例
2019/07/07 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
车间班组长岗位职责
2013/11/13 职场文书
元旦晚会主持词
2014/03/24 职场文书
松材线虫病防治方案
2014/06/15 职场文书
机械操作工岗位职责
2014/08/08 职场文书