zoukankan      html  css  js  c++  java
  • 防抖与节流函数

    这两样东西也是网页性能优化的一种方式  防止频繁的触发事件

    一、事件防抖:

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

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

         2、使用场景:

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

    特别是输入汉字时:

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

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

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

    3、示例代码:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			*{
    				margin: 0;
    				padding: 0;
    			}
    			ul{
    				list-style: none;
    			}
    		</style>
    	</head>
    	<body>
    		<input type="text" id="querystr">
    		<input type="submit" value="百度一下">
    		<ul id="search-list">
    			<li>运动鞋</li>
    			<li>拖鞋</li>			
    		</ul>
    	</body>
    </html>
    <script type="text/javascript">
     
     
    let myTimer = null;
     
     
    $("querystr").oninput = function(){
    	//在每次输入时,先清除上一次的定时器,清除了定时器后,就不会发送请求了。
    	//即本次输入和上次输入的间隔非常短(小于100ms)时,上次定时器的代码就不会执行,也就不会发请求了。
    	//如果本次输入和上次输入之间的时间间隔大于100ms时,上次输入的内容就会发送请求。
    	if(myTimer!=null){
    		window.clearTimeout(myTimer);
    	}
    	myTimer = setTimeout(()=>{		
    		let scriptDom = document.createElement("script");
    		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';
    		document.body.appendChild(scriptDom);
    		scriptDom.remove();
    	},100);
    }
     
    function f(data){
    	console.log(data);
    	let htmlStr = "";
    	data.s.forEach((item)=>{
    		htmlStr+=`<li>${item}</li>`;
    	});
    	$("search-list").innerHTML = htmlStr;
    }
     
    function $(id){
    	return document.getElementById(id);
    }
     
     
     
     
    	
    </script>
    

      

    节流

    高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

    思路:
    每次触发事件时都判断当前是否有等待执行的延时函数

    类似于射击类游戏发射子弹的原理

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <style type="text/css">
                *{
                    margin: 0;
                    padding: 0;
                }
                ul{
                    list-style: none;
                }
            </style>
        </head>
        <body style="height: 1000px;">
            
        </body>
    </html>
    <script type="text/javascript">
    // 一、事件防抖和函数节流的区别:
    // 1、函数节流:
     
    // 节流的意思是:不要调用太频繁;如每隔200ms调用一次.
     
    // 使用场景:
     
    // 如:在页面无数次的滚动时(就会触发无数次的onscroll),但是我希望触发(调用函数)不要那么频繁.
     
    // 2、事件防抖
     
    // 防抖:在用户连续触发事件过程中,不能执行代码。
     
    //一 函数节流:
    /*
    let i = 0;
    let myTimer = null;
    window.onscroll = function(){    
        if(myTimer!=null){
            return;
        }
        myTimer = setTimeout(()=>{
            console.log(i++);
            myTimer =null;
        },1000);
    }
    */
     
     
    // 二 事件防抖
     
    let i = 0;
    let myTimer = null;
     
    window.onscroll = function(){    
        if(myTimer!=null){
            window.clearTimeout(myTimer);
        }
        //重新启动定时器
        myTimer = setTimeout(()=>{
            console.log(i++);
            myTimer =null;
        },200);
        
    }
     
     
    function $(id){
        return document.getElementById(id);
    }
        
    </script>
  • 相关阅读:
    笔记——文档在线阅读的解决方案(未完待续)
    杂记之web篇
    对针对接口编程的理解
    汇编笔记之 ret 、retf和call
    electron桌面应用
    wepack打包时出错不压缩代码及使用es7(async await)新语法问题
    npm install 时发生错误
    create-react-app 后使用babel/polyfill
    webpack3.x--react,jsx多页配置
    webpack--打包scss
  • 原文地址:https://www.cnblogs.com/ZyJuly/p/13887060.html
Copyright © 2011-2022 走看看