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


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 相关文章推荐
js判断undefined变量类型使用typeof
Jun 03 Javascript
html+js实现动态显示本地时间
Sep 21 Javascript
深入剖析JavaScript中的枚举功能
Mar 06 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
Nov 19 Javascript
javascript实用方法总结
Feb 06 Javascript
js实现鼠标触发图片抖动效果的方法
Feb 27 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
深入理解JavaScript编程中的同步与异步机制
Jun 24 Javascript
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
微信小程序登录换取token的教程
May 31 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
CI框架Session.php源码分析
2014/11/03 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
PHP常用技巧汇总
2016/03/04 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python坐标线性插值应用实现
2019/11/13 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
小饰品店的创业计划书范文
2013/12/28 职场文书
投资意向书范本
2014/04/01 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
小浪底导游词
2015/02/12 职场文书
Python中else的三种使用场景
2021/06/16 Python
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
使用python创建股票的时间序列可视化分析
2022/03/03 Python