JavaScript利用img實現(xiàn)前端頁面埋點功能
做數(shù)據(jù)分析的時候,可能會遇到一個問題:如何獲取足量的有效數(shù)據(jù)。簡單記錄用戶登錄IP肯定是不能滿足要求的,這個時候就需要我們在前端頁面埋點,也就是數(shù)據(jù)采集點。如何來實現(xiàn)一個前端埋點功能,本文就帶你上手試試。
數(shù)據(jù)類型
首先,我們需要明確埋點需要哪些數(shù)據(jù),這個和具體的業(yè)務需求有關。但是我們設計的時候,還是應該盡量考慮:
- pv:頁面訪問量
- uv:用戶訪問量
- 自定義事件
- 頁面性能加載數(shù)據(jù)
- 報錯信息
埋點數(shù)據(jù)范圍清晰了,那么怎么來實現(xiàn)埋點呢?
技術方案
首先我們不建議使用ajax發(fā)送http的方式將埋點數(shù)據(jù)發(fā)送到服務端,原因主要有兩個:
- 可能存在跨域的風險,例如使用第三方的接口
- 可能存在兼容性問題,例如使用fetch來發(fā)送請求就不兼容IE
其他原因也有,但不是主要的。這里,我們建議使用<img>或者<script>來實現(xiàn)埋點數(shù)據(jù)的發(fā)送,這兩個屬于原生的HTML屬性,兼容性比ajax要好很多,而且支持跨域。img和script如果要細分的話,還是有差異的,感興趣的朋友可以移步:詳解JavaScript發(fā)送埋點請求的兩種方式,本文將選擇img來實現(xiàn)埋點。
如何設計
在寫代碼前,可以先設計出代碼大概的結構,這樣在寫的時候才會思路清晰。在埋點數(shù)據(jù)中,性能分析和錯誤監(jiān)聽可能會復雜一點。性能分析可以使用performance.timing

performance的每一個屬性的作用節(jié)點可參考下圖:

錯誤監(jiān)聽可參考文章:如何監(jiān)聽Vue項目報錯的4種方式
完整代碼
class StatisticsSDK {
constructor() {
this.initPerformance(); // 性能分析
this.initError(); // 錯誤監(jiān)聽
}
// 初始化性能分析
initPerformance() {
const url = 'xxx';
this.send(url, performance.timing)
}
// 初始化錯誤監(jiān)聽
initError() {
window.addEventListener('error', event => {
const {error, lineno, colno} = event;
this.error(error, {lineno, colno})
})
// Promise 未catch的錯誤
window.addEventListener('unhandledrejection', event => {
this.error(new Error(event.reason), {type: 'unhandledrejection'})
})
}
// 發(fā)送埋點數(shù)據(jù),作為公共方法被調用
send(url, params = {}) {
params.id = Date.now(); // 當前時間戳
const arr = [];
for (let key in params) {
arr.push(`${key}=${params[key]}`);
}
const newUrl = `${url}?${arr.join('&')}`; // 參數(shù)拼接在請求地址上
// 使用img發(fā)送埋點數(shù)據(jù)
// const img = new Image();
// img.src = newUrl;
const img = document.createElement('img');
img.src = newUrl;
}
// 頁面訪問量
pv() {
const url = 'xxxx'
// 調用send發(fā)送
this.send(url, {key: 'pv', value: location.href})
}
// 自定義事件
event(key, value) {
const url = 'xxxx'; // 服務端地址
// 調用send發(fā)送
this.send(url, {key, value})
}
// 未捕獲的錯誤,或者用戶自行發(fā)送錯誤埋點數(shù)據(jù)時
error(error, info = {}) {
const url = 'xxx';
const {message, stack} = error;
this.send(url, {message, stack, ...info})
}
}
const s = new StatisticsSDK();總結
本文主要使用img來實現(xiàn)埋點數(shù)據(jù)的發(fā)送,考慮了跨域、兼容性,但是也存在比較大的缺陷:如果用戶禁用網(wǎng)頁加載圖片,那么將無法正常發(fā)送埋點數(shù)據(jù)。這種情況下,可以使用script實現(xiàn)本案例,兩者的差異可以參考詳解JavaScript發(fā)送埋點請求的兩種方式,可以使用script實現(xiàn)本案例。
到此這篇關于JavaScript利用img實現(xiàn)前端頁面埋點功能的文章就介紹到這了,更多相關JavaScript埋點功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
js代碼延遲一定時間后執(zhí)行一個函數(shù)的實例
下面小編就為大家?guī)硪黄猨s代碼延遲一定時間后執(zhí)行一個函數(shù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
深入理解JavaScript和TypeScript中的class
class 聲明創(chuàng)建一個基于原型繼承的具有給定名稱的新類,下面這篇文章主要給大家介紹了關于JavaScript和TypeScript中class的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2018-04-04
JS實現(xiàn)瀏覽器狀態(tài)欄文字從右向左彈出效果代碼
這篇文章主要介紹了JS實現(xiàn)瀏覽器狀態(tài)欄文字從右向左彈出效果,涉及JavaScript結合時間函數(shù)遍歷字符串及動態(tài)改變狀態(tài)欄顯示效果的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
javascript?中動畫制作方法?animate()屬性
這篇文章主要介紹了javascript?中動畫制作方法?animate()屬性,animate是所有dom元素都有的方法,可以用來最做過度動畫,關鍵幀動畫,下面文章的相關介紹需要的小伙伴可以參考一下2022-04-04
JavaScript獲取當前頁面url參數(shù)的方法詳解
這篇文章主要為大家詳細介紹了前端獲取當前頁面url參數(shù)的一些常見方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-03-03

