摘要:本文同步自我的博客園如果要在前端呈現大量的數據,一般的策略就是分頁。為了解決這個問題,我們讓數據是顯示一部分,這一部分是可視區域的內容,以及上下各一屏一屏指的是高度所能容納的區域大小的緩存內容。
本文同步自我的博客園:http://hustskyking.cnblogs.com
如果要在前端呈現大量的數據,一般的策略就是分頁。前端要呈現百萬數據,這個需求是很少見的,但是展示千條稍微復雜點的數據,這種需求還是比較常見,只要內存夠,javascript 肯定是吃得消的,計算幾千上萬條數據,js 效率根本不在話下,但是 DOM 的渲染瀏覽器扛不住,CPU 稍微搓點的電腦必然會卡爆。
本文的策略是,顯示三屏數據,其他的移除 DOM。
一、 策略下面是我簡單勾畫的一個草圖,我們把一串數據放到一個容器當中,這串數據的高度(Data List)肯定是比 Container 的高度要高很多的,如果我們一次性把數據都顯示出來,瀏覽器需要花費大量的時間來計算每個 data 的位置,并且依次渲染出來,整個過程中 JS 并沒有花費太多的時間,開銷主要是 DOM 渲染。
/==============> Data List | .... | / +--------------+/ +=======|=====data=====|========+ | +--------------+ | | | data | | | +--------------+ | | | data | | | +--------------+ | ======> Container +=======|=====data=====|========+ +--------------+ | .... | Created By Barret Lee
為了解決這個問題,我們讓數據是顯示一部分,這一部分是 Container 可視區域的內容,以及上下各一屏(一屏指的是 Container 高度所能容納的區域大小)的緩存內容。如果 Container 比較高,也可是只緩存半屏,緩存的原因是,在我們滾動滾動條的時候,js 需要時間來拼湊字符串(或者創建 Node ),這個時候瀏覽器還來不及渲染,所以會出現臨時的空白,這種體驗是相當不好的。
二、Demodemo 在 IE 7、8 有 bug,請讀者自己修復吧~
代碼:
百萬數據前端快速流暢顯示
可以戳這個 demo,或者看這里 https://gist.github.com/barretlee/9744160
三、算法說明 1. 計算 start 和 end 節點| | +=======|==============|========+—— | ↓——+--------------+ | ↑ | delta | | | | ↑——+--------------+ | height | | | | | +--------------+ | ↓ +=======|==============|========+—— | |
Container 可以容納的 Data 數目為 num = height / delta,Container 頂部第一個節點的索引值為
var first = parseInt(Container.scrollTop / delta);
由于我們上下都有留出一屏,所以
var start = Math.max(first - num, 0); var end = Math.min(first + num, len - 1);2. 插入節點
通過上面的計算,從 start 到 end 將節點一次插入到 Container 中,并且將最后一個節點插入到 DOM 中。
// 插入最后一個節點 insert(len - 1); // 插入從 start 到 end 之間的節點 for(var s = start; s <= end; s++){ var child = Container.children[s]; // 如果 Container 中已經有該節點,或者該節點為最后一個節點則跳過 if(!Container.contains(child) && s != len - 1){ insert(s); } }
這里解釋下為什么要插入最后一個節點,插入節點的方式是:
function insert(i){ var div = document.createElement("div"); div.setAttribute("data-index", i); div.style.top = delta * i + "px"; div.appendChild(document.createTextNode(data[i].content)); Container.appendChild(div); }
可以看到我們給插入的節點都加了一個 top 屬性,最后一個節點的 top 是最大的,只有把這個節點插入到 DOM 中,才能讓滾動條拉長,讓人感覺放了很多的數據。
3. 刪除節點為了減少瀏覽器的重排(reflow),我們可以隱藏三屏之外的數據。我這里為了方便,直接給刪除掉了,后續需要再重新插入。
while(child = Container.children[i++]){ var index = child.getAttribute("data-index"); // 這里記得不要把最后一個節點給刪除掉了 if((index > end || index < start) && index != len - 1){ Container.removeChild(child); } }
當 DOM 加載完畢之后,觸發一次 Container.onscroll(),然后整個程序就 OK 了。
四、小結本文主要是敘述大數據加載的一點基本原理,程序可能有 bug,也有很多地方可以優化,了解下算法就行了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87501.html
摘要:優刻得直播云是為互聯網直播應用提供超低延遲流暢高清高并發的整套解決方案。最終降低直播內容盜用風險及成本損失,提升客戶合規性要求。UCloud優刻得直播云(ULive)是為互聯網直播應用提供超低延遲、流暢高清、高并發的整套解決方案。包括實時轉碼,切片存儲,分發加速,內容保護等核心功能。帶給終端用戶流暢的訪問體驗,簡化相關部署運維工作,幫助視頻直播業務快速上線。ULive產品頁面https://...
摘要:背景當下視頻直播如此紅火,打造一個在線直播間涉及到哪些技術呢視頻直播由主播的直播端以及觀眾的觀看端組成。保持心跳斷開重連快速搭建在線直播間按前文所述,搭建直播間有非常多的細節需要考慮,包括采集推流分發播放體驗優化聊天室性能調優等。 背景 當下視頻直播如此紅火,打造一個在線直播間涉及到哪些技術呢? 視頻直播由主播的直播端以及觀眾的觀看端組成。一個簡單的觀看端最起碼應包含播放器以及聊天室。...
閱讀 3738·2021-09-09 09:33
閱讀 3024·2019-08-30 15:56
閱讀 3017·2019-08-30 15:56
閱讀 3307·2019-08-30 15:55
閱讀 499·2019-08-30 15:53
閱讀 2179·2019-08-30 15:52
閱讀 662·2019-08-28 18:16
閱讀 2391·2019-08-26 13:51