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


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操作Table的代码分享
Mar 30 Javascript
js 页面元素的几个用法总结
Nov 18 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
vue组件间通信解析
Mar 01 Javascript
详解Vue中一种简易路由传参办法
Sep 15 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
Jan 08 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
layui 表格操作列按钮动态显示的实现方法
Sep 06 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
Sep 10 Javascript
vue+element tabs选项卡分页效果
Jun 29 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版(3)
2006/10/09 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
JQuery伸缩导航练习示例
2013/11/13 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
python字符串连接的N种方式总结
2014/09/17 Python
python简单猜数游戏实例
2015/07/09 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
Python单元测试实例详解
2018/05/25 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
python文件读取失败怎么处理
2020/06/23 Python
用python实现一个简单的验证码
2020/12/09 Python
超市后勤自我鉴定
2014/01/17 职场文书
个人贷款承诺书
2014/03/28 职场文书
模特大赛策划方案
2014/05/28 职场文书
食品药品安全责任书
2015/05/11 职场文书
国庆节新闻稿
2015/07/17 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android