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


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 相关文章推荐
Javascript玩转继承(一)
May 08 Javascript
JavaScript中常用的六种互动方法示例
Mar 13 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
Dec 20 Javascript
基于jquery实现智能表单验证操作
May 09 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
Jul 21 Javascript
jquery实现文本框的禁用和启用
Dec 07 Javascript
jquery实现左右滑动式轮播图
Mar 02 Javascript
前端主流框架vue学习笔记第二篇
Jul 26 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
vue 动态修改a标签的样式的方法
Jan 18 Javascript
JavaScript展开运算符和剩余运算符的区别详解
Feb 18 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中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
Python入门之三角函数全解【收藏】
2017/11/08 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
django反向解析和正向解析的方式
2018/06/05 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
python安装及变量名介绍详解
2020/12/12 Python
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
个人承诺书格式
2014/06/03 职场文书
投资意向书
2014/07/30 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
税务会计岗位职责
2015/04/02 职场文书
三八妇女节主持词
2015/07/04 职场文书
MySQL去除密码登录告警的方法
2022/04/20 MySQL