1. SDK 初始化參數

如果使用自動程式碼產生,一般情況下無需手動修改參數。

參數預設值含義備考
sdk_urlsensorsdata.min.js 檔案的網址。請從 GitHub 取得並且放在你們自己網站目錄下。
namesa

SDK 使用的一個預設的全域變數,如定義成 sensors 的話,後面可以使用 sensors.track() 用來跟蹤資訊。為了防止變數名重複,你可以修改成其他名稱比如 sensorsdata 等 。


server_url數據接收網址。 
heatmap_url

heatmap.min.js 文件的網址。神策分析中點擊分析及觸達分析功能程式碼,程式碼產生工具會自動產生。如果神策程式碼中 sensorsdata.min.js 版本是 1.13.1 及以前版本,這個參數須設定,高於此版本不需要設定。

請從 GitHub 取得並且放在你們自己網站目錄下。

web_url

神策分析後台網址,神策分析中點擊分析及觸達分析功能會用到此網址,程式碼產生工具會自動產生。如果神策後台版本及 sensorsdata.min.js 均是 1.10 及以上版本,這個參數不需要設定。


heatmap

點擊圖設定。預設設定表示不自動採集元素點擊事件和頁面停留事件,設定成 {} 表示開啟 $WebClick 採集 和 $WebStay 自動採集,預設 $WebClick 只採集 a,button,input ,textarea 四個 dom 元素的點擊事件。


cross_subdomaintrue

設定成 true 後,表示在根網域下設定 cookie 。也就是如果你有 zhidao.baidu.comtieba.baidu.com 兩個網域,且有一個用戶在同一個瀏覽器都登入過這兩個網域的話,我們會認為這個用戶是一個用戶。如果設定成 false 的話,會認為是兩個用戶。


show_logtrue設定 true 後會在網頁控制台打 logger,會顯示傳送的數據,設定 false 表示不顯示。
use_client_timefalse用戶端系統時間的不準確,會導致發生這個事件的時間有誤,所以這裡預設為 false ,表示不使用用戶端時間,使用伺服器端時間,如果設定為 true 表示使用用戶端系統時間。如果你在屬性中加入 {$time: new Date()} ,注意這裡必須是 Date 型別,那麼這條數據就會使用你在屬性中傳入的這個時間。
source_channel預設取得的來源是根據 utm_source 等 ga 標準來的,如果使用百度統計的 hmsr 等參數,需在此欄位中加入對應參數,參數必須是陣列,例如:['hmsr']。使用網頁通用管道增加自定義屬性時,需將對應的自定義屬性名增加到此欄位。
source_type
自定義搜尋引擎流量,社交流量,搜尋關鍵詞。

詳細設定参考

max_string_length500通用字串最大長度,超過部分會被截取丟掉(由於超過 7000 的字串會導致 url 超長傳不出去,所以限制長度)。
send_typeimage表示使用圖片 get 請求方式傳數據,( 神策系統 1.10 版本以後 ) 可選使用 'ajax' 和 'beacon' 方式傳送數據,這兩種預設都是 post 方式, beacon 方式相容性較差。
callback_timeout200 ,單位毫秒表示回呼函數超時時間,如果數據傳送超過 callback_timeout 還未回傳結果,會強制執行回呼函數。

SDK 版本 1.11.6 以後支援

queue_timeout300 ,單位毫秒表示佇列傳送超時時間,如果數據傳送時間超過 queue_timeout 還未回傳結果,會強制傳送下一條數據。

SDK 版本 1.11.6 以後支援

datasend_timeout3000 ,單位毫秒表示數據傳送超時時間,如果數據傳送超過 datasend_timeout 還未回傳結果,會強制取消該請求。

SDK 版本 1.11.6 以後支援

preset_properties
是否開啟 $latest 最近一次相關事件屬性採集以及設定 $url 作為公共屬性,預設值為一個對象。

SDK 版本 1.14.10 及以後支援
詳細設定参考

is_track_single_pagefalse表示是否開啟單頁面自動採集 $pageview 功能,SDK 會在 url 改變之後自動採集 web 頁面瀏覽事件 $pageview。

SDK 版本 1.12.18 以後支援

batch_sendfalse表示不開啟批量傳送,設定為 true 表示開啟批量採集。SDK 版本 1.14.7 以後支援
詳細設定参考


2. 取得預設屬性

版本要求

Web JS SDK 1.9.13  及後版本

此方法可取得,頁面網址,頁面標題,參照位址,SDK 類型及版本,螢幕寬高,最近一次的相關屬性,如果伺服器端需要使用這些屬性需要客戶自己傳輸,且這些屬性不包括需要後端解析的 ip 及 UA 等屬性。

sensors.quick('isReady',function(){
	sensors.getPresetProperties();
});
JS

3. 取得匿名 ID

3.1. 前端方式取得匿名 ID

增加了取得匿名ID的方法 sensors.quick('getAnonymousID'); 回傳匿名 id (SDK 版本 1.13.4 及以上支援),呼叫這個方法時,可能 Web JS SDK 還未初始化成功,建議將此方法放在下面程式碼中。

sensors.quick('isReady',function(){
	sensors.quick('getAnonymousID');
});
JS

3.2. 後端方式取得匿名 ID

可以在 Cookie 裡面找到 key 為 sensorsdata2015jssdkcross 的 value 值然後進行 decodeURIComponent 解析,最後透過 JSON.parse 方法得到一個物件,物件裡面的 Distinct ID 即為用戶所需要的 (注意,如果前端已經呼叫過 login 方法,那麼此時 Distinct ID 為真實 id,所以需要取得 first_id 欄位)。

4. 修改匿名 ID

預設情况下,是把 cookie_id 作為 Distinct ID 的。如果你能取到其他匿名 id(比如設備 id,或者你们自己產生的 cookie_id),可以用 sensors.identify(id, true) 來改變當前的 Distinct ID :

sensors.identify(id, true): 會把這個 id 保存在瀏覽器的 cookie 中,該網域名下的頁面都會預設使用這個 id。
JS

5. 設定事件公共屬性

5.1. 設定事件靜態公共屬性

對於所有事件都需要增加的屬性,可在初始化 SDK 後,呼叫 registerPage() 將屬性註冊為公共屬性:

<script>
// 註冊公共屬性
sensors.registerPage({
	current_url: location.href,
	referrer: document.referrer
});
</script>
JS

5.2. 設定事件動態公共屬性

版本要求

Web JS SDK 1.14.15 及以後版本

當設定動態公共屬性的時候,注意使用函數型別作為屬性值,函數的回傳值應當是神策支援的型別,請參考數據格式,否則會被過濾掉。
另外您如果使用了 ES6 語法如箭頭函數等,則需要使用編譯工具編譯後執行。

var i=0
sensors.registerPage({
  index: function() {
    return ++i; // 回傳數字
  },
  istrue: function() {
    return i<10 ? true : false; // 回傳bool
  },
  isEmptyString: function() {
    return ""; // 回傳字串
  },
  isDate: function() {
    return new Date('December 17, 1995 03:24:00'); // 回傳日期型別
  },
  isArrayOfStr: function() {
    return ["1","2","3"] // 回傳元素是字串的陣列
  }
})


另外如果函數在異步回呼中回傳值,這種情況也是會被過濾掉。

sensors.registerPage({
    num:function(){
        setTimeout(()=>{
            return 100
        },500)
    }
})


6. 設定用戶屬性

6.1. setProfile(properties[, callback])

直接設定用戶的屬性,如果存在則覆蓋。

properties:object,必選。
callback:function,可選。

sensors.setProfile({email:'xxx@xx'});
JS

6.2. setOnceProfile(properties[, callback])

如果不存在則設定,存在就不設定。

properties:object,必選。
callback:function,可選。

sensors.setOnceProfile({email:'xxx@xx'});
JS

6.3. appendProfile(properties[, callback])

給陣列屬性增加值。透過setProfile只能改變屬性的值。如果這個屬性是陣列型別的,你不想完全改變這個值,只想做增加操作可以使用此方法。

properties:object,必選。
callback:function,可選。

//給 category 增加兩個值
sensors.appendProfile({catrgory: ['玉米','白菜']});
//給 category 增加一個值
sensors.appendProfile({catrgory: '玉米'});
JS

6.4. incrementProfile(properties[, callback])

對當前用戶的屬性做遞增或者遞減。

properties:object 或者 string,必選。
callback:function,可選。

// 表示 navClick 遞減
sensors.incrementProfile({'navClick': -1});
// 表示 navClick 遞增2
sensors.incrementProfile({'navClick': 2});
// 直接傳入一個屬性名,表示遞增1
sensors.incrementProfile('navClick');
JS

6.5. deleteProfile([callback])

刪除當前用戶及他的所有屬性。

callback: function。{可選}

//刪除當前這個用戶及他的所有屬性
sensors.deleteProfile();
JS

6.6. unsetProfile(property[, callback])

刪除當前用戶的一些屬性

properties:array 或者 string,必選。
callback:function,可選。

//刪除 email 和 location 屬性
sensors.unsetProfile(['email','location']);
//刪除 email 屬性
sensors.unsetProfile('email');
JS

7. 開啟數據的批量傳送

SDK 版本需 1.14.7 及以上

// 預設不開啟批量傳送
batch_send:false,

// 開啟批量傳送
batch_send:true,

//或者
batch_send:{
	datasend_timeout: 6000, //一次請求超過多少毫秒的話自動取消,防止請求無回應。
	send_interval: 6000, //間隔多少毫秒發一次數據。
	one_send_max_length: 6 //一次請求最大傳送幾條數據,防止數據太大
},
JS


原理:

寫入策略:觸發事件就寫入 localStorage,localStorage 的相容性請 [参考文件],如果瀏覽器不支援 localStorage,還是使用即時傳送數據的方式。

傳送策略:定時觸發傳送,或者,遇到 $pageview(或者使用 quick('autoTrack'); 方法)和 $SignUp 也會立即儲存並且傳送。

重複策略:必須請求 success 後,才會刪除數據,不然會一直請求,直到數據滿一定數量。

注意:

1、批量傳送功能和回呼函數功能不可同時使用,比如 track 加了 callback ,使用批量傳送後 callback 不會執行。
2、批量傳送預設使用跨域 ajax 的方式傳送數據。用用戶端系統時間標識數據,如瀏覽器不支援跨域 ajax 傳送數據,還是預設使用 img 且即時傳送數據的方式。
3、如果 localStorage 裡已經存了超過 200 條數據,會導致批量傳送功能失效,localStorage 中只保存這 200 條數據,新產生的數據使用 img 且即時傳送數據的方式。當進入同網域名的新頁面時,會自動檢查快取中是否有數據,如果有會繼續傳送快取的數據。
4、app_js_bridge 和 batch_send 只能選擇一個,開啟了打通就不能再用批量傳送。


8. 部分預設屬性是否採集(preset_properties)相關參數

神策 SDK 採集的最近一次相關的屬性會儲存在瀏覽器的 Cookie 中,如果對 Cookie 儲存大小有要求,可有選擇的採集下列屬性,
可設定是否將 $url 和 $title 作為公共屬性。
( 1.12.18 版本以上,1.14.10 版本以下的相似功能的 SDK 使用的設定 is_track_latest 已做相容處理)

下面設定需要放在初始化設定中,與 server_url 平級,需要 Web JS SDK 版本是 1.14.10 及以上版本

//子設定項 true 表示採集,false 表示不採集,未設定的參數取預設值。
preset_properties: {
	//是否採集 $latest_utm 最近一次廣告系列相關參數,預設值 true。
	latest_utm:true,
	//是否採集 $latest_traffic_source_type 最近一次流量來源類型,預設值 true。
	latest_traffic_source_type:true,
	//是否採集 $latest_search_keyword 最近一次搜尋引擎關鍵字,預設值 true。
	latest_search_keyword:true,
	//是否採集 $latest_referrer 最近一次參照位址,預設值 true。
	latest_referrer:true,
	//是否採集 $latest_referrer_host 最近一次參照位址,1.14.8 以下版本預設是true,1.14.8 及以上版本預設是 false,需要手動設定為 true 開啟。
	latest_referrer_host:false,
	//是否採集 $latest_landing_page 最近一次到達頁面網址,預設值 false。
	latest_landing_page:false,
	//是否採集 $url 頁面網址作為公共屬性,預設值 false。
	url: false,
	//是否採集 $title 頁面標題作為公共屬性,預設值 false。
	title: false,
}
JS

9. 關閉頁面傳送數據

一些瀏覽器比如 iOS 系統的 Safari,如果在頁面關閉時上報事件資訊,該上報請求可能會失敗。比如點擊按鈕時觸發了頁面跳轉,則跳轉前頁面上的資訊存在上報失敗的可能。

正常情況下,Web JS SDK 遺失數據的機率不超過 5%,但是在關閉頁面的情況下,遺失率會增加。

針對此問題,可以選擇下面幾種解決方式

9.1. 改為伺服器端傳送事件

如果是關鍵的點擊,需要準確的採集,比如支付等事件是在關閉頁面時傳送,建議在伺服器端中埋點採集。

9.2. 採集跳轉後頁面的 $pageview 事件

用戶點擊 href 屬性為 www.xxx.com 的 a 標籤,觸發 $WebClick 事件或者用戶自定義的 track 事件,這時頁面會進行跳轉。可能數據未傳送成功,頁面已經跳轉到 www.xxx.com ,會造成數據的遺失。

方案:給 a 標籤的 href 屬性增加某個參數,例如www.xxx.com?urlfrom=123 ,當頁面跳轉到www.xxx.com?urlfrom=123 後,採集這個頁面的$pageview 事件,在神策後台中查看Web 瀏覽事件,根據 url 是否包含 urlfrom 這個參數來篩選結果。

9.3. callback 回呼中跳轉頁面

神策自定義事件的track 方法的第三個參數,回呼函數,受 callback_timeout 參數影響(callback_timeout: 預設值200 ,單位毫秒,表示回呼函數超時時間,如果數據傳送超過 callback_timeout 還未回傳結果,會強制執行回呼函數)。

正常情況下數據請求回傳後,就會執行 callback 方法,但是考慮到網路卡或者當機的情況,設定 callback_timeout 的超時來強制執行 callback。其中有兩種不太常見特殊場景需要注意:
1. 不能把時間設定的太長,比如 3s,因為不能保證網路請求一定能回傳,這時候就會使用這個 callback_timeout,所以設定這個時間最好在 500ms 左右,可接受的範圍內。
2. 不能把時間設定的太短,比如 100ms,因為可能請求還沒發成功,就執行 callback 了,正常情況下沒問題,但是如果 callback 裡是頁面跳轉的操作,那這個數據可能會遺失。

// 點擊連結
$('a').on('click',function(e,url){
	e.preventDefault(); // 阻止預設跳轉
	sensors.track('a_click', {}, function(){
		location.href = url;
	}); //把跳轉操作加在callback裡
});
JS

9.4. 使用 setTimeout:

// 點擊連結
function targetLinkIcon( url ){
	//延遲跳轉頁面,給 SDK 傳送數據提供時間
	setTimeout(function(){
		window.location.href = url; 
	},500);
	//神策自定義事件的方法
	sensors.track('demo',{});
}
JS

9.5. beacon 的方式傳送數據

// 要求 sdk 版本在 v1.15.26 及以上版本
// 開啟 beacon 方案的需要在 SDK 初始化程式碼中增加設定(設定位置與 server_url 同等)如下:
send_type:'beacon',
use_client_time:true,
...
server_url: 'xxx'
JS

這三種方式,第一種從根本上解決問題,將事件進行轉換。推薦使用。
第二種需要阻止預設事件,對瀏覽器相容性好。可以嘗試。
第三種方式,在網頁關閉情況下也可以傳送數據,但是相容性不佳。

  • 如果檢測到瀏覽器不支援 beacon 時,會自動降級為使用 img 發送數據


9.6. batch_send 批量傳送快取數據

batch_send: 預設值 false,表示不開啟批量傳送,設定為 true 表示開啟批量採集,並且使用以下預設值 { datasend_timeout: 6000, 一次請求超過多少毫秒的話自動取消,防止請求無回應。 send_interval: 6000, 間隔 6 秒傳一次數據。 one_send_max_length: 6 一次請求最大傳送幾條數據,防止數據太大 },也可以直接以 {} 的方式自定義這幾個參數的值。

// 預設不開啟批量發送
batch_send:false,

// 開啟批量發送
batch_send:true,
//或者
batch_send:{
	datasend_timeout: 6000, //一次請求超過多少毫秒的話自動取消,防止請求無回應。
	send_interval: 6000, //間隔多少毫秒發一次數據。
},
JS

原理:

寫入策略:觸發事件就寫入 localStorage,localStorage 的相容性請 参考文件,如瀏覽器不支援 localStorage,還是使用即時傳送數據的方式。

傳送策略:定時觸發傳送,或者,遇到 $pageview(或者使用 quick('autoTrack'); 方法)和 $SignUp 也會立即儲存並且傳送。

重複策略:必須請求 success 後,才會刪除數據,不然會一直請求,直到數據滿一定數量。

  • 批量傳送功能和神策 SDK 提供的介面回呼函數功能不可同時使用,比如 track,login 等。
  • 批量傳送預設使用跨域 ajax 的方式傳送數據,且用用戶端系統時間標識數據,如瀏覽器不支援跨域 ajax 傳送數據,還是預設使用 img 且即時傳送數據的方式。
  • 如果 localStorage 裡已經存了超過 200 條數據,會導致批量傳送功能失效,localStorage 中只保存這 200 條數據,新產生的數據使用 img 且即時傳送數據的方式。當進入同網域名的新頁面時,會自動檢查快取中是否有數據,如果有會繼續傳送快取的數據。
  • app_js_bridge 和 batch_send 只能選擇一個,開啟了打通就不能再用批量傳送。