微信小程序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 相关文章推荐
AJAX架构之Dojo篇
Apr 10 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
Jul 09 Javascript
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
js 实现css风格选择器(压缩后2KB)
Jan 12 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
Apr 07 Javascript
详解JavaScript中的表单验证
Jun 16 Javascript
JS绘制生成花瓣效果的方法
Aug 05 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
js实现消息滚动效果
Jan 18 Javascript
jQuery实现文档树效果
Feb 20 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
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中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP 单引号与双引号的区别
2009/11/24 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
javascript parseInt 函数分析(转)
2009/03/21 Javascript
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
对python中return和print的一些理解
2017/08/18 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
pandas分区间,算频率的实例
2019/07/04 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
深入了解NumPy 高级索引
2020/07/24 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
员工晚婚的请假条
2014/02/08 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
法语专业求职信
2014/07/20 职场文书
个人求职自荐信范文
2015/03/06 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书