什么是节流:单位时间以外,只触发一次,如果在这个单位时间之内多次触发,最终也只会执行一次
比喻:走A-DFN 打枪1、射击游戏中 鼠标事件2、鼠标的移动距离测算3、input http 搜索联想
节流
节流:无论你拖拽一个元素多快,事件都会每间隔200ms触发一次节流可以让函数变得平滑
<div id="app" draggable="true">可拖拽</div><script>let timer = null;const app = document.getElementById("app");app.addEventListener("drag",function(e){if(timer){return}timer = setTimeout(()=>{console.log(e.offsetX,e.offsetY)timer = null;},500)})</script>
封装节流函数
const app = document.getElementById("app")app.addEventListener("drag",throttle(function(e){console.log(e.offsetY);}))function throttle(fn,delay=500){let timer = nullreturn function(){if(timer){return}timer = setTimeout(()=>{console.log(arguments);fn.apply(this,arguments)timer = null},delay)}}
节流和搜索
节流一般是使用在搜索框中
# throttle.jsfunction throttle(fn,delay=500){let timer = nullreturn function(){if(timer){return}timer = setTimeout(()=>{fn.apply(this,arguments)timer = null/* 这里如果不写成null,那么在执行定时器中的回调函数时,如果在按下键盘,就会直接清除了,然后向下执行,在执行到这,timer再次被赋值,然后在等待中在按下键盘,就又会删除timer,就陷入死循环了;而加上timer=null,那么在执行到回调函数时,timer的值就不是定时器的值,就清除不掉正在执行的定时器了 */},delay)}// fn必须是一个function(){},不可以传函数名}
<div id="app"><!-- 事件 --><input type="text" v-model="msg"><p>{{msg}}</p><!-- 监听器 --></div><script>new Vue({el:"#app",data:{msg:"hello"},// wacth属性可以监听data中值的变化watch:{// 节流msg:throttle(function(){this.getSearch(this.msg)})},methods: {getSearch(val){var url = `http://122.112.161.135:3000/search?keywords=${val}`console.log(url);}},})</script>
