Skip to content

Commit 0ac689c

Browse files
author
shengyonggen
committed
增加latest相关,以及autoTrack的自定义
1 parent 6806474 commit 0ac689c

File tree

4 files changed

+452
-61
lines changed

4 files changed

+452
-61
lines changed

sensorsdata.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/sdk.js

Lines changed: 222 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -528,15 +528,16 @@ _.urlParse = function(para) {
528528
};
529529
return new URLParser(para);
530530
}
531-
// 取host
531+
532+
/* ulr预置
532533
_.referringDomain = function(referrer) {
533534
var split = referrer.split('/');
534535
if (split.length >= 3) {
535536
return split[2];
536537
}
537538
return '';
538539
};
539-
// 取domain
540+
540541
_.getDomainByHost = function(url) {
541542
if (typeof url === 'string' && url.split('.').length >= 2) {
542543
var temp = url.match(/[^\.]+\.[^.]+$/);
@@ -549,7 +550,7 @@ _.getDomainByHost = function(url) {
549550
return '';
550551
}
551552
}
552-
553+
*/
553554

554555
// 是否有标准的浏览器环境,如果不是发送$errorEnviroment:{$errorReson:'没有window'}
555556
_.hasStandardBrowserEnviroment = function() {
@@ -753,14 +754,203 @@ _.ajax = function(para) {
753754

754755
};
755756

757+
758+
//https://github.com/websanova/js-url
759+
760+
_.url = (function() {
761+
762+
function _t() {
763+
return new RegExp(/(.*?)\.?([^\.]*?)\.?(com|net|org|biz|ws|in|me|co\.uk|co|org\.uk|ltd\.uk|plc\.uk|me\.uk|edu|mil|br\.com|cn\.com|eu\.com|hu\.com|no\.com|qc\.com|sa\.com|se\.com|se\.net|us\.com|uy\.com|ac|co\.ac|gv\.ac|or\.ac|ac\.ac|af|am|as|at|ac\.at|co\.at|gv\.at|or\.at|asn\.au|com\.au|edu\.au|org\.au|net\.au|id\.au|be|ac\.be|adm\.br|adv\.br|am\.br|arq\.br|art\.br|bio\.br|cng\.br|cnt\.br|com\.br|ecn\.br|eng\.br|esp\.br|etc\.br|eti\.br|fm\.br|fot\.br|fst\.br|g12\.br|gov\.br|ind\.br|inf\.br|jor\.br|lel\.br|med\.br|mil\.br|net\.br|nom\.br|ntr\.br|odo\.br|org\.br|ppg\.br|pro\.br|psc\.br|psi\.br|rec\.br|slg\.br|tmp\.br|tur\.br|tv\.br|vet\.br|zlg\.br|br|ab\.ca|bc\.ca|mb\.ca|nb\.ca|nf\.ca|ns\.ca|nt\.ca|on\.ca|pe\.ca|qc\.ca|sk\.ca|yk\.ca|ca|cc|ac\.cn|com\.cn|edu\.cn|gov\.cn|org\.cn|bj\.cn|sh\.cn|tj\.cn|cq\.cn|he\.cn|nm\.cn|ln\.cn|jl\.cn|hl\.cn|js\.cn|zj\.cn|ah\.cn|gd\.cn|gx\.cn|hi\.cn|sc\.cn|gz\.cn|yn\.cn|xz\.cn|sn\.cn|gs\.cn|qh\.cn|nx\.cn|xj\.cn|tw\.cn|hk\.cn|mo\.cn|cn|cx|cz|de|dk|fo|com\.ec|tm\.fr|com\.fr|asso\.fr|presse\.fr|fr|gf|gs|co\.il|net\.il|ac\.il|k12\.il|gov\.il|muni\.il|ac\.in|co\.in|org\.in|ernet\.in|gov\.in|net\.in|res\.in|is|it|ac\.jp|co\.jp|go\.jp|or\.jp|ne\.jp|ac\.kr|co\.kr|go\.kr|ne\.kr|nm\.kr|or\.kr|li|lt|lu|asso\.mc|tm\.mc|com\.mm|org\.mm|net\.mm|edu\.mm|gov\.mm|ms|nl|no|nu|pl|ro|org\.ro|store\.ro|tm\.ro|firm\.ro|www\.ro|arts\.ro|rec\.ro|info\.ro|nom\.ro|nt\.ro|se|si|com\.sg|org\.sg|net\.sg|gov\.sg|sk|st|tf|ac\.th|co\.th|go\.th|mi\.th|net\.th|or\.th|tm|to|com\.tr|edu\.tr|gov\.tr|k12\.tr|net\.tr|org\.tr|com\.tw|org\.tw|net\.tw|ac\.uk|uk\.com|uk\.net|gb\.com|gb\.net|vg|sh|kz|ch|info|ua|gov|name|pro|ie|hk|com\.hk|org\.hk|net\.hk|edu\.hk|us|tk|cd|by|ad|lv|eu\.lv|bz|es|jp|cl|ag|mobi|eu|co\.nz|org\.nz|net\.nz|maori\.nz|iwi\.nz|io|la|md|sc|sg|vc|tw|travel|my|se|tv|pt|com\.pt|edu\.pt|asia|fi|com\.ve|net\.ve|fi|org\.ve|web\.ve|info\.ve|co\.ve|tel|im|gr|ru|net\.ru|org\.ru|hr|com\.hr|ly|xyz)$/);
764+
}
765+
766+
function _d(s) {
767+
return decodeURIComponent(s.replace(/\+/g, ' '));
768+
}
769+
770+
function _i(arg, str) {
771+
var sptr = arg.charAt(0),
772+
split = str.split(sptr);
773+
774+
if (sptr === arg) { return split; }
775+
776+
arg = parseInt(arg.substring(1), 10);
777+
778+
return split[arg < 0 ? split.length + arg : arg - 1];
779+
}
780+
781+
function _f(arg, str) {
782+
var sptr = arg.charAt(0),
783+
split = str.split('&'),
784+
field = [],
785+
params = {},
786+
tmp = [],
787+
arg2 = arg.substring(1);
788+
789+
for (var i = 0, ii = split.length; i < ii; i++) {
790+
field = split[i].match(/(.*?)=(.*)/);
791+
792+
// TODO: regex should be able to handle this.
793+
if ( ! field) {
794+
field = [split[i], split[i], ''];
795+
}
796+
797+
if (field[1].replace(/\s/g, '') !== '') {
798+
field[2] = _d(field[2] || '');
799+
800+
// If we have a match just return it right away.
801+
if (arg2 === field[1]) { return field[2]; }
802+
803+
// Check for array pattern.
804+
tmp = field[1].match(/(.*)\[([0-9]+)\]/);
805+
806+
if (tmp) {
807+
params[tmp[1]] = params[tmp[1]] || [];
808+
809+
params[tmp[1]][tmp[2]] = field[2];
810+
}
811+
else {
812+
params[field[1]] = field[2];
813+
}
814+
}
815+
}
816+
817+
if (sptr === arg) { return params; }
818+
819+
return params[arg2];
820+
}
821+
822+
return function(arg, url) {
823+
var _l = {}, tmp, tmp2;
824+
825+
if (arg === 'tld?') { return _t(); }
826+
827+
url = url || window.location.toString();
828+
829+
if ( ! arg) { return url; }
830+
831+
arg = arg.toString();
832+
833+
if (tmp = url.match(/^mailto:([^\/].+)/)) {
834+
_l.protocol = 'mailto';
835+
_l.email = tmp[1];
836+
}
837+
else {
838+
839+
// Ignore Hashbangs.
840+
if (tmp = url.match(/(.*?)\/#\!(.*)/)) {
841+
url = tmp[1] + tmp[2];
842+
}
843+
844+
// Hash.
845+
if (tmp = url.match(/(.*?)#(.*)/)) {
846+
_l.hash = tmp[2];
847+
url = tmp[1];
848+
}
849+
850+
// Return hash parts.
851+
if (_l.hash && arg.match(/^#/)) { return _f(arg, _l.hash); }
852+
853+
// Query
854+
if (tmp = url.match(/(.*?)\?(.*)/)) {
855+
_l.query = tmp[2];
856+
url = tmp[1];
857+
}
858+
859+
// Return query parts.
860+
if (_l.query && arg.match(/^\?/)) { return _f(arg, _l.query); }
861+
862+
// Protocol.
863+
if (tmp = url.match(/(.*?)\:?\/\/(.*)/)) {
864+
_l.protocol = tmp[1].toLowerCase();
865+
url = tmp[2];
866+
}
867+
868+
// Path.
869+
if (tmp = url.match(/(.*?)(\/.*)/)) {
870+
_l.path = tmp[2];
871+
url = tmp[1];
872+
}
873+
874+
// Clean up path.
875+
_l.path = (_l.path || '').replace(/^([^\/])/, '/$1').replace(/\/$/, '');
876+
877+
// Return path parts.
878+
if (arg.match(/^[\-0-9]+$/)) { arg = arg.replace(/^([^\/])/, '/$1'); }
879+
if (arg.match(/^\//)) { return _i(arg, _l.path.substring(1)); }
880+
881+
// File.
882+
tmp = _i('/-1', _l.path.substring(1));
883+
884+
if (tmp && (tmp = tmp.match(/(.*?)\.(.*)/))) {
885+
_l.file = tmp[0];
886+
_l.filename = tmp[1];
887+
_l.fileext = tmp[2];
888+
}
889+
890+
// Port.
891+
if (tmp = url.match(/(.*)\:([0-9]+)$/)) {
892+
_l.port = tmp[2];
893+
url = tmp[1];
894+
}
895+
896+
// Auth.
897+
if (tmp = url.match(/(.*?)@(.*)/)) {
898+
_l.auth = tmp[1];
899+
url = tmp[2];
900+
}
901+
902+
// User and pass.
903+
if (_l.auth) {
904+
tmp = _l.auth.match(/(.*)\:(.*)/);
905+
906+
_l.user = tmp ? tmp[1] : _l.auth;
907+
_l.pass = tmp ? tmp[2] : undefined;
908+
}
909+
910+
// Hostname.
911+
_l.hostname = url.toLowerCase();
912+
913+
// Return hostname parts.
914+
if (arg.charAt(0) === '.') { return _i(arg, _l.hostname); }
915+
916+
// Domain, tld and sub domain.
917+
if (_t()) {
918+
tmp = _l.hostname.match(_t());
919+
920+
if (tmp) {
921+
_l.tld = tmp[3];
922+
_l.domain = tmp[2] ? tmp[2] + '.' + tmp[3] : undefined;
923+
_l.sub = tmp[1] || undefined;
924+
}
925+
}
926+
927+
// Set port and protocol defaults if not set.
928+
_l.port = _l.port || (_l.protocol === 'https' ? '443' : '80');
929+
_l.protocol = _l.protocol || (_l.port === '443' ? 'https' : 'http');
930+
}
931+
932+
// Return arg.
933+
if (arg in _l) { return _l[arg]; }
934+
935+
// Return everything.
936+
if (arg === '{}') { return _l; }
937+
938+
// Default to undefined for no match.
939+
return undefined;
940+
};
941+
})();
942+
943+
944+
945+
756946
_.info = {
757947
initPage: function() {
758948
var referrer = document.referrer;
759-
var referrer_host = referrer ? _.referringDomain(referrer) : referrer;
760-
var referrer_domain = _.getDomainByHost(referrer_host);
949+
var referrer_host = referrer ? _.url('hostname',referrer) : referrer;
950+
var referrer_domain = referrer ? _.url('domain',referrer) : referrer;
761951
var url = location.href;
762-
var url_host = url ? _.referringDomain(url) : url;
763-
var url_domain = _.getDomainByHost(url_host);
952+
var url_host = url ? _.url('hostname',url) : url;
953+
var url_domain = url ? _.url('domain',url) : url;
764954
this.pageProp = {
765955
referrer: referrer,
766956
referrer_host: referrer_host,
@@ -790,12 +980,12 @@ _.info = {
790980

791981
return params;
792982
},
793-
campaignParamsStandard: function() {
983+
campaignParamsStandard: function(prefix) {
794984
var utms = _.info.campaignParams();
795985
var $utms = {}, otherUtms = {};
796986
for (var i in utms) {
797987
if ((' ' + source_channel_standard + ' ').indexOf(' ' + i + ' ') !== -1) {
798-
$utms['$' + i] = utms[i];
988+
$utms[prefix + i] = utms[i];
799989
} else {
800990
otherUtms[i] = utms[i];
801991
}
@@ -921,7 +1111,7 @@ var saNewUser = {
9211111
});
9221112
}
9231113
// utm
924-
var $utms = _.info.campaignParamsStandard().$utms;
1114+
var $utms = _.info.campaignParamsStandard('$latest_').$utms;
9251115
if (!_.isEmptyObject($utms)) {
9261116
sd.register($utms);
9271117
}
@@ -1223,7 +1413,7 @@ saEvent.send = function(p, callback) {
12231413
}
12241414
//判断新用户
12251415
saNewUser.storeInitCheck();
1226-
//saNewUser.checkIsFirstLatest();
1416+
saNewUser.checkIsFirstLatest();
12271417
// 如果初始化cookie失败,发送错误事件
12281418
/*
12291419
if(error_msg.length > 0 && sd.para.send_error_event){
@@ -1247,27 +1437,32 @@ saEvent.send = function(p, callback) {
12471437
var _referrer = (document.referrer).slice(0, sd.para.max_referrer_string_length);
12481438
sd.setOnceProfile({
12491439
_init_referrer: _referrer,
1250-
_init_referrer_domain: _.referringDomain(_referrer)
1440+
_init_referrer_host: _.info.pageProp.referrer_host
12511441
});
12521442
},
12531443
// set init sessionRegister cookie
12541444
setSessionReferrer: function() {
12551445
var _referrer = (document.referrer).slice(0, sd.para.max_referrer_string_length);
12561446
store.setSessionPropsOnce({
12571447
_session_referrer: _referrer,
1258-
_session_referrer_domain: _.referringDomain(_referrer)
1448+
_session_referrer_host: _.info.pageProp.referrer_host
12591449
});
12601450
},
12611451
// set default referrr and pageurl
12621452
setDefaultAttr: function() {
12631453
_.info.register({
12641454
_current_url: location.href,
12651455
_referrer: (document.referrer).slice(0, sd.para.max_referrer_string_length),
1266-
_referring_domain: _.referringDomain(document.referrer)
1456+
_referring_host: _.info.pageProp.referrer_host
12671457
});
12681458
},
12691459

1270-
autoTrack: function() {
1460+
autoTrackWithoutProfile:function(para){
1461+
this.autoTrack(_.extend(para,{not_set_profile:true}));
1462+
},
1463+
autoTrack: function(para) {
1464+
para = _.isObject(para) ? para : {};
1465+
12711466
var utms = _.info.campaignParams();
12721467
var $utms = {};
12731468
for (var i in utms) {
@@ -1277,24 +1472,28 @@ saEvent.send = function(p, callback) {
12771472
$utms[i] = utms[i];
12781473
}
12791474
}
1280-
// setOnceProfile
1281-
if (is_first_visitor) {
1475+
// setOnceProfile 如果是新用户,且允许设置profile
1476+
if (is_first_visitor && !para.not_set_profile) {
12821477
sd.setOnceProfile(_.extend({
12831478
$first_visit_time: new Date(),
12841479
$first_referrer: (document.referrer).slice(0, sd.para.max_referrer_string_length),
12851480
$first_browser_language: navigator.language,
1286-
$first_referrer_host: _.referringDomain(document.referrer)
1481+
$first_referrer_host: _.info.pageProp.referrer_host
12871482
}, $utms)
12881483
);
12891484
}
1290-
// trackpageview
1485+
if(para.not_set_profile){
1486+
delete para.not_set_profile;
1487+
}
1488+
1489+
// trackpageview
12911490
sd.track('$pageview', _.extend({
12921491
$referrer: (document.referrer).slice(0, sd.para.max_referrer_string_length),
1293-
$referrer_host: _.referringDomain(document.referrer),
1492+
$referrer_host: _.info.pageProp.referrer_host,
12941493
$url: location.href,
12951494
$url_path: location.pathname,
12961495
$title: document.title
1297-
}, $utms)
1496+
}, $utms,para)
12981497
);
12991498
}
13001499

@@ -1307,7 +1506,7 @@ saEvent.send = function(p, callback) {
13071506
var arg0 = arg[0];
13081507
var arg1 = arg.slice(1);
13091508
if (typeof arg0 === 'string' && commonWays[arg0]) {
1310-
return commonWays[arg0].apply(sd, arg1);
1509+
return commonWays[arg0].apply(commonWays, arg1);
13111510
} else if (typeof arg0 === 'function') {
13121511
arg0.apply(sd, arg1);
13131512
} else {
@@ -1567,16 +1766,13 @@ saEvent.send = function(p, callback) {
15671766
};
15681767

15691768

1570-
1571-
sd.init = function() {
1572-
1769+
sd.init = function() {
15731770
// 防止爬虫等异常情况
15741771
/*
15751772
if(!_.hasStandardBrowserEnviroment()){
15761773
return false;
15771774
}*/
15781775
app_js_bridge();
1579-
15801776
// 初始化referrer等页面属性 1.6
15811777
_.info.initPage();
15821778

0 commit comments

Comments
 (0)