1. 程式人生 > >使用者行為日誌-js埋點(四)可能存在的問題和總結

使用者行為日誌-js埋點(四)可能存在的問題和總結

記下了點選資訊,如何傳送出去呢?

考察了若干類似的系統,目前比較流行的方式似乎是將要傳送的資訊加到 URL 引數中,請求打點伺服器上的一個非常小的空圖片,這樣,資訊就將記錄在打點伺服器的日誌(比如 apache 日誌)中,之後再用專門的程式從日誌中讀取並分析相關資訊。而且,對於打點伺服器而言,由於只需要提供一個非常小的靜態圖片的訪問,所以一臺普通的伺服器經過適當配置後也可以應對很高的訪問量。

在 JavaScript 中,構造一個圖片請求非常容易,比如:

1 2 varimg=newImage(); img.src="http://xxx.xxx/img.gif?a=1&b=2...."
;

但這兒也有一些需要注意的地方。比如當點選在一個連結上時,頁面很快就會發生跳轉,而如果跳轉之前 img 的請求還沒有成功發出的話,這個請求就會丟失。當然,可以在傳送 img 請求時設法先把頁面跳轉阻塞,img 請求傳送完成後再繼續跳轉,但這種做法侵入性太高,有可能會危害使用者體驗,一般情況下不建議這麼做。

一個減少這種情況發生的方案是,繫結 mousedown 事件而不是 click 事件,在滑鼠按鍵按下之時即傳送 img 請求。我們知道,只有在滑鼠按鍵按下(mousedown)再彈起(mouseup)之後才是點選(click)事件(不考慮部分移動裝置上的瀏覽器),而正常人在滑鼠按下與彈起之間還有幾十至一兩百毫秒的時間差,有這額外的一點時間,雖然很少,但對於提高 img 請求傳送的成功率來說已經很有幫助了。如果再優化一下打點伺服器,讓每次 img 請求響應都能儘可能快,因頁面跳轉發生的記錄丟失就會降低很多(不過理論上還是會有一些)。

還有一個需要注意的是,在某些瀏覽器中,如果頁面過於複雜,會頻繁地觸發瀏覽器的垃圾回收機制,如果剛好 img 又都是些沒有引用的區域性變數,有一些 img 就會被強制回收,請求也就發不出去了。關於這個問題,可以參考這個頁面。比較好的做法是,先將 img 在某個全域性變數中引用,等 img onload 或 onerror 時再將這個引用去掉。

有時也需要考慮,這一段監測使用者滑鼠點選行為的指令碼應該放在頁面的哪個位置。當然,放得越靠前越好,因為如果放得太靠後,並且網頁載入速度不是很快的話,有可能監測指令碼還沒有載入使用者就已經開始點選了,而這些點選記錄顯然也會丟失。但不少頁面需要儘快向用戶呈現首屏內容,對於這些頁面來說,監測需求相對不是第一位的,監測指令碼可以放到後面一些的位置。

另外,監測程式碼如果想寫得儘量通用一些,不指定網頁內容的根元素是哪一個的話(或者指定了根元素,但監測程式碼放在了根元素之前如 head 中),mousedown 事件基本上就要繫結到 document 物件上,這時,需要注意點選到網頁滾動條上的記錄是否要忽略的問題。

如何判斷一個點選是否點在了頁面的滾動條上是個有趣的問題,一個簡單的辦法是判斷當前事件元素的父元素,如果這個元素的 tagName 直接就是“HTML”了,那說明當前點選到了滾動條上,不然的話,父元素應該是一個“DIV”、“BODY”之類的元素。

三、總結