性能優化之節流、防抖

1. 防抖:

  • 由于dom操作極其昂貴,所以嘗試過多的dom操作有可能會將瀏覽器搞崩潰,比如onresize、onscroll這類事件操作;
  • 為了解決這個問題,引出防抖的概念(某些代碼不可以在沒有間斷的情況下連續重復執行);
  • 方案:第一次調用函數創建一個定時器,在指定時間之后執行代碼;在第二次調用時,清除掉前一次的定時器并重新設置一個;
  • 這種方案下,如果第一個定時器已經執行,這個操作就沒意義;如果第一個沒執行,則將其替換為新的定時器;目的是只有在執行函數的請求停止一段時間后才執行;
  • 適用于代碼是周期執行的,但是你不能控制請求執行的速率;
  • 函數防抖讓一個函數只有在你不斷觸發后停下來歇會才開始執行,中間你操作得太快它直接無視。
    // 函數防抖
    function debounce(method, context) {clearTimeout(method.tid);  // mthod是真實要執行的函數,context是執行的作用域(默認window)method.tid = setTimeout(function() {method.call(context)   // 確保方法在適當的環境中執行}, 100);
    }// onscroll時函數防抖
    function scrollFun() {var marginBot = 0;if (document.documentElement) {marginBot = document.documentElement.scrollHeight - (document.documentElement.scrollTop+document.body.scrollTop) - document.documentElement.clientHeight;} else {marginBot = document.body.scrollHeight - document.body.scrollTop - document.body.clientHeight;}if(marginBot <= 0) {// 滾動到底部加載數據操作
        }
    }
    window.onscroll = function() {debounce(scrollFun);
    }

    ?

2. 節流

  • 如果我們不希望每次都是要事件結束后等待延遲時間后執行回調;
  • 我們可以先給定一個時間段duration,過了這個時間段以后我們執行相應的操作;如果沒有過這個時間段,那么就按照函數節流的思路,開關定時器就ok。

function throttle(method, delay, duration){var timer = null, stime = new Date();          // 記錄下開始執行函數的時間return function() {var context = this, args = arguments,ctime = new Date();   // 記錄下當前時間
        clearTimeout(timer);     // 函數節流里的思路// 記錄下的兩個時間相減再與duration進行比較if (ctime - stime >= duration) {method.apply(context, args);stime = ctime;}}
}window.onresize = throttle(method, 50, 100);
// 50ms的間隔內連續觸發的調用,后一個調用會把前一個調用的等待處理掉,但每隔100ms至少執行一次

3. 滾動實例區分下:

? ? normal:滾動會立即觸發事件執行;

? ? throttle: 延遲100ms直到100ms以內沒有事件觸發之后執行,這樣如果一直在操作,有可能一直不會觸發事件發生;

? ? debounce:50ms的間隔內連續觸發的調用,后一個調用會把前一個調用的等待處理掉,但每隔100ms至少執行一次。

4. 滾動到目標節點:

  • 獲取目標節點偏移量var len = $('target').offset().top或document.querySelector('target').offsetTop;
  • 滾動$('body').animate(scrollTop: len)或document.querySelector('body').scrollTop = len;

轉載于:https://www.cnblogs.com/colima/p/7163057.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百萬用戶規模的系統如何擴展

摘要&#xff1a;系統擴展一直是個讓人頭疼的事情&#xff0c;MatinKleppmann通過本文分享了他自己的6條經驗&#xff0c;外加網友的一條建議&#xff0c;這些經驗對于擴展Twitter這樣規模的系統或許幫助不大&#xff0c;但是對于百萬用戶級別的系統擴展就另當別論了。 【編者…

springboot 項目輸出 sql 到控制臺、 SpringBoot 中 Mybatis 打印 sql

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 SpringBoot中Mybatis打印sql 如果使用的是 application.properties 文件&#xff0c;加入如下配置&#xff1a; logging.level.com.ex…

JS流程圖解決方案GoJS

GoJs簡介 一個實現交互類圖表&#xff08;比如流程圖&#xff0c;樹圖&#xff0c;關系圖&#xff0c;力導圖等等&#xff09;的JS庫 GoJS依賴于HTML5&#xff0c;所以請保證您的瀏覽器版本支持HTML5&#xff0c;當然還要加載這個庫。 首先個人建議先下載官方實例的 離線版本【…

VUE.JS 組件化開發實踐

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 前言 公司目前制作一個H5活動&#xff0c;特別是有一定統一結構的活動&#xff0c;都要碼一個重復的輪子。后來接到一個基于模板的活動…

Space Time Varying Color Palette

PDF Space Time Varying Color Palettes from Bo Zhou轉載于:https://www.cnblogs.com/Jedimaster/p/4941857.html

提升開發效率的十個工具

Git 之前也有過不少版本控制的工具。有好的&#xff0c;也有糟糕的。不過它們都或多或少地誤入歧途了。 這時候Git出現了。一旦你用上了這個神奇的工具&#xff0c;很難相像你還會碰到比它更好的了。 還沒用過Git&#xff1f;試一下吧。 Stack Overflow 真的&#xff0c;我沒…

Virtual Villagers 攻略

和大家分享一下這個游戲的攻略心得,希望對大家有幫助~~Puzzle 1 清潔水井&#xff08;難度&#xff1a;簡單&#xff09;將一個擁有Building技能的村民拖到水井上就可以了。Puzzle 2 房屋建設&#xff08;難度&#xff1a;簡單&#xff09;一開始會由一個掌握Building技能的村民…

input 框 去掉下面的提示文字、提示選項

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 我的一個輸入框總是有提示文字&#xff1a; 2. 去掉方法&#xff0c;給 input 加一個屬性&#xff1a; autocomplete"off"…

科學合理的減肥

1、科學安排一日三餐    在正常生理情況下&#xff0c;一般人習慣于一日三餐。人體最大消耗是在一天中的上午。由于胃經過一夜消化早已排空&#xff0c;如果不吃早飯&#xff0c;那么整個上午的活動所消耗的能量完全要靠前一天晚餐提供&#xff0c;這就遠遠不能滿足營養需要。…

解決: VUE 項目中表單提交中文亂碼、接口請求參數中文亂碼

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 表單提交出現亂碼&#xff1a; 接口請求亂碼同于上圖。 2. 解決&#xff1a; 在出現亂碼的內容外面加函數&#xff1a;decodeURI()…

大數據 — Hadoop

HDFS Hadoop 1.0: 3個組件&#xff1a; NamenodeSecondNamenodeDatanodenamenode&#xff08;主節點&#xff0c;master&#xff0c;只有一個&#xff0c;單點故障的風險&#xff09;中間存儲信息&#xff08;元數據&#xff09; 2種映射關系&#xff1a; path -> blockid l…

VUE:兄弟組件間傳參

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、定義一個中間 eventBus.js &#xff0c;只有 2 行代碼&#xff0c;用于傳參&#xff1a; // 此頁面是vue 巴士&#xff0c;用于兄…

C++的歷史

本文由 伯樂在線 - honpey 翻譯自 Albatross。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。C的歷史可以追溯到1979年&#xff0c;當時Bjarne Stroustrup&#xff08;譯者注&#xff1a;C之父&#xff09;正在準備他的博士畢業論文&#xff0c;他有機會使用一種叫做Si…

asp.net ajax的學習第一篇

自己理解的asp.net ajax的核心思想&#xff1a; javascript 調用web service <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />由于工作的原因&#xff0c;要在自己的網頁上使用無刷新技術&#xff0c;增加客戶體驗。開始學習asp…

insertSelective 和 insert 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、selective的意思是&#xff1a;選擇性。 2、insertSelective--選擇性保存數據&#xff1b; 比如User里面有三個字段:id&#xff0c;n…

病從口入 這樣吃小心癌癥找上門

腫瘤專家估計&#xff0c;大約有35%的致癌物質是經過飲食&#xff0c;30%是經過吸煙侵入體內的。僅此兩項已經占了致癌因素入侵人體的一半以上了。所以說&#xff0c;預防腫瘤&#xff0c;飲食首當其沖&#xff0c;第一步就要從入口的食物談起。 食管癌&#xff1a;腌制的咸…

VUE插件總結

UI組件 element - 餓了么出品的Vue2的web UI工具套件Vux - 基于Vue和WeUI的組件庫mint-ui - Vue 2的移動UI元素iview - 基于 Vuejs 的開源 UI 組件庫Keen-UI - 輕量級的基本UI組件合集vue-material - 通過Vue Material和Vue 2建立精美的app應用muse-ui - 三端樣式一致的響應式 …

解決:No goals have been specified for this build. You must specify a valid lifecycle phase or a goal i

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 執行打包命令報錯&#xff1a; No goals have been specified for this build. You must specify a valid lifecycle phase or a goa…

十個好習慣幫你理財省大錢

理財和收入高低其實是沒有關系的&#xff0c;僅和生活習慣相關。有了好的理財方法&#xff0c;也可以攢下自己的錢&#xff0c;達到財務自由的境界。下面是一些理財的技巧? 1、定時積極的存款 怎樣開源節流是理財的第一步。增加收入來源&#xff0c;算好該存的錢&#xff0…

生成隨機碼,保存隨機文件.

PrivateFunction GetRandomizeNo()Function GetRandomizeNo() As Integer 功能說明:生成隨機驗證碼 Dim RandomizeNo As Integer Randomize() RandomizeNo 9999 * Rnd() 1000 If (RandomizeNo).ToString.Length > 5 Then R…