微信小程序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 相关文章推荐
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
Feb 03 Javascript
nodeType属性返回被选节点的节点类型介绍
Nov 22 Javascript
js导出txt示例代码
Jan 14 Javascript
让JavaScript和其它资源并发下载的方法
Oct 16 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
JS实现的4种数字千位符格式化方法分享
Mar 02 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
js实现二级菜单渐隐显示
Nov 03 Javascript
jquery实现树形菜单完整代码
Dec 29 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
layui监听单元格编辑前后交互的例子
Sep 16 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
一个php作的文本留言本的例子(二)
2006/10/09 PHP
PHP简介
2006/10/09 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
浅谈PHP的反射机制
2016/12/15 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
python实现学生管理系统
2018/01/11 Python
详解Python文件修改的两种方式
2019/08/22 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
python实现猜拳游戏
2020/03/04 Python
Python可以用来做什么
2020/11/23 Python
Python LMDB库的使用示例
2021/02/14 Python
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
药学专业大专生的自我评价
2013/12/12 职场文书
继电保护工岗位职责
2014/01/05 职场文书
大学生创业感言
2014/01/25 职场文书
事业单位考核材料
2014/05/21 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
爱国主义电影观后感
2015/06/18 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
Python竟然能剪辑视频
2021/05/25 Python
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS