微信小程序BindTap快速连续点击目标页面跳转多次问题处理


Posted in Javascript onApril 08, 2019

问题描述:

1)wxml片段

<view bindtap="loadMulti">
  <text>连续点击,加载多次</text>
</view>
<view bindtap="loadOnce">
  <text>连续点击,加载一次</text>
</view>

2)js代码片段

loadMulti:function(e) {
  wx.navigateTo({
    url: '/pages/loadMulti/index',
  })
},

3)快速,连续点击“连续点击,加载多次”文本串时,我们会发现,目标页面loadMulti/index页面被加载了N次,需要点击N次返回,才可以返回到主页面。

问题原因剖析:

小程序基于MINA框架,该框架的核心框架的核心是一个响应的数据绑定系统,整个系统分为两块视图层(View)和逻辑层(App Service),框架可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新;当点击按钮的时候,视图层会发送 bindtap的事件给逻辑层,逻辑层找到对应的事件处理函数loadMulti执行。

由于视图层发送bindtap事件给逻辑层并找到对应的处理函数需要时间T1,找到对应的处理函数loadMulti后,执行loadMulti函数:wx.navigateTo, hide 原页面,需要时间T2,如果在T1+T2时间内,快速连续点击N次,完全可以加载显示N次目标页面。

解决方案:

loadOnce:function(e) {
  if (!this.pageLoading) {
   this.pageLoading = !0;
   wx.navigateTo({
    url: '/pages/loadOnce/index',
   })
  }
 },
 onShow: function() {
  this.pageLoading = !1;
}

1)loadOnce事件处理函数中,设置pageLoading = true

2)页面的onShow事件中,设置pageLoading = false

其实我们可以封装成方法:

/**

*解决连续点击多次冲出触发事件

*/

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

    }

  }

}
<button bindtap='tap' data-key='abc'>tap</button>

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)

})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS解析XML的实现代码
Nov 12 Javascript
JQuery index()方法使用代码
Jun 02 Javascript
js 页面关闭前的出现提示的实现代码
May 25 Javascript
jquery常用特效方法使用示例
Apr 25 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
Sep 04 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
JavaScript控制按钮可用或不可用的方法
Apr 03 Javascript
Vue.js创建Calendar日历效果
Nov 03 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
Jan 23 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
JS实现的字符串数组去重功能小结
Jun 17 Javascript
JavaScript事件循环及宏任务微任务原理解析
Sep 02 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 #Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 #Javascript
微信小程序实现bindtap等事件传参
Apr 08 #Javascript
详解vue中axios请求的封装
Apr 08 #Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 #Javascript
vue+element+Java实现批量删除功能
Apr 08 #Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 #Javascript
You might like
第十三节--对象串行化
2006/11/16 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
jQuery知识点整理
2015/01/30 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
2017/07/06 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
Python脚本实现格式化css文件
2015/04/08 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
wxPython色环电阻计算器
2019/11/18 Python
Python包和模块的分发详细介绍
2020/06/19 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
Etam德国:内衣精品店
2019/08/25 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
服装设计行业个人的自我评价
2013/12/20 职场文书
安全第一课观后感
2015/06/18 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
python基于turtle绘制几何图形
2021/06/15 Python
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL