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


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实现根据浏览器窗口大小自动缩放图片的方法
Jul 17 Javascript
JavaScript 链式结构序列化详解
Sep 30 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
js 倒计时(高效率服务器时间同步)
Sep 12 Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 Javascript
webpack引入eslint配置详解
Jan 22 Javascript
koa上传excel文件并解析的实现方法
Aug 09 Javascript
微信小程序实现留言板功能
Nov 02 Javascript
mock.js实现模拟生成假数据功能示例
Jan 15 Javascript
2019最新21个MySQL高频面试题介绍
Feb 06 Javascript
es6函数中的作用域实例分析
Apr 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函数
2006/10/09 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
JS日历 推荐
2006/12/03 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
jQuery参数列表集合
2011/04/06 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
vue-router单页面路由
2017/06/17 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
JS实现简易日历效果
2021/01/25 Javascript
Python中的闭包详细介绍和实例
2014/11/21 Python
在Django的上下文中设置变量的方法
2015/07/20 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
HTTP状态码详解
2021/03/18 杂记
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
《圆明园的毁灭》教学反思
2016/02/16 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书