亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

淺談JavaScript函數節流

2019-11-20 13:46:48
字體:
來源:轉載
供稿:網友

瀏覽器中某些計算和處理要比其他的昂貴的多。例如,DOM操作比起非DOM交互需要更多的內存和CPU時間。連續嘗試進行過多的DOM相關操作可能會導致 瀏覽器掛起,有時候甚至會崩潰。尤其在IE中使用onresize事件處理程序的時候容易發生,當調整瀏覽器大小的時候,該事件連續觸發。在 onresize事件處理程序內部如果嘗試進行DOM操作,其高頻率的更改可能會讓瀏覽器崩潰。

     函數節流背后的基本思想是,某些代碼不可以在沒有間斷的情況連續重復執行。第一次調用函數,創建一個定時器,在指定的時間間隔之后運行代碼。當第二次調用 該函數時,它會清除前一次的定時器并設置另一個。如果前一個定時器已經執行過了,這個操作就沒有任何意義。然而,如果前一個定時器尚未執行,其實就是將其 替換為一個新的定時器。目的是只有在執行函數的請求停止了一段時間之后才執行。

 function throttle ( method , context ){        clearTimeout ( method.tId );        method.tId = setTimeout ( function () {           method.call ( context );         } , 100);     }

應用舉例:
     假設有一個<div/>元素需要保持它的高度始終等同于寬度,可作如下編碼:

 function resizeDiv(){        var div = document.getElementById("mydiv");        div.style.height = div.offsetWidth + "px";      }      window.onresize = function(){        throttle(resizeDiv);      }

這里,調整大小的功能被放入了一個叫做resizeDiv的單獨函數中,然后onresize事件處理程序調用throttle()并傳入 resizeDiv函數,而不是直接調用resizeDiv()。多數情況下,用戶是感覺不到變化的,雖然給瀏覽器節省的計算可能非常大。

下面是其他網友的補充

今天主要寫寫我們平時工作中需要的函數節流。可能有的朋友對函數節流沒有意識。其實,在工作中,很多場景都需要我們進行js的節流。最常見的是屏幕伸縮resize,以及touchmove或者scroll等事件的時候。大家不知道有沒有看我之前寫的文章!jquery判斷頁面滾動條上滾下滾,touchmove的滑動方向,大家在使用這些例子的時候,會發現頁面不停的觸發touchmove或者scroll因為這里沒有關系到頁面的重繪,因此,我在這里沒有使用javascript函數節流。但是,當我們使用window.onresize的時候,也會不停的觸發resize事件!這里就會關系到頁面的重新繪制問題了。因此,在window的resize的時候,我們推薦大家使用函數節流的方式!

javascript函數節流簡介
假如你對我上面一大坨文字感到頭大,沒關系,我在這里簡單舉例說明一下函數節流吧!例如當我們使用

 $(window).resize(function(){      console.log("haorooms window resize");    })

會發現:

這里會輸出好多次。我們簡單的縮小一下窗口,就會不停的觸發!

這樣在div很多的時候,頁面不停重繪,要是遇到版本比較低的IE等,很可能會出現瀏覽器崩潰的現象!為了避免這種情況,我們可以用函數節流的方式?;镜乃枷胧牵旱谝淮握{用函數的時候,我們創建一個定時器,在指定時間間隔之后運行代碼,第二次調用的時候,會清楚前一個定時器,并重新設置一個。如果前一個定時器已經執行過了,那么這個操作就沒有有意了,如果定時器尚未執行,就會將其替換為一個新的定時器。目的是在執行函數停止了一段時間之后再執行。

用對象的方式可以如下寫:

var haoroomstest={      timeoutId:null,      performProcessing:function(){                  console.log("resize");            },      process:function(){        clearTimeout(this.timeoutId);        var that=this;        this.timeoutId=setTimeout(function(){          that.performProcessing();        },500)      }    }

這樣之后,我們再用:

$(window).resize(function(){ haoroomstest.process(); })

這樣就會減少請求,減少dom重繪,達到節流的目的!

函數節流其他方式
除了我們運用對象的方式,網上及資料中也介紹了關于函數節流的其他方法和方式,我下面簡單介紹幾種!

函數方式一

function throttle(method,context){      clearTimeout(method.tId);      method.tId=setTimeout(function(){        method.call(context);      },100);    }

我們如下使用

function resizeDIv(){      console.log("haorooms")    }    $(window).resize(function(){      throttle(resizeDIv)    })

和上面對象實現了同樣的效果!

函數方式二

網上還有一種比較流行的節流方式,我在這里寫一下!

function throttle(method,delay){      var timer=null;      return function(){        var context=this, args=arguments;        clearTimeout(timer);        timer=setTimeout(function(){          method.apply(context,args);        },delay);      }    }

然后可以這么寫:

function resizeDIv(){      console.log("haorooms")    }   window.onresize=throttle(resizeDIv,500);

新需求

我們在做模糊搜索智能聯想提示的時候,會在input上面綁定keyup事件。但是我又不想觸發的那么頻繁,用上面的方式就會有問題。因此,在上面的函數基礎上稍加改動,如下:

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);        }      }}

這樣觸發就不會有之前那么頻繁了!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区三区免费视频| 色悠悠国产精品| 91亚洲精品一区二区| 国a精品视频大全| 这里精品视频免费| 精品视频在线观看日韩| 国产美女精品视频免费观看| 国产精品久久久久久婷婷天堂| 97成人在线视频| 日韩电影中文字幕av| 国产精品久久77777| 51色欧美片视频在线观看| 亚洲日本欧美中文幕| 91社区国产高清| 欧美国产日韩免费| 久久精品中文字幕免费mv| 日韩高清电影好看的电视剧电影| 成人黄色短视频在线观看| 亚洲综合日韩中文字幕v在线| 国产精品专区h在线观看| 久久精品青青大伊人av| 欧美视频在线免费| 色噜噜国产精品视频一区二区| 成人信息集中地欧美| 精品一区二区三区电影| 日韩成人在线免费观看| 欧美激情手机在线视频| 国产精品96久久久久久| 国产精品久久久久久久久久尿| 欧美一区二区三区图| 91精品国产免费久久久久久| 欧美成aaa人片免费看| 欧美激情啊啊啊| 日韩女优人人人人射在线视频| 亚洲日韩中文字幕| 亚洲精品www久久久| 91wwwcom在线观看| 亚洲天堂日韩电影| 日韩欧美一区二区三区| 国产999精品久久久| 97视频在线观看成人| 免费91在线视频| 亚洲精品色婷婷福利天堂| 一区二区亚洲精品国产| 成人福利视频在线观看| 亚洲字幕在线观看| 亚洲欧美综合精品久久成人| 亚洲欧美综合精品久久成人| 97精品国产97久久久久久| 亚洲精品日产aⅴ| 精品亚洲男同gayvideo网站| www.欧美精品一二三区| 高清在线视频日韩欧美| 中文日韩在线视频| 一区二区三区黄色| 亚洲福利视频专区| 日韩一区二区三区国产| 91精品国产自产在线| 亚洲图片欧洲图片av| 久久久伊人日本| 国产精品久久久久久久久久三级| 国产精品久久久久久中文字| 国产日韩在线看| 久久99亚洲精品| 亚洲伊人久久大香线蕉av| 久久99久国产精品黄毛片入口| 亚洲欧美日韩中文在线制服| 精品视频偷偷看在线观看| 亚洲欧美另类在线观看| 欧美—级高清免费播放| 国产福利精品视频| 久久久电影免费观看完整版| 成人做爽爽免费视频| 国产女精品视频网站免费| 狠狠躁夜夜躁人人爽天天天天97| 久久精品美女视频网站| 韩国美女主播一区| 草民午夜欧美限制a级福利片| 97成人精品区在线播放| 欧美在线视频网站| 日韩av在线播放资源| 欧美午夜影院在线视频| 国产日产欧美a一级在线| 亚洲国产一区二区三区四区| 在线一区二区日韩| 97成人在线视频| 国产一区二区香蕉| 午夜精品在线观看| 日韩福利在线播放| 欧美成人在线免费| 国产精品免费在线免费| 伊人久久大香线蕉av一区二区| 日韩在线观看免费全| 欧美电影免费观看高清完整| 欧美黄色免费网站| 国产精品白嫩美女在线观看| 日韩av电影在线网| 成人av在线天堂| 欧美成人午夜免费视在线看片| 久久久久久97| 国产91久久婷婷一区二区| 久色乳综合思思在线视频| 萌白酱国产一区二区| 久久久国产视频| 欧美性黄网官网| 91视频国产一区| 国产精品人人做人人爽| 国产精品高清在线| 91成人国产在线观看| 国产区亚洲区欧美区| 亚洲性69xxxbbb| 国产精品jizz在线观看麻豆| 黄色精品一区二区| 精品动漫一区二区三区| 亚洲www在线观看| 久久九九热免费视频| 高清日韩电视剧大全免费播放在线观看| 国产国产精品人在线视| 亚洲视频电影图片偷拍一区| 欧美电影在线免费观看网站| 国产亚洲精品综合一区91| 日韩视频欧美视频| 亚洲国产欧美一区二区三区同亚洲| 美日韩精品免费观看视频| 亚洲在线免费观看| 日韩有码在线电影| 日韩成人中文字幕| 欧美理论在线观看| 国产69精品久久久| 色婷婷av一区二区三区在线观看| 亚洲人成免费电影| 欧美国产日本高清在线| 欧美另类暴力丝袜| 国产美女久久久| 亚洲美女动态图120秒| 精品福利视频导航| 色综合亚洲精品激情狠狠| 亚洲美女喷白浆| 国产欧美亚洲精品| 亚洲风情亚aⅴ在线发布| 成人伊人精品色xxxx视频| 日韩av在线不卡| 一区二区三区高清国产| 欧美日韩一区二区三区在线免费观看| 欧美诱惑福利视频| 福利二区91精品bt7086| 国产精品麻豆va在线播放| 日韩精品中文字幕久久臀| 青青青国产精品一区二区| 亚洲一区二区三区四区在线播放| 欧美黄色片在线观看| 精品国偷自产在线视频| 欧美日产国产成人免费图片| 69国产精品成人在线播放| 国产精品美女久久久久久免费| 久久国产精品久久精品| 在线免费观看羞羞视频一区二区| 午夜剧场成人观在线视频免费观看| 97在线免费视频| 精品国产一区二区三区久久狼黑人| 精品成人av一区| 成人av.网址在线网站| 性欧美暴力猛交69hd| 91视频免费在线|