Skip to content

Commit 9093f84

Browse files
author
shengyonggen
committed
增加单页面里自动跟踪utm,增加点击图中a里面多层嵌套
1 parent b765191 commit 9093f84

File tree

7 files changed

+173
-107
lines changed

7 files changed

+173
-107
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sa-sdk-javascript",
3-
"version": "1.8.4",
3+
"version": "1.8.7",
44
"description": "official sensorsdata javascript sdk",
55
"main": "sensorsdata.min.js",
66
"scripts": {

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: 82 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,6 @@ _.unique = function(ar) {
343343
return n;
344344
};
345345

346-
347346
// 只能是sensors满足的数据格式
348347
_.strip_sa_properties = function(p) {
349348
if (!_.isObject(p)) {
@@ -719,9 +718,50 @@ _.bindReady = function(fn,win) {
719718

720719

721720
_.addEvent = function() {
721+
722+
function fixEvent(event) {
723+
if (event) {
724+
event.preventDefault = fixEvent.preventDefault;
725+
event.stopPropagation = fixEvent.stopPropagation;
726+
event._getPath = fixEvent._getPath;
727+
}
728+
return event;
729+
}
730+
fixEvent._getPath = function(){
731+
var ev = this;
732+
var polyfill = function () {
733+
try{
734+
var element = ev.target;
735+
var pathArr = [element];
736+
if (element === null || element.parentElement === null) {
737+
return [];
738+
}
739+
while (element.parentElement !== null) {
740+
element = element.parentElement;
741+
pathArr.unshift(element);
742+
}
743+
return pathArr;
744+
}catch(err){
745+
return [];
746+
}
747+
748+
};
749+
return this.path || (this.composedPath && this.composedPath()) || polyfill();
750+
};
751+
fixEvent.preventDefault = function() {
752+
this.returnValue = false;
753+
};
754+
fixEvent.stopPropagation = function() {
755+
this.cancelBubble = true;
756+
};
757+
758+
722759
var register_event = function(element, type, handler) {
723760
if (element && element.addEventListener) {
724-
element.addEventListener(type, handler, false);
761+
element.addEventListener(type, function(e){
762+
e._getPath = fixEvent._getPath;
763+
handler.call(this,e);
764+
}, false);
725765
} else {
726766
var ontype = 'on' + type;
727767
var old_handler = element[ontype];
@@ -738,7 +778,7 @@ _.addEvent = function() {
738778

739779
var ret = true;
740780
var old_result, new_result;
741-
if (_.isFunction(old_handlers)) {
781+
if (typeof old_handlers === 'function') {
742782
old_result = old_handlers(event);
743783
}
744784
new_result = new_handler.call(element, event);
@@ -750,45 +790,10 @@ _.addEvent = function() {
750790
return handler;
751791
}
752792

753-
function fixEvent(event) {
754-
if (event) {
755-
event.preventDefault = fixEvent.preventDefault;
756-
event.stopPropagation = fixEvent.stopPropagation;
757-
//event.path = fixEvent.path;
758-
}
759-
return event;
760-
}
761-
762-
fixEvent.preventDefault = function() {
763-
this.returnValue = false;
764-
};
765-
fixEvent.stopPropagation = function() {
766-
this.cancelBubble = true;
767-
};
768-
fixEvent.path1 = function() {
769-
try{
770-
var polyfill = function () {
771-
var element = this.target;
772-
var pathArr = [element];
773-
if (element === null || element.parentElement === null) {
774-
return [];
775-
}
776-
while (element.parentElement !== null) {
777-
element = element.parentElement;
778-
pathArr.unshift(element);
779-
}
780-
return pathArr;
781-
};
782-
return this.path || (this.composedPath && this.composedPath()) || polyfill();
783-
}catch(e){
784-
return [];
785-
}
786-
};
787-
788-
789793
register_event.apply(null,arguments);
790794
};
791795

796+
792797
_.addHashEvent = function(callback){
793798
var hashEvent = ('pushState' in window.history ? 'popstate' : 'hashchange');
794799
_.addEvent(window,hashEvent,callback);
@@ -2172,6 +2177,19 @@ saEvent.send = function(p, callback) {
21722177
}
21732178
},
21742179
autoTrackSinglePage:function(para,callback){
2180+
function getUtm(){
2181+
var utms = _.info.campaignParams();
2182+
var $utms = {};
2183+
for (var i in utms) {
2184+
if ((' ' + source_channel_standard + ' ').indexOf(' ' + i + ' ') !== -1) {
2185+
$utms['$' + i] = utms[i];
2186+
} else {
2187+
$utms[i] = utms[i];
2188+
}
2189+
}
2190+
return $utms;
2191+
}
2192+
21752193
var url = _.info.pageProp.url;
21762194
function closure(){
21772195
sd.track('$pageview', _.extend({
@@ -2180,7 +2198,7 @@ saEvent.send = function(p, callback) {
21802198
$url: location.href,
21812199
$url_path: location.pathname,
21822200
$title: document.title
2183-
}, para),callback
2201+
}, para, getUtm()),callback
21842202
);
21852203
url = location.href;
21862204
}
@@ -3337,6 +3355,17 @@ var heatmap = {
33373355
}
33383356
}
33393357
},
3358+
hasElement:function(e){
3359+
var path = e._getPath();
3360+
if(_.isArray(path) && (path.length > 0) ){
3361+
for(var i = 0;i<path.length;i++){
3362+
if(path[i].tagName.toLowerCase() === 'a'){
3363+
return path[i];
3364+
}
3365+
}
3366+
}
3367+
return false;
3368+
},
33403369
init : function() {
33413370
var that = this;
33423371
if (!_.isObject(sd.para.heatmap)) {
@@ -3383,14 +3412,19 @@ var heatmap = {
33833412
}
33843413
if(!target || !target.parentNode || !target.parentNode.children){
33853414
return false;
3386-
}
3387-
var parent_ele = target.parentNode.tagName.toLowerCase();
3388-
if (tagName === 'button' || tagName === 'a' || parent_ele === 'a' || parent_ele === 'button' || tagName === 'input' || tagName === 'textarea') {
3389-
if(parent_ele === 'a' || parent_ele === 'button'){
3390-
that.start(ev, target.parentNode, target.parentNode.tagName.toLowerCase());
3391-
}else{
3392-
that.start(ev, target, tagName);
3393-
}
3415+
}
3416+
3417+
parent_ele = target.parentNode;
3418+
3419+
if(tagName === 'a' || tagName === 'button' || tagName === 'input' || tagName === 'textarea'){
3420+
that.start(ev, target, tagName);
3421+
}else if(parent_ele.tagName.toLowerCase() === 'button' || parent_ele.tagName.toLowerCase() === 'a'){
3422+
that.start(ev, parent_ele, target.parentNode.tagName.toLowerCase());
3423+
}else{
3424+
var hasA = that.hasElement(e);
3425+
if(hasA){
3426+
that.start(ev, hasA, hasA.tagName.toLowerCase());
3427+
}
33943428
}
33953429
});
33963430
}

src/sensorsdata.full.js

Lines changed: 83 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ var ObjProto = Object.prototype;
122122
var slice = ArrayProto.slice;
123123
var toString = ObjProto.toString;
124124
var hasOwnProperty = ObjProto.hasOwnProperty;
125-
var LIB_VERSION = '1.8.1.5';
125+
var LIB_VERSION = '1.8.7';
126126

127127
sd.lib_version = LIB_VERSION;
128128

@@ -461,7 +461,6 @@ _.unique = function(ar) {
461461
return n;
462462
};
463463

464-
465464
// 只能是sensors满足的数据格式
466465
_.strip_sa_properties = function(p) {
467466
if (!_.isObject(p)) {
@@ -837,9 +836,50 @@ _.bindReady = function(fn,win) {
837836

838837

839838
_.addEvent = function() {
839+
840+
function fixEvent(event) {
841+
if (event) {
842+
event.preventDefault = fixEvent.preventDefault;
843+
event.stopPropagation = fixEvent.stopPropagation;
844+
event._getPath = fixEvent._getPath;
845+
}
846+
return event;
847+
}
848+
fixEvent._getPath = function(){
849+
var ev = this;
850+
var polyfill = function () {
851+
try{
852+
var element = ev.target;
853+
var pathArr = [element];
854+
if (element === null || element.parentElement === null) {
855+
return [];
856+
}
857+
while (element.parentElement !== null) {
858+
element = element.parentElement;
859+
pathArr.unshift(element);
860+
}
861+
return pathArr;
862+
}catch(err){
863+
return [];
864+
}
865+
866+
};
867+
return this.path || (this.composedPath && this.composedPath()) || polyfill();
868+
};
869+
fixEvent.preventDefault = function() {
870+
this.returnValue = false;
871+
};
872+
fixEvent.stopPropagation = function() {
873+
this.cancelBubble = true;
874+
};
875+
876+
840877
var register_event = function(element, type, handler) {
841878
if (element && element.addEventListener) {
842-
element.addEventListener(type, handler, false);
879+
element.addEventListener(type, function(e){
880+
e._getPath = fixEvent._getPath;
881+
handler.call(this,e);
882+
}, false);
843883
} else {
844884
var ontype = 'on' + type;
845885
var old_handler = element[ontype];
@@ -856,7 +896,7 @@ _.addEvent = function() {
856896

857897
var ret = true;
858898
var old_result, new_result;
859-
if (_.isFunction(old_handlers)) {
899+
if (typeof old_handlers === 'function') {
860900
old_result = old_handlers(event);
861901
}
862902
new_result = new_handler.call(element, event);
@@ -868,45 +908,10 @@ _.addEvent = function() {
868908
return handler;
869909
}
870910

871-
function fixEvent(event) {
872-
if (event) {
873-
event.preventDefault = fixEvent.preventDefault;
874-
event.stopPropagation = fixEvent.stopPropagation;
875-
//event.path = fixEvent.path;
876-
}
877-
return event;
878-
}
879-
880-
fixEvent.preventDefault = function() {
881-
this.returnValue = false;
882-
};
883-
fixEvent.stopPropagation = function() {
884-
this.cancelBubble = true;
885-
};
886-
fixEvent.path1 = function() {
887-
try{
888-
var polyfill = function () {
889-
var element = this.target;
890-
var pathArr = [element];
891-
if (element === null || element.parentElement === null) {
892-
return [];
893-
}
894-
while (element.parentElement !== null) {
895-
element = element.parentElement;
896-
pathArr.unshift(element);
897-
}
898-
return pathArr;
899-
};
900-
return this.path || (this.composedPath && this.composedPath()) || polyfill();
901-
}catch(e){
902-
return [];
903-
}
904-
};
905-
906-
907911
register_event.apply(null,arguments);
908912
};
909913

914+
910915
_.addHashEvent = function(callback){
911916
var hashEvent = ('pushState' in window.history ? 'popstate' : 'hashchange');
912917
_.addEvent(window,hashEvent,callback);
@@ -2284,6 +2289,19 @@ saEvent.send = function(p, callback) {
22842289
}
22852290
},
22862291
autoTrackSinglePage:function(para,callback){
2292+
function getUtm(){
2293+
var utms = _.info.campaignParams();
2294+
var $utms = {};
2295+
for (var i in utms) {
2296+
if ((' ' + source_channel_standard + ' ').indexOf(' ' + i + ' ') !== -1) {
2297+
$utms['$' + i] = utms[i];
2298+
} else {
2299+
$utms[i] = utms[i];
2300+
}
2301+
}
2302+
return $utms;
2303+
}
2304+
22872305
var url = _.info.pageProp.url;
22882306
function closure(){
22892307
sd.track('$pageview', _.extend({
@@ -2292,7 +2310,7 @@ saEvent.send = function(p, callback) {
22922310
$url: location.href,
22932311
$url_path: location.pathname,
22942312
$title: document.title
2295-
}, para),callback
2313+
}, para, getUtm()),callback
22962314
);
22972315
url = location.href;
22982316
}
@@ -3449,6 +3467,17 @@ var heatmap = {
34493467
}
34503468
}
34513469
},
3470+
hasElement:function(e){
3471+
var path = e._getPath();
3472+
if(_.isArray(path) && (path.length > 0) ){
3473+
for(var i = 0;i<path.length;i++){
3474+
if(path[i].tagName.toLowerCase() === 'a'){
3475+
return path[i];
3476+
}
3477+
}
3478+
}
3479+
return false;
3480+
},
34523481
init : function() {
34533482
var that = this;
34543483
if (!_.isObject(sd.para.heatmap)) {
@@ -3495,14 +3524,19 @@ var heatmap = {
34953524
}
34963525
if(!target || !target.parentNode || !target.parentNode.children){
34973526
return false;
3498-
}
3499-
var parent_ele = target.parentNode.tagName.toLowerCase();
3500-
if (tagName === 'button' || tagName === 'a' || parent_ele === 'a' || parent_ele === 'button' || tagName === 'input' || tagName === 'textarea') {
3501-
if(parent_ele === 'a' || parent_ele === 'button'){
3502-
that.start(ev, target.parentNode, target.parentNode.tagName.toLowerCase());
3503-
}else{
3504-
that.start(ev, target, tagName);
3505-
}
3527+
}
3528+
3529+
parent_ele = target.parentNode;
3530+
3531+
if(tagName === 'a' || tagName === 'button' || tagName === 'input' || tagName === 'textarea'){
3532+
that.start(ev, target, tagName);
3533+
}else if(parent_ele.tagName.toLowerCase() === 'button' || parent_ele.tagName.toLowerCase() === 'a'){
3534+
that.start(ev, parent_ele, target.parentNode.tagName.toLowerCase());
3535+
}else{
3536+
var hasA = that.hasElement(e);
3537+
if(hasA){
3538+
that.start(ev, hasA, hasA.tagName.toLowerCase());
3539+
}
35063540
}
35073541
});
35083542
}

0 commit comments

Comments
 (0)