本文共 1926 字,大约阅读时间需要 6 分钟。
一些浏览器事件:window.onresize、window.mousemove等,触发的频率非常高,会造成界面卡顿
如果向后台发送请求,频繁触发,对服务器造成不必要的压力
所以要限制事件处理函数频繁调用,就有两种方式可以做到,分别是函数节流和函数防抖
在页面中滚动鼠标滚轮,会触发scroll事件,而滚动一次会触发很多次!!!如果向后台发送请求,频繁触发,对服务器造成不必要的压力
window.addEventListener("scroll", function (e) { console.log(e);});
通过设置一个时间间隔,使得函数在执行一次之后,超过时间间隔才会执行第二次
适合多次事件按照时间做平均分配触发
resize
窗口调整
scroll
页面滚动 mousemove
DOM元素拖拽功能 click
疯狂点击 /** * 实现函数节流 * 功能: 创建一个节流函数,在 wait 毫秒内最多执行 `callback` 一次 * @param {*} callback * @param {*} wait * @returns */export default function throttle(callback, wait) { // 定义开始时间 let start = 0; // 返回结果是一个函数 return function (e) { // 获取当前时间戳 let now = Date.now(); // 判断 if (now - start >= wait) { // 若满足条件,则执行回调函数 callback.call(this, e); // 修改开始时间 start = now } }}
import throttle from "./function/throttle.js";window.addEventListener( "scroll", throttle(function (e) { console.log(e); }, 500));
一次滚动只会执行一次函数
在规定时间内,只让最后一次生效,前面的不生效。
适合多次事件一次响应的情况
keyup/input
输入框实时搜索联想
在输入框输入内容时,每输入一个字符都会触发一次 keyup
let input = document.querySelector("input");input.onkeydown = function (e) { console.log(e.keyCode);};
/** * 实现函数防抖 * 该函数会从上一次被调用后,延迟 wait 毫秒后调用 callback * @param {*} callback * @param {*} time * @returns */export default function debounce(callback, time) { // 定时器变量 let timeId = undefined; // 返回一个函数 return function (e) { if (timeId !== undefined) { // 清空定时器 clearTimeout(timeId); } // 启动定时器 timeId = setTimeout(() => { // 执行回调 callback.call(this, e); // 执行完了重置id timeId = undefined; }, time); };}
import debounce from "./function/debounce";let input = document.querySelector("input");input.onkeydown = debounce(function (e) { console.log(e.keyCode);}, 1000);
节流:多次事件按照时间做平均分配触发
防抖:多次事件一次响应的情况
转载地址:http://mqtpz.baihongyu.com/