JavaScript函數節流概念與用法實例詳解
本文實例講述了JavaScript函數節流概念與用法。分享給大家供大家參考,具體如下:
最近在做網頁的時候有個需求,就是瀏覽器視窗改變的時候需要改一些頁面元素大小,於是乎很自然的想到了window的resize事件,於是乎我是這麼寫的
<!DOCTYPE html> <html> <head> <title>Throttle</title> </head> <body> <script type="text/javascript"> n=0; function resizehandler(){ console.log(new Date().getTime()); console.log(++n); } window.onresize=resizehandler; </script> </body> </html>
功能倒是實現了,但是我拖拽的方式改變瀏覽器窗口大小的時候看了下控制台
沒錯,簡單的一個拖拽讓我的resizeHandler()方法執行了52次,這完全不是我想要的效果,實際上我的resizeHandler()方法的程式碼很複雜,甚至會使用ajax向伺服器發送請求,要是簡單的一次改變視窗大小就要調用52次這還了得
函數節流
其實我的本意只是視窗resize後頁面做一些調整就可以,而window的resize事件並不是在resize結束後才觸發的,具體則麼個頻率我也不知道,但卻是在不停的調用,直到視窗大小不再變化。其實類似的機制還有滑鼠的mousemove,都是在短時間內重複觸發。
在《JavaScript高級程式設計》中有專門應對此問題的函數節流
function throttle(method,context){ clearTimeout(method.tId); method.tId=setTimeout(function(){ method.call(context); },500); }
原理很簡單,利用定時器,讓函數執行延遲500毫秒,在500毫秒內如果有函數又被調用則刪除上一次調用,這次調用500毫秒後執行,如此往復。這樣我剛才的程式碼可以改為
<script type="text/javascript"> n=0; function resizehandler(){ console.log(new Date().getTime()); console.log(++n); } function throttle(method,context){ clearTimeout(method.tId); method.tId=setTimeout(function(){ method.call(context); },500); } window.onresize=function(){ throttle(resizehandler,window); }; </script>
拖曳一下試試,果真只執行了一次
另一種做法
網上還有一種函數節流方案,它是這麼做的
function throttle(method,delay){ var timer=null; return function(){ var context=this, args=arguments; clearTimeout(timer); timer=setTimeout(function(){ method.apply(context,args); },delay); } }
調用試試試,一樣的效果
<script type="text/javascript"> n=0; function resizehandler(){ console.log(new Date().getTime()); console.log(++n); } function throttle(method,delay){ var timer=null; return function(){ var context=this, args=arguments; clearTimeout(timer); timer=setTimeout(function(){ method.apply(context,args); },delay); } } window.onresize=throttle(resizehandler,500);//因为返回函数句柄,不用包装函数了 </script>
比較
兩種方法都是利用了setTimeout,不同的是第二種方法加入的函數延遲執行時間,這個在第一種方案中很容易也具有此功能,加一個參數的事兒。
但第一種方案把tId設為函數的一個變數保存,而第二種創建了一個閉包來儲存。個人覺得差距不大,很喜歡第一種,簡單,有效率。
新需求
有一天做了個類似的東西,就像百度首頁輸入自動提示一樣的東西,我在text上綁定keyup事件,每次鍵盤彈起的時候自動提示,但是又不想提示那麼頻繁,於是我用了上面方法,但是悲劇了,只有停止輸入等500毫秒才會提示,在輸入過程中根本就沒有提示。看了一下程式碼,可不是嘛,只要是使用者會盲打,在500毫秒內按一下鍵盤,提示函數就會不斷被延遲,這樣只有停下來的時候才會提示,這就沒意義了。
能不能在函數節流的基礎上間隔固定時間就執行一次?
小改動
在網上搜了一下我們可以根據第二種寫法(第一種為函數拓展多個變量感覺有些不好)做些改動,添加一個參數作為到固定間隔必須執行
function throttle(method,delay,duration){ var timer=null, begin=new Date(); return function(){ var context=this, args=arguments, current=new Date();; clearTimeout(timer); if(current-begin>=duration){ method.apply(context,args); begin=current; }else{ timer=setTimeout(function(){ method.apply(context,args); },delay); } } }
這樣每次我們判斷間隔了多久,要是超過設定時間則立即執行一次,以剛才例子試一試效果
window.onresize=throttle(resizehandler,100,200);
果真既沒有頻繁執行也沒有就最後執行
希望本文所述對JavaScript程式設計有所幫助。
更多JavaScript函數節流概念與用法實例詳解相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...
