簡體   English   中英

使用JavaScript將HTML內容附加到div的最快方法

[英]Fastest way to append HTML content to a div using JavaScript

我有一個HTML頁面,它使用AJAX從服務器檢索消息。 我將這些消息附加到a,因為它們是通過設置innerHTML屬性來檢索的。

這種方法工作正常,但文本量很小,但隨着它的增長,它會使Firefox使用所有可用的CPU,並且消息會慢下來爬行。 我不能使用文本框,因為我希望某些文本以彩色突出顯示或使用其他HTML格式。 有沒有更快的方法來做這個不會導致瀏覽器鎖定?

我也試過使用jQuery,但是從我讀過的設置開始.innerHTML比它的.html()函數更快,而且在我自己的經驗中似乎也是如此。

編輯:感知性能不是問題 - 消息在返回時已經被寫入(使用Comet)。 問題是瀏覽器開始鎖定。 內容的數量並不是那么大--400-500行似乎就這么做了。 該div中沒有​​div。 整個事情都在一張桌子里,但希望這不重要。

您明確表示您附加意味着您將其附加到同一父級。 你做的事情是這樣的:

myElem.innerHTML += newMessage;

要么

myElem.innerHTML = myElem.innerHTML + newMessage;

因為這是非常低效的(參見這個基准: http//jsben.ch/#/Nly0s )。 它會導致瀏覽器首先執行非常大的字符串連接(這永遠不會好),但更糟糕的是,必須重新解析插入並呈現先前附加的所有內容。 比這更好的是創建一個新的div對象,使用innerHTML放入消息然后調用dom方法appendChild來插入新創建的div與消息。 然后瀏覽器只需插入並呈現新消息。

你可以分解你的文字並將其附加成塊嗎? 將文本的一部分包裝成div標簽,然后將它們分開,將較小的div添加到頁面中。

雖然這不會加快整個過程,但感知性能可能會更好,因為用戶更快地看到第一個元素,而其余元素稍后加載,可能是在可見頁面之外。

此外,您可能應該重新考慮發送和嵌入頁面的數據量。 如果瀏覽器很慢,那么數據量必然會很大 - 這對用戶來說真的有意義嗎? 或者分頁界面(或其他增量加載機制)是否更有意義?

您可以使用insertAdjacentHTML("beforeend", "<HTML to append>")

是一篇關於它的性能的文章,它的基准測試顯示insertAdjacentHTML.innerHTML +=操作快150倍。 在撰寫文章之后的幾年里,瀏覽器可能已經對此進行了優化。

與Rick的答案一致,為什么不將信息作為JSON傳回,所以你可以使用setTimeout來完成它,並顯示2-5個消息,然后調用setTimeout,然后它將執行下一批,直到JSON數組已被處理。

你應該使用innerHTML,所以你的javascript可以動態地創建並添加到div,但是,我只會為第一批做到這一點,以便快速完成所有工作。

之后,我將繼續克隆第一批並更改每個其他消息的innerhtml以及其他信息,並將其添加到dom樹中。

克隆將比創建新元素更快,如果在處理時有任何其他更改dom樹,則不會出現問題。

“整個事情都在一張桌子里,但希望這不重要。”

實際上它很重要。 由於表的性質,在計算列和行中所有單元格的寬度和高度之前,通常不能渲染單元格。 table-layout:fixed以基於第一行鎖定單元格寬度和高度為代價來克服這個問題。

簡而言之,最好不要在表格中包裝,或者如果數據確實是表格式,請嘗試固定布局渲染。

http://www.w3schools.com/Css/pr_tab_table-layout.asp

我寫了類似的東西,這很有挑戰性。 首先,您需要隔離問題。

  1. 是渲染代碼嗎? 嘗試評論所有渲染,看看AJAX本身是否會降低Firefox的速度。 如果是這樣,請嘗試不同的渲染方法,如上所述。

  2. 是網絡嗎? 嘗試注釋掉Ajax,並定期運行innerHTML設置。 如果這是問題,您可能需要嘗試不同的時序設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM