DOM統(tǒng)計(jì)時(shí)長(zhǎng)

?xml version="1.0" encoding="UTF-8"?

一灿里、判斷DOM活躍時(shí)長(zhǎng)需監(jiān)聽(tīng)到的情況

1.刪除添加DOM

2.樣式改變

3.單頁(yè)應(yīng)用頁(yè)面跳轉(zhuǎn)

4.頁(yè)面變?yōu)榉腔钴S狀態(tài)

5.頁(yè)面滾動(dòng)DOM是否在停留可視區(qū)內(nèi)

二盹靴、實(shí)現(xiàn)方式

?xml version="1.0" encoding="UTF-8"?

三個(gè)監(jiān)聽(tīng)listener事件&兩個(gè)setTimeout定時(shí)器實(shí)現(xiàn)監(jiān)聽(tīng)DOM活動(dòng)時(shí)長(zhǎng)的功能

domCollectionListener:收集需要監(jiān)聽(tīng)的dom/DOM元素的刪減

Mutation Observer(變動(dòng)觀察器)是監(jiān)視DOM變動(dòng)的接口悬而。當(dāng)DOM對(duì)象樹(shù)【1】發(fā)生任何變動(dòng)時(shí)鉴腻,Mutation Observer會(huì)得到通知。

解析器輸出的樹(shù)是由DOM元素和屬性節(jié)點(diǎn)組成的

要概念上淮逻,它很接近事件爽锥。可以理解為浪默,當(dāng)DOM發(fā)生變動(dòng)會(huì)觸發(fā)Mutation Observer事件牡直。但是缀匕,它與事件有一個(gè)本質(zhì)不同:事件是同步觸發(fā),也就是說(shuō)DOM發(fā)生變動(dòng)立刻會(huì)觸發(fā)相應(yīng)的事件碰逸;Mutation Observer則是異步觸發(fā)乡小,DOM發(fā)生變動(dòng)以后,并不會(huì)馬上觸發(fā)饵史,而是要等到當(dāng)前所有DOM操作都結(jié)束后才觸發(fā)满钟。

Mutation Observer有以下特點(diǎn):

它等待所有腳本任務(wù)完成后,才會(huì)運(yùn)行胳喷,即采用異步方式

它把DOM變動(dòng)記錄封裝成一個(gè)數(shù)組進(jìn)行處理湃番,而不是一條條地個(gè)別處理DOM變動(dòng)。

它即可以觀察發(fā)生在DOM節(jié)點(diǎn)的所有變動(dòng)吭露,也可以觀察某一類變動(dòng) — 自定義

MutationObserver所觀察的DOM變動(dòng)(即上面代碼的option對(duì)象)吠撮,包含以下類型:

childList:子元素的變動(dòng)

attributes:屬性的變動(dòng)

characterData:節(jié)點(diǎn)內(nèi)容或節(jié)點(diǎn)文本的變動(dòng)

subtree:所有下屬節(jié)點(diǎn)(包括子節(jié)點(diǎn)和子節(jié)點(diǎn)的子節(jié)點(diǎn))的變動(dòng)

varobserver =newMutationObserver(callback);

observe.observe(target,{{

????????attributes: true,

????????childList: true,

????????characterData: true,

????????subtree: true,

}?});

解決:需要監(jiān)聽(tīng)DOM元素

initDisplay/inDisplayListener監(jiān)聽(tīng)屬性的變動(dòng)

除了變動(dòng)類型,option對(duì)象還可以設(shè)定以下屬性:

attributeOldValue:值為true讲竿,則表示需要記錄變動(dòng)前的屬性值泥兰。

characterDataOldValue:值為true,則表示需要記錄變動(dòng)前的數(shù)據(jù)值题禀。

attributesFilter:值為一個(gè)數(shù)組鞋诗,表示需要觀察的特定屬性(比如['class', 'str'])。

varobserver =newMutationObserver(callback);

observe.observe(target,{?

?? ?attributeFilter: ['class', 'style'],

?? ?attributeOldValue: true

});

exportconstunDisplay:Object= {

?? ?display:['none'],

?? ?visibility:['collapse','hidden'],

?? ?opacity:[0,'0'],

};

inviewportListener:監(jiān)聽(tīng)DOM元素是否在viewport中

監(jiān)聽(tīng)到scroll事件后迈嘹,調(diào)用目標(biāo)元素(綠色方塊)的getBoundingClientRect()方法削彬,得到它對(duì)應(yīng)于視口左上角的坐標(biāo),再判斷是否在視口之內(nèi)秀仲。這種方法的缺點(diǎn)是融痛,由于scroll事件密集發(fā)生,計(jì)算量很大神僵,容易造成性能問(wèn)題酌心。

IntersectionObserver瀏覽器原生提供的構(gòu)造函數(shù),接受兩個(gè)參數(shù):callback是可見(jiàn)性變化時(shí)的回調(diào)函數(shù)callback一般會(huì)觸發(fā)兩次挑豌。一次是目標(biāo)元素剛剛進(jìn)入視口(開(kāi)始可見(jiàn))安券,另一次是完全離開(kāi)視口(開(kāi)始不可見(jiàn))構(gòu)造函數(shù)的返回值是一個(gè)觀察器實(shí)例。實(shí)例的observe方法可以指定觀察哪個(gè) DOM 節(jié)點(diǎn)

callback函數(shù)的參數(shù)(entries)是一個(gè)數(shù)組氓英,每個(gè)成員都是一個(gè)IntersectionObserverEntry對(duì)象侯勉。舉例來(lái)說(shuō),如果同時(shí)有兩個(gè)被觀察的對(duì)象的可見(jiàn)性發(fā)生變化铝阐,entries數(shù)組就會(huì)有兩個(gè)成員址貌。

var io = new IntersectionObserver(callback, option);

io.observe(document.getElementById('example'));

IntersectionObserverEntry

{

??time: 3893.92,

??rootBounds: ClientRect {

????bottom: 920,

????height: 1024,

????left: 0,

????right: 1024,

????top: 0,

????width: 920

??},

??boundingClientRect: ClientRect {

?????// ...

??},

??intersectionRect: ClientRect {

????// ...

??},

??intersectionRatio: 0.54,

??target: element

}

time:可見(jiàn)性發(fā)生變化的時(shí)間,是一個(gè)高精度時(shí)間戳,單位為毫秒

target:被觀察的目標(biāo)元素练对,是一個(gè) DOM 節(jié)點(diǎn)對(duì)象

rootBounds:根元素的矩形區(qū)域的信息遍蟋,getBoundingClientRect()方法的返回值,如果沒(méi)有根元素(即直接相對(duì)于視口滾動(dòng))螟凭,則返回null

boundingClientRect:目標(biāo)元素的矩形區(qū)域的信息

intersectionRect:目標(biāo)元素與視口(或根元素)的交叉區(qū)域的信息

intersectionRatio:目標(biāo)元素的可見(jiàn)比例虚青,即intersectionRect占boundingClientRect的比例,完全可見(jiàn)時(shí)為1螺男,完全不可見(jiàn)時(shí)小于等于0

注意:

IntersectionObserver API 是異步的棒厘,不隨著目標(biāo)元素的滾動(dòng)同步觸發(fā)。

規(guī)格寫(xiě)明下隧,IntersectionObserver的實(shí)現(xiàn)奢人,應(yīng)該采用requestIdleCallback(),即只有線程空閑下來(lái)淆院,才會(huì)執(zhí)行觀察器何乎。這意味著,這個(gè)觀察器的優(yōu)先級(jí)非常低土辩,只在其他任務(wù)執(zhí)行完宪赶,瀏覽器有了空閑才會(huì)執(zhí)行。

3.監(jiān)聽(tīng)頁(yè)面的可見(jiàn)性

對(duì)history的popstate事件的監(jiān)聽(tīng)可感知到瀏覽器操作導(dǎo)致的路由變化脯燃,如前進(jìn)、后退 對(duì)pushState蒙保、replaceState方法的增強(qiáng)改寫(xiě)來(lái)感知單頁(yè)面應(yīng)用切換路由的操作

第一個(gè)定時(shí)器

設(shè)置最長(zhǎng)的上報(bào)時(shí)間間隔辕棚,每次發(fā)生變動(dòng)時(shí)重新計(jì)時(shí),達(dá)到最大時(shí)間間隔自動(dòng)發(fā)送&重新計(jì)時(shí)

第二個(gè)定時(shí)器

曝光時(shí)長(zhǎng)閾值(單位:秒)邓厕,當(dāng)次時(shí)間內(nèi)沒(méi)有活動(dòng)事件則累計(jì)曝光時(shí)長(zhǎng)逝嚎,進(jìn)入非曝光狀態(tài),默認(rèn)30秒

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末详恼,一起剝皮案震驚了整個(gè)濱河市补君,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昧互,老刑警劉巖挽铁,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異敞掘,居然都是意外死亡叽掘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)玖雁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)更扁,“玉大人,你說(shuō)我怎么就攤上這事∨ň担” “怎么了溃列?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)膛薛。 經(jīng)常有香客問(wèn)我听隐,道長(zhǎng),這世上最難降的妖魔是什么相叁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任遵绰,我火速辦了婚禮,結(jié)果婚禮上增淹,老公的妹妹穿的比我還像新娘椿访。我一直安慰自己,他們只是感情好虑润,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布成玫。 她就那樣靜靜地躺著,像睡著了一般拳喻。 火紅的嫁衣襯著肌膚如雪哭当。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天冗澈,我揣著相機(jī)與錄音钦勘,去河邊找鬼。 笑死亚亲,一個(gè)胖子當(dāng)著我的面吹牛彻采,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捌归,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肛响,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了惜索?” 一聲冷哼從身側(cè)響起特笋,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巾兆,沒(méi)想到半個(gè)月后猎物,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡角塑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年霸奕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吉拳。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡质帅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煤惩,我是刑警寧澤嫉嘀,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站魄揉,受9級(jí)特大地震影響剪侮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洛退,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一瓣俯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兵怯,春花似錦彩匕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至袜漩,卻和暖如春绪爸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宙攻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工奠货, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人座掘。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓递惋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雹顺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)頁(yè)開(kāi)發(fā)時(shí)廊遍,常常需要了解某個(gè)元素是否進(jìn)入了"視口"(viewport)嬉愧,即用戶能不能看到它。 上圖的綠色方塊不斷滾...
    硅谷干貨閱讀 600評(píng)論 0 3
  • 網(wǎng)頁(yè)開(kāi)發(fā)時(shí),常常需要了解某個(gè)元素是否進(jìn)入了"視口"(viewport)卵迂,即用戶能不能看到它 上圖的綠色方塊不斷滾動(dòng)...
    _嗯_(tái)哼_(dá)閱讀 1,773評(píng)論 0 0
  • MutationObserver MutationObserver 是一個(gè)可以監(jiān)聽(tīng)DOM結(jié)構(gòu)變化的接口裕便。 Muta...
    hellomyshadow閱讀 276評(píng)論 0 0
  • 方便起見(jiàn)不分parameter[形參,出現(xiàn)在函數(shù)定義中]和argument[實(shí)參见咒,其值為傳入函數(shù)的值]偿衰,一律當(dāng)作a...
    東月三二閱讀 388評(píng)論 0 0
  • 背景 為了配合項(xiàng)目的一個(gè)前端曝光埋點(diǎn)功能,涉及到列表滾動(dòng),動(dòng)態(tài)上報(bào)曝光行的數(shù)據(jù)下翎,進(jìn)行了一個(gè)技術(shù)調(diào)研缤言。在前端開(kāi)發(fā)工作...
    zx_lau閱讀 916評(píng)論 0 0