成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

為什么要避免使用 "document.write()"

xiangzhihong / 2551人閱讀

摘要:每當(dāng)解析器遇到腳本時(shí),它必須停止并執(zhí)行它,然后才能繼續(xù)解析。如果腳本動(dòng)態(tài)地注入另一個(gè)腳本,解析器將被迫等待更長時(shí)間才能下載資源,這可能會(huì)導(dǎo)致一個(gè)或多個(gè)網(wǎng)絡(luò)往返并延遲首次渲染頁面的時(shí)間,導(dǎo)致頁面無法加載或花費(fèi)的時(shí)間長于用戶放棄。

本文是技術(shù)圈 google 瀏覽器前端新特性播報(bào)的推送,歡迎大家加入

為什么要避免使用 document.write()

最近我們發(fā)現(xiàn)如果我們在頁面中使用了document.wirte(),那么在 chrome 的開發(fā)者控制臺(tái)會(huì)出現(xiàn)下面的警告信息

(index):34 A Parser-blocking, cross-origin script, 
https://paul.kinlan.me/ad-inject.js, is invoked via document.write(). 
This may be blocked by the browser if the device has poor network connectivity.

為啥要做這個(gè)提示呢,對(duì)于在2G,3G 或者是慢 wifi 環(huán)境下面,使用document.write()動(dòng)態(tài)加載資源會(huì)讓頁面的展現(xiàn)慢10秒以上,瀏覽器可以呈現(xiàn)頁面之前,必須通過解析HTML標(biāo)記來構(gòu)建DOM樹。每當(dāng)解析器遇到腳本時(shí),它必須停止并執(zhí)行它,然后才能繼續(xù)解析HTML。如果腳本動(dòng)態(tài)地注入另一個(gè)腳本,解析器將被迫等待更長時(shí)間才能下載資源,這可能會(huì)導(dǎo)致一個(gè)或多個(gè)網(wǎng)絡(luò)往返并延遲首次渲染頁面的時(shí)間,導(dǎo)致頁面無法加載或花費(fèi)的時(shí)間長于用戶放棄。根據(jù)Chrome中的設(shè)備,我們了解到,通過第三方腳本插入的document.write()頁面的速度通常比2G的其他頁面載入速度慢兩倍。

去除document.write的效果

chrome 開發(fā)者收集了28天chrome瀏覽器使用者的2G瀏覽數(shù)據(jù),從中發(fā)現(xiàn)7.6%的2G加載頁面中都包含了通過document.write()寫入頁面的跨網(wǎng)站,并且會(huì)中斷瀏覽器解析的腳本。通過把這些加載腳本進(jìn)行攔截加載,我們看到了以下的改進(jìn):

頁面加載到達(dá)first contentful paint(視覺上讓用戶感覺正在加載的狀態(tài))t的狀態(tài)的數(shù)量增加10%,達(dá)到完全解析狀態(tài)的頁面數(shù)量增加25%,減少10%由于需要刷新頁面帶來的用戶失望

到達(dá)first contentful paint的時(shí)間減少了21%(加快速度大于1秒)

解析頁面所需的時(shí)間減少了38%,差不多加快了6秒,大大減少了向用戶展示內(nèi)容的時(shí)間

chrome 瀏覽器對(duì)于document.write的策略

針對(duì)以上的測試數(shù)據(jù),chrome 從 55版本開始,chrome 瀏覽器對(duì)用戶使用的document.write()進(jìn)行干預(yù),如果符合以下所有的情況,頁面

?

更加全面的告警

上面兩種方式結(jié)合之后可以對(duì)影響的用戶量有一個(gè)初步的判斷,如果要做精確的判斷,可以檢查 HTTP 頭部:
當(dāng)插入的腳本document.write被阻止時(shí),Chrome會(huì)將以下標(biāo)頭發(fā)送到所請(qǐng)求的資源:

Intervention: ;

當(dāng)document.write發(fā)現(xiàn)插入腳本時(shí),可能會(huì)在不同情況下被阻止,Chrome可能會(huì)發(fā)送:

Intervention: ; level="warning"

干預(yù)頭將作為腳本的GET請(qǐng)求的一部分發(fā)送(在實(shí)際干預(yù)的情況下異步)。

替換方案

由于document.write會(huì)減慢頁面的加載,可以考慮使用appendChild等 api 將元素插入頁面中,不過這兩者有以下的區(qū)別

document.write的參數(shù)是一個(gè) html 字符串,appendChild是一個(gè)Node對(duì)象

如果有多個(gè)document.write寫入 script 標(biāo)簽,標(biāo)簽與標(biāo)簽之間的加載是同步的,也就是說,標(biāo)簽的加載順序會(huì)和document.write的執(zhí)行順序相同;而使用appendChild插入多個(gè)sciprt標(biāo)簽時(shí),標(biāo)簽加載的順序是不確定的,先加載完成的先執(zhí)行,因此通過appendChild插入script標(biāo)簽時(shí),要注意是否需要對(duì)加載的順序進(jìn)行控制,可以通過script.onload進(jìn)行順序回調(diào)插入

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106999.html

相關(guān)文章

  • Html/Css/Jquery知識(shí)點(diǎn)集錦

    摘要:首先,巧妙的使用這一標(biāo)記,將游覽器從所有情況中分離出來。接著,再次使用將和分離開來,這樣已經(jīng)獨(dú)立識(shí)別。元素不能用作語義用途以外的其他目的。Html1、Html5有哪些新特性,移除了哪些元素?如何處理HTML5新標(biāo)簽的瀏覽器兼容問題?如何區(qū)別HTML和HTML5?HTML5 現(xiàn)在已經(jīng)不是 SGML 的子集,主要是關(guān)于圖像,位置,存儲(chǔ),多任務(wù)等功能的增加。拖拽釋放(Drag and drop) ...

    shiweifu 評(píng)論0 收藏0
  • 用CSS3 transition屬性實(shí)現(xiàn)淡入淡出輪播圖

    摘要:首先,巧妙的使用這一標(biāo)記,將游覽器從所有情況中分離出來。元素不能用作語義用途以外的其他目的??瞻锥温湓夭⒎怯糜谔小.?dāng)瀏覽器支持時(shí),它們會(huì)自動(dòng)地呈現(xiàn)出來并發(fā)揮作用。Html1、Html5有哪些新特性,移除了哪些元素?如何處理HTML5新標(biāo)簽的瀏覽器兼容問題?如何區(qū)別HTML和HTML5?HTML5 現(xiàn)在已經(jīng)不是 SGML 的子集,主要是關(guān)于圖像,位置,存儲(chǔ),多任務(wù)等功能的增加。拖拽釋放(D...

    姘存按 評(píng)論0 收藏0
  • JavaScript Puzzlers! 解惑(一):什么 ["1", &qu

    摘要:第一題為的返回值。返回值其中的每個(gè)元素均為關(guān)聯(lián)的原始數(shù)組元素的回調(diào)函數(shù)返回值的新數(shù)組。修改數(shù)組對(duì)象數(shù)組對(duì)象可由回調(diào)函數(shù)修改。方法啟動(dòng)后的條件元素是否傳遞給回調(diào)函數(shù)在數(shù)組的原始長度之外添加元素。 JavaScript Puzzlers! 被稱為 javascript 界的專業(yè)八級(jí)測驗(yàn),感興趣的 jser 可以去試試。 我試了一下, 36 道題只做對(duì)了 19 道, 算下來正確率為 53%,...

    k00baa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<