什么是节流:单位时间以外,只触发一次,如果在这个单位时间之内多次触发,最终也只会执行一次

  1. 比喻:走A-DFN 打枪
  2. 1、射击游戏中 鼠标事件
  3. 2、鼠标的移动距离测算
  4. 3input http 搜索联想

节流

  1. 节流:无论你拖拽一个元素多快,事件都会每间隔200ms触发一次
  2. 节流可以让函数变得平滑
  1. <div id="app" draggable="true">可拖拽</div>
  2. <script>
  3. let timer = null;
  4. const app = document.getElementById("app");
  5. app.addEventListener("drag",function(e){
  6. if(timer){
  7. return
  8. }
  9. timer = setTimeout(()=>{
  10. console.log(e.offsetX,e.offsetY)
  11. timer = null;
  12. },500)
  13. })
  14. </script>

封装节流函数

  1. const app = document.getElementById("app")
  2. app.addEventListener("drag",throttle(function(e){
  3. console.log(e.offsetY);
  4. }))
  5. function throttle(fn,delay=500){
  6. let timer = null
  7. return function(){
  8. if(timer){
  9. return
  10. }
  11. timer = setTimeout(()=>{
  12. console.log(arguments);
  13. fn.apply(this,arguments)
  14. timer = null
  15. },delay)
  16. }
  17. }

节流和搜索

节流一般是使用在搜索框中

  1. # throttle.js
  2. function throttle(fn,delay=500){
  3. let timer = null
  4. return function(){
  5. if(timer){
  6. return
  7. }
  8. timer = setTimeout(()=>{
  9. fn.apply(this,arguments)
  10. timer = null
  11. /* 这里如果不写成null,那么在执行定时器中的回调函数时,如果在按下键盘,就会
  12. 直接清除了,然后向下执行,在执行到这,timer再次被赋值,然后在等待中在按下
  13. 键盘,就又会删除timer,就陷入死循环了;
  14. 而加上timer=null,那么在执行到回调函数时,timer的值就不是定时器的值,就清除不掉正在执行的定时器了 */
  15. },delay)
  16. }
  17. // fn必须是一个function(){},不可以传函数名
  18. }
  1. <div id="app">
  2. <!-- 事件 -->
  3. <input type="text" v-model="msg">
  4. <p>{{msg}}</p>
  5. <!-- 监听器 -->
  6. </div>
  7. <script>
  8. new Vue({
  9. el:"#app",
  10. data:{
  11. msg:"hello"
  12. },
  13. // wacth属性可以监听data中值的变化
  14. watch:{
  15. // 节流
  16. msg:throttle(function(){
  17. this.getSearch(this.msg)
  18. })
  19. },
  20. methods: {
  21. getSearch(val){
  22. var url = `http://122.112.161.135:3000/search?keywords=${val}`
  23. console.log(url);
  24. }
  25. },
  26. })
  27. </script>