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


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 相关文章推荐
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
javascript框架设计之类工厂
Jun 23 Javascript
微信小程序 wxapp内容组件 icon详细介绍
Oct 31 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
基于vue的换肤功能的示例代码
Oct 10 Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
微信小程序适配iphoneX的实现方法
Sep 18 Javascript
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
JS实现鼠标移动拖尾
Dec 27 Javascript
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
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php中stdClass的用法分析
2015/02/27 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
php图片上传类 附调用方法
2016/05/15 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
bootstrap Table的一些小操作
2017/11/01 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Python和Sublime整合过程图示
2019/12/25 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
小学国庆节活动方案
2014/02/11 职场文书
《自选商场》教学反思
2014/02/14 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
美化环境标语
2014/06/20 职场文书
2014年统战工作总结
2014/12/09 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
Mysql忘记密码解决方法
2022/02/12 MySQL