微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)


Posted in Javascript onSeptember 19, 2019

一、函数节流(throttle)

**函数节流:一个函数执行一次后,只有大于设定的执行周期后才会执行第二次**。有个需要频繁触发函数,出于优化性能角度,在规定时间内,只让函数触发的第一次生效,后面不生效。

### 1.如何实现
其原理是用时间戳来判断是否已到回调该执行时间,记录上次执行的时间戳,然后每次触发 scroll 事件执行回调,回调中判断当前时间戳距离上次执行时间戳的间隔是否已经到达 规定时间段,如果是,则执行,并更新上次执行的时间戳,如此循环;

function throttle(fn, delay) {
// 记录上一次函数触发的时间
var lastTime = 0;
return function() {
// 记录当前函数触发的时间
var nowTime = Date.now();
if (nowTime - lastTime > delay) {
// 修正this指向问题
fn.call(this);
// 同步时间
lastTime = nowTime;
}
}
}
document.onscroll = throttle(function() { console.log('scroll事件被触发了' + Date.now()) }, 200)

微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)

### 2.函数节流的应用场景
需要间隔一定时间触发回调来控制函数调用频率:

* DOM 元素的拖拽功能实现(mousemove)
* 搜索联想(keyup)
* 计算鼠标移动的距离(mousemove)
* Canvas 模拟画板功能(mousemove)
* 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
* 监听滚动事件判断是否到页面底部自动加载更多:给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次

二、函数防抖(debounce)

**防抖函数:一个需要频繁触发的函数,在规定时间内,只让最后一次生效,前面的不生效。**

### 1.如何实现

其原理就第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码。当第二次调用该函数时,它会清除前一次的定时器并设置另一个。如果前一个定时器已经执行过了,这个操作就没有任何意义。然而,如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器,然后延迟一定时间再执行。

<button id='btn'>按钮</button>
<script type="text/javascript">
function debounce(fn, delay) {
// 记录上一次的延时器
var timer = null;
return function() {
// 清除上一次延时器
clearTimeout(timer)
timer = setTimeout(function() {
fn.apply(this)
}, delay)
}
}
document.getElementById('btn').onclick = debounce(function() {
console.log('点击事件被触发' + Date.now())
}, 1000)
</script>

微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)

### 2.函数防抖的应用场景

对于连续的事件响应我们只需要执行一次回调:

* 每次 resize/scroll 触发统计事件
* 文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,验证一次就好)

总结

以上所述是小编给大家介绍的微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery中实现标签切换效果的代码
Mar 01 Javascript
ModelDialog JavaScript模态对话框类代码
Apr 17 Javascript
js获取url中指定参数值的示例代码
Dec 14 Javascript
Jquery getJSON方法详细分析
Dec 26 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
基于jquery实现省市联动特效
Dec 17 Javascript
JQuery和PHP结合实现动态进度条上传显示
Nov 23 Javascript
详解Vue监听数据变化原理
Mar 08 Javascript
php简单数据库操作类的封装
Jun 08 Javascript
JS设计模式之访问者模式定义与用法分析
Feb 05 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
jquery拖拽自动排序插件使用方法详解
Jul 20 jQuery
vue 设置 input 为不可以编辑的实现方法
Sep 19 #Javascript
node 标准输入流和输出流代码实例
Sep 19 #Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
Sep 19 #Javascript
微信小程序3D轮播实现代码
Sep 19 #Javascript
layui 实现表格某一列显示图标
Sep 19 #Javascript
微信小程序防止多次点击跳转(函数节流)
Sep 19 #Javascript
layui按条件隐藏表格列的实例
Sep 19 #Javascript
You might like
全国中波电台频率表
2020/03/11 无线电
一个MYSQL操作类
2006/11/16 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
JS轮播图的实现方法
2020/08/24 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
Python中音频处理库pydub的使用教程
2017/06/07 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
几个常见的消息中间件(MOM)
2014/01/08 面试题
运动会100米解说词
2014/01/23 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server