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


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 相关文章推荐
newxtree.js代码
Mar 13 Javascript
用JQuery 实现的自定义对话框
Mar 24 Javascript
深入理解javaScript中的事件驱动
May 21 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
JavaScript创建对象的写法
Aug 29 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
Node.js开源应用框架HapiJS介绍
Jan 14 Javascript
jQuery表单事件实例代码分享
Aug 18 Javascript
vue组件Prop传递数据的实现示例
Aug 17 Javascript
帝国cms首页列表页实现点赞功能
Oct 30 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
Jun 18 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 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中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
复制粘贴功能的Python程序
2008/04/04 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
Python定时器实例代码
2017/11/01 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Python实战购物车项目的实现参考
2019/02/20 Python
基于Python函数和变量名解析
2019/07/19 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python同时替换多个字符串方法示例
2019/09/17 Python
pytorch标签转onehot形式实例
2020/01/02 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
应届毕业生通用的自荐书范文
2014/02/07 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
寒假生活随笔
2015/08/15 职场文书
Python 阶乘详解
2021/10/05 Python