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


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 获取链接(url)参数的方法
Feb 15 Javascript
Jquery中getJSON在asp.net中的使用说明
Mar 10 Javascript
点击显示指定元素隐藏其他同辈元素的方法
Feb 19 Javascript
浅谈jQuery中height与width
Jul 06 Javascript
vue.js中$watch的用法示例
Oct 04 Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 Javascript
js图片轮播插件的封装
Jul 21 Javascript
使用async、enterproxy控制并发数量的方法详解
Jan 02 Javascript
微信小程序使用字体图标的方法
May 23 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
Jul 05 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
May 18 Javascript
vue实现评价星星功能
Jun 30 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
vue-router路由模式详解(小结)
2019/08/26 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
玩转python爬虫之cookie使用方法
2016/02/17 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
python破解同事的压缩包密码
2020/10/14 Python
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
经典婚礼主持词
2014/03/13 职场文书
医学生就业推荐表自我鉴定
2014/03/26 职场文书
找工作求职信
2014/07/07 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
导游词之桂林山水
2019/09/20 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
springboot中的pom文件 project报错问题
2022/01/18 Java/Android