JS執(zhí)行控制之節(jié)流模式實(shí)例分析
本文實(shí)例講述了JS執(zhí)行控制之節(jié)流模式。分享給大家供大家參考,具體如下:
節(jié)流模式:對重復(fù)的業(yè)務(wù)邏輯進(jìn)行控制,執(zhí)行最后一次操作,并取消其他操作,以提高性能。
重復(fù)的業(yè)務(wù)邏輯真的很讓人討厭的,但其中往往蘊(yùn)含著可被優(yōu)化的空間。
比如我們經(jīng)常碰到的一種情況:當(dāng)鼠標(biāo)移進(jìn)容器的時(shí)候,改變?nèi)萜鞯念伾划?dāng)鼠標(biāo)移出去的時(shí)候,恢復(fù)默認(rèn)顏色。
但是有時(shí)候是用戶不小心移進(jìn)來的,或者是不小心移出去的,但是效果卻消失了。這樣用戶的體驗(yàn)效果是非常不好的,這時(shí)候,我們就可以利用節(jié)流模式。
節(jié)流模式的核心思想是創(chuàng)造計(jì)時(shí)器,延遲程序的執(zhí)行。這也使得計(jì)時(shí)器中的回調(diào)函數(shù)的操作異步執(zhí)行,
源代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>www.dbjr.com.cn 節(jié)流器試用——huansky</title> </head> <body> <div id="ttt"> <p id="t1">我只有在鼠標(biāo)放置兩秒后才改變背景色,移出超過兩秒才恢復(fù)</p> <br> <p id="t2">我是正常的,只要鼠標(biāo)移進(jìn)來就改變背景色,移出就恢復(fù)</p> <br> <p id="t3">我只有在鼠標(biāo)放置兩秒后才改變背景色,移出超過兩秒才恢復(fù)</p> </div> </body> <script> /** 節(jié)流器 * @param isclear 獲取傳入的第一個(gè)參數(shù) * @param fn 第二個(gè)參數(shù),表示函數(shù) **/ var throttle=function () { var isclear=arguments[0],fn; if (typeof isclear==="boolean"){ fn=arguments[1]; //函數(shù)的計(jì)時(shí)句柄存在,就清除函數(shù) fn._throttleID && clearTimeout(fn._throttleID); if(fn._throttleI){ console.log(fn._throttleID); } } else{ fn=isclear; param=arguments[1]; var p={ context:null, args:[], time:800, }; //清除執(zhí)行句柄函數(shù) arguments.callee(true,fn); //為函數(shù)綁定計(jì)時(shí)器的句柄,延遲執(zhí)行函數(shù) fn._throttleID=setTimeout(function(){ //console.log(fn._throttleID); fn.apply(p.context,p.args); },p.time) } } var dom=document.getElementsByTagName("p"); var Entefn1=function(){ dom[0].style.cssText="background-color:yellow";}; var Entefn2=function(){ dom[1].style.cssText="background-color:blue";}; var Entefn3=function(){ dom[2].style.cssText="background-color:red";}; var Entefn11=function(){ dom[0].style.cssText="background-color:#fff";}; var Entefn22=function(){ dom[1].style.cssText="background-color:#fff";}; var Entefn33=function(){ dom[2].style.cssText="background-color:#fff";}; dom[0].addEventListener("mouseover",function(){ throttle(true,Entefn11); throttle(Entefn1); },false); dom[1].addEventListener("mouseover",Entefn2,false); dom[2].addEventListener("mouseover",function(){ throttle(true,Entefn33); throttle(Entefn3); },false); dom[0].addEventListener("mouseout",function(){ throttle(Entefn11); throttle(true,Entefn1); },false); dom[1].addEventListener("mouseout",Entefn22,false); dom[2].addEventListener("mouseout",function(){ throttle(Entefn33); throttle(true,Entefn3); },false); </script> </html>
這里使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼,運(yùn)行效果如下:
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
- JS面向?qū)ο蠡A(chǔ)講解(工廠模式、構(gòu)造函數(shù)模式、原型模式、混合模式、動態(tài)原型模式)
- 理解javascript中的嚴(yán)格模式
- js 函數(shù)調(diào)用模式小結(jié)
- js面向?qū)ο笾R妱?chuàng)建對象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式)
- 深入理解javascript嚴(yán)格模式(Strict Mode)
- Javascript中正則表達(dá)式的全局匹配模式分析
- JavaScript 模式之工廠模式(Factory)應(yīng)用介紹
- JavaScript觸發(fā)onScroll事件的函數(shù)節(jié)流詳解
- JS中setTimeout的巧妙用法前端函數(shù)節(jié)流
- JavaScript函數(shù)節(jié)流概念與用法實(shí)例詳解
相關(guān)文章
javascript中兼容主流瀏覽器的動態(tài)生成iframe方法
這篇文章主要介紹了javascript中兼容主流瀏覽器的動態(tài)生成iframe方法,需要的朋友可以參考下2014-05-05微信小程序商城項(xiàng)目之購物數(shù)量加減(3)
這篇文章主要為大家詳細(xì)介紹了微信小程序商城購物數(shù)量加減功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04JS實(shí)現(xiàn)仿微博可關(guān)閉彈出層效果
這篇文章主要介紹了JS實(shí)現(xiàn)仿微博可關(guān)閉彈出層效果,涉及JavaScript彈出窗口的設(shè)置及頁面元素動態(tài)操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09詳解JavaScript UTC時(shí)間轉(zhuǎn)換方法
這篇文章主要介紹了JavaScript UTC時(shí)間轉(zhuǎn)換方法,介紹了本地時(shí)間到UTC時(shí)間的轉(zhuǎn)換、UTC日期到本地日期的轉(zhuǎn)換,感興趣的小伙伴們可以參考一下2016-01-01微信小程序云函數(shù)使用mysql數(shù)據(jù)庫過程詳解
這篇文章主要介紹了微信小程序云函數(shù)使用mysql數(shù)據(jù)庫過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08