在项目开发过程中经常遇到在input的change事件中发起请求,将用户最新输入的字符作为data传给后台,但是如果用户的输入频率过高,或者用户输入的字符还未拼成一个完整的字词,这时候发起请求会浪费网络资源,使页面卡顿。

  这时候我们就用到了函数去抖(debounce)和函数节流(throttle),首先来看一下概念:

  1,函数去抖(又称防抖)

  在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

  未优化前代码demo:

        <input id="debounceTest" />
<script>
function ajax(value) {
console.log(value+'-----------发起ajax请求')
} let inputa = document.getElementById('debounceTest') inputa.addEventListener('keyup', function (e) {
ajax(e.target.value)
})
</script>

  效果图:

  

  从页面中可以看到,只要触发了keyup时间,页面就会发起请求,不管用户是否输入了一个完整的字符,这样对网络资源十分浪费,在移动端甚至可能造成用户体验不流畅,系统卡顿,所以我们来对代码进行优化,如下:

优化后代码demo:

function ajax(content) {
console.log(content+'---------------ajax请求')
} function debounce(fun, delay) {
return function (args) {
let that = this
let _args = args
clearTimeout(fun.id)
fun.id = setTimeout(function () {
fun.call(that, _args)
}, delay)
}
} let inputb = document.getElementById('debounce') let debounceAjax = debounce(ajax, 500) inputb.addEventListener('keyup', function (e) {
debounceAjax(e.target.value)
})

  页面效果:

  

  可以看出,当用户一直在输入时,页面不会发起请求,当用户的上次输入与下次输入有一定时间间隔时,页面才会发起请求。

同样的问题还有另一种解决方法:

2,函数节流(throttle)

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

 还是上边的例子,这次用节流的方法实现

节流后的代码demo:

function throttle(fun, delay) {
let last, deferTimer
return function (args) {
let that = this
let _args = arguments
let now = +new Date()
if (last && now < last + delay) {
clearTimeout(deferTimer)
deferTimer = setTimeout(function () {
last = now
fun.apply(that, _args)
}, delay)
}else {
last = now
fun.apply(that,_args)
}
}
} let throttleAjax = throttle(ajax, 1000) let inputc = document.getElementById('throttle')
inputc.addEventListener('keyup', function(e) {
throttleAjax(e.target.value)
})

页面效果:

  可以看出,不管用户的输入速度是多少,页面总是以恒定的间隔向后台发起请求。

  函数节流还可以应用于其他事件,比如mouse移动事件,页面滚动事件,resize事件等能高频次触发的事件中。

函数节流和去抖都是为了解决事件触发频率过高的问题,但是使用了不同的原理

节流是总是以固定的间隔发起请求,对高频率事件做做次数限制。去抖是固定时间段内只发送一次请求。对高频率事件做做次数限制

  以上为节流去抖的全部内部,如有错误还望指正。

JS系列1---节流,去抖(防抖)应用场景:intput请求优化,页面监听的更多相关文章

  1. 【js监听报错】页面监听js报错问题

    <html> <head> <script type="text/javascript"> // 页面监听js报错问题 onerror=hand ...

  2. JavaScript 高级系列之节流 [throttle] 与防抖 [debounce]

    一.概念 这两个东西都是为了项目优化而出现的,官方是没有具体定义的,他们的出现主要是为了解决一些短时间内连续执行的事件带来性能上的不佳和内存的消耗巨大等问题:像这类事件一般像 scroll keyup ...

  3. 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

    JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...

  4. angular.js和vue.js中实现函数去抖(debounce)

    问题描述 搜索输入框中,只当用户停止输入后,才进行后续的操作,比如发起Http请求等. 学过电子电路的同学应该知道按键防抖.原理是一样的:就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用 ...

  5. JS一个非常经典的问题:在遍历数组时对DOM监听事件,索引值将始终等于遍历结束后的值

    一个简单的Tab选项卡点击事件. <style type="text/css"> ul{padding:0;margin:0;} .tab{width:400px;} ...

  6. 深入理解javascript函数进阶系列第三篇——函数节流和函数防抖

    前面的话 javascript中的函数大多数情况下都是由用户主动调用触发的,除非是函数本身的实现不合理,否则一般不会遇到跟性能相关的问题.但在一些少数情况下,函数的触发不是由用户直接控制的.在这些场景 ...

  7. 浅析 JavaScript 的函数节流和去抖

    现代网页的实现上,会有很多交互上的优化,比如常见的 滚动加载 ,输入联想 等等.他们的实现思路很简单,以滚动加载而言,无非就是去是增加一个滚动的事件监听,每次滚动判断当前的元素是否已经滚动到了用户的可 ...

  8. 【javascript】js中的函数节流和函数防抖

    一.概念解释  函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段.  大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...

  9. JavaScript函数节流和函数防抖之间的区别

    一.概念解释  函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段.  大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...

随机推荐

  1. MSYS2开发环境搭建(无幻的博客,编译OpenSSL,可使用pacman升级)

    MSYS2开发环境搭建 软件安装 下载msys2-x86_64软件包,双击安装到某根目录下,比如D:\msys64. pacman是MSYS2自带的软件管理工具: 可通过修改msys64\etc\pa ...

  2. Hadoop 3、Hadoop 分布式存储系统 HDFS(好多彩色图)

    HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统. 一.HDFS的优缺点 1.HDFS优点: a.高容错性 .数据保存多个副本 .数 ...

  3. Wp8 Popup不随输入法偏移问题解决方案

    在wp中我们经常要实现,浮窗的效果这时我们就会考虑到Popup,但是在用Popup开发我们会遇到一个非常尴尬的问题,由于Popup不在主界面的可视化树内,在Popup显示的位置在输入法面板出现的范围时 ...

  4. wangjie.rocks的静态编译Qt,openssl,icu

    http://wangjie.rocks/2015/12/28/compile-qt/http://wangjie.rocks/2015/12/10/compile-icu/http://wangji ...

  5. 七、Linux磁盘管理及LVM讲解

      1.硬盘接口 IDE:家用产品,也部分应用于服务器 SATA:一般使用 SCSI:服务器市场 SAS:高端服务器上,价格昂贵  2.硬盘种类 SATA硬盘: SCSI硬盘: SAS硬盘: 3.分区 ...

  6. 使用fastjson读取超巨json文件引起的GC问题

    项目中需要将巨量数据生成的json文件解析,并写入数据库,使用了 alibaba 的 fastjson,在实践过程中遇到了 GC 问题,记录如下: 数据大约为70万条,文件大小在3~4G左右,使用 f ...

  7. python算法与数据结构-循环链表(39)

    一.循环链表的介绍 上一篇我们已经讲过单链表,本篇给大家讲解循单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点,其基本操作和单链表思路一样. 常用的操 ...

  8. 原生js封装轮播图

    个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比 ...

  9. 附006.Kubernetes RBAC授权

    一 RBAC 1.1 RBAC授权 基于角色的访问控制(RBAC)是一种基于个人用户的角色来管理对计算机或网络资源的访问的方法. RBAC使用rbac.authorization.k8s.io API ...

  10. python trojan development 2nd —— use python to send mail and listen to the key board then combine them

    请勿用于非法用途!!!!!本人概不负责!!!原创作品,转载说明出处!!!!! from pynput.keyboard import Key,Listener import logging impor ...