事件防抖、函数节流

一、事件防抖:

      1、本来事件的触发比较频繁,但是,我们只希望这无数次的事件触发中,有部分事件是有效的(如:用户有短暂的停止时才调用函数)。特别是在触发一次,就发一次请求,会有无数次的抖动。

如:  键盘事件:onkeydown,onkeyup,onkeypress,oninput,都是按一次键,触发一次.触发非常频繁。

     2、使用场景:

搜索框(百度搜索框,淘宝,京东等等),每次用户输入内容都需要发一次请求,从后端拿到关键字对应的内容.

特别是输入汉字时:

我们希望用户输入完成汉字时再触发(发送请求),

但是,实际情况是:当用户输入一个字母时,就会触发一次事件(发送一次请求)

记住:用户的输入习惯:当输入完一个汉字后,或者若干个汉字后,会有短暂的停顿。而在连续输入字母的过程中,不会有停顿。事件防抖的思路就是利用这个短暂停。

3、示例代码:


 
 
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title> </title>
  6. <style type="text/css">
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. ul{
  12. list-style: none;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <input type="text" id="querystr">
  18. <input type="submit" value="百度一下">
  19. <ul id="search-list">
  20. <li>运动鞋 </li>
  21. <li>拖鞋 </li>
  22. </ul>
  23. </body>
  24. </html>
  25. <script type="text/javascript">
  26. let myTimer = null;
  27. $( "querystr").oninput = function(){
  28. //在每次输入时,先清除上一次的定时器,清除了定时器后,就不会发送请求了。
  29. //即本次输入和上次输入的间隔非常短(小于100ms)时,上次定时器的代码就不会执行,也就不会发请求了。
  30. //如果本次输入和上次输入之间的时间间隔大于100ms时,上次输入的内容就会发送请求。
  31. if(myTimer!= null){
  32. window.clearTimeout(myTimer);
  33. }
  34. myTimer = setTimeout( ()=>{
  35. let scriptDom = document.createElement( "script");
  36. scriptDom.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=' + this.value + '&json=1&p=3&sid=1438_24869_21080_18560_17001_25177_22160&req=2&bs=1%2B&pbs=1%2B&csor=2&pwd=1%3D&cb=f&_=1511334117083';
  37. document.body.appendChild(scriptDom);
  38. scriptDom.remove();
  39. }, 100);
  40. }
  41. function f(data){
  42. console.log(data);
  43. let htmlStr = "";
  44. data.s.forEach( (item)=>{
  45. htmlStr+= `<li>${item}</li>`;
  46. });
  47. $( "search-list").innerHTML = htmlStr;
  48. }
  49. function $(id){
  50. return document.getElementById(id);
  51. }
  52. </script>

 

二、函数节流:

1、节流的意思是,不要调用太频繁;如每隔200ms调用一次.

 

2、使用场景:

如:在页面无数次的滚动时(就会触发无数次的onscroll),但是我希望触发(调用函数)不要那么频繁.


 
 
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title> </title>
  6. <style type="text/css">
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. ul{
  12. list-style: none;
  13. }
  14. </style>
  15. </head>
  16. <body style="height: 1000px;">
  17. </body>
  18. </html>
  19. <script type="text/javascript">
  20. //函数节流:
  21. //节流的意思是,不要调用太频繁;如每隔200ms调用一次.
  22. //使用场景:
  23. //如:在页面无数次的滚动时(就会触发无数次的onscroll),但是我希望触发(调用函数)不要那么频繁.
  24. let i = 0;
  25. let myTimer = null;
  26. window.onscroll = function(){
  27. //无数次的滚动过程中,
  28. //1、如果计时器还没有停(myTimer!=null),则不执行下面的代码(即:直接return)。
  29. //2、如果计时器停了(myTimer==null),说明一次执行完毕,则重新再启动定时器。
  30. if(myTimer!= null){
  31. return;
  32. }
  33. //启动定时器,时间间隔是200ms。
  34. myTimer = setTimeout( ()=>{
  35. console.log(i++);
  36. myTimer = null;
  37. }, 200);
  38. }
  39. function $(id){
  40. return document.getElementById(id);
  41. }
  42. </script>

 

三、事件防抖和函数节流的区别:

 

1、函数节流:

节流的意思是:不要调用太频繁;如每隔200ms调用一次.

使用场景:

如:在页面无数次的滚动时(就会触发无数次的onscroll),但是我希望触发(调用函数)不要那么频繁.

 

2、事件防抖

防抖:在用户连续触发事件过程中,不能执行代码。

 

事件防抖的关键在:用户有停顿时,才执行代码(调用函数),没有停顿时,不执行代码;

函数节流的关键在于:用户停顿不停顿都会触发,无非触发的频率(调用函数)没有原始事件那么多而已.。


 
 
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title> </title>
  6. <style type="text/css">
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. ul{
  12. list-style: none;
  13. }
  14. </style>
  15. </head>
  16. <body style="height: 1000px;">
  17. </body>
  18. </html>
  19. <script type="text/javascript">
  20. // 一、事件防抖和函数节流的区别:
  21. // 1、函数节流:
  22. // 节流的意思是:不要调用太频繁;如每隔200ms调用一次.
  23. // 使用场景:
  24. // 如:在页面无数次的滚动时(就会触发无数次的onscroll),但是我希望触发(调用函数)不要那么频繁.
  25. // 2、事件防抖
  26. // 防抖:在用户连续触发事件过程中,不能执行代码。
  27. //一 函数节流:
  28. /*
  29. let i = 0;
  30. let myTimer = null;
  31. window.onscroll = function(){
  32. if(myTimer!=null){
  33. return;
  34. }
  35. myTimer = setTimeout(()=>{
  36. console.log(i++);
  37. myTimer =null;
  38. },1000);
  39. }
  40. */
  41. // 二 事件防抖
  42. let i = 0;
  43. let myTimer = null;
  44. window.onscroll = function(){
  45. if(myTimer!= null){
  46. window.clearTimeout(myTimer);
  47. }
  48. //重新启动定时器
  49. myTimer = setTimeout( ()=>{
  50. console.log(i++);
  51. myTimer = null;
  52. }, 200);
  53. }
  54. function $(id){
  55. return document.getElementById(id);
  56. }
  57. </script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值