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


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获取网页中图片高度的两种方法
Sep 26 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
May 04 Javascript
AngularJS入门教程之ng-checked 指令详解
Aug 01 Javascript
jQuery实现的表格展开伸缩效果实例
Sep 07 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
May 30 Javascript
vue父组件中获取子组件中的数据(实例讲解)
Sep 27 Javascript
详解webpack4.x之搭建前端开发环境
Mar 28 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
解决小程序无法触发SESSION问题
Feb 03 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
vue 实现图片懒加载功能
Dec 31 Vue.js
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中strtr字符串替换用法详解
2014/11/26 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
用ADODB.Stream转换
2007/01/22 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
对numpy中轴与维度的理解
2018/04/18 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
Python3数字求和的实例
2019/02/19 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
pandas数据处理进阶详解
2019/10/11 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
PHP如何对用户密码进行加密
2014/07/31 面试题
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年人大工作总结
2014/12/10 职场文书