@@ -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 ( / ( .* ?) \. ? ( [ ^ \. ] * ?) \. ? ( c o m | n e t | o r g | b i z | w s | i n | m e | c o \. u k | c o | o r g \. u k | l t d \. u k | p l c \. u k | m e \. u k | e d u | m i l | b r \. c o m | c n \. c o m | e u \. c o m | h u \. c o m | n o \. c o m | q c \. c o m | s a \. c o m | s e \. c o m | s e \. n e t | u s \. c o m | u y \. c o m | a c | c o \. a c | g v \. a c | o r \. a c | a c \. a c | a f | a m | a s | a t | a c \. a t | c o \. a t | g v \. a t | o r \. a t | a s n \. a u | c o m \. a u | e d u \. a u | o r g \. a u | n e t \. a u | i d \. a u | b e | a c \. b e | a d m \. b r | a d v \. b r | a m \. b r | a r q \. b r | a r t \. b r | b i o \. b r | c n g \. b r | c n t \. b r | c o m \. b r | e c n \. b r | e n g \. b r | e s p \. b r | e t c \. b r | e t i \. b r | f m \. b r | f o t \. b r | f s t \. b r | g 1 2 \. b r | g o v \. b r | i n d \. b r | i n f \. b r | j o r \. b r | l e l \. b r | m e d \. b r | m i l \. b r | n e t \. b r | n o m \. b r | n t r \. b r | o d o \. b r | o r g \. b r | p p g \. b r | p r o \. b r | p s c \. b r | p s i \. b r | r e c \. b r | s l g \. b r | t m p \. b r | t u r \. b r | t v \. b r | v e t \. b r | z l g \. b r | b r | a b \. c a | b c \. c a | m b \. c a | n b \. c a | n f \. c a | n s \. c a | n t \. c a | o n \. c a | p e \. c a | q c \. c a | s k \. c a | y k \. c a | c a | c c | a c \. c n | c o m \. c n | e d u \. c n | g o v \. c n | o r g \. c n | b j \. c n | s h \. c n | t j \. c n | c q \. c n | h e \. c n | n m \. c n | l n \. c n | j l \. c n | h l \. c n | j s \. c n | z j \. c n | a h \. c n | g d \. c n | g x \. c n | h i \. c n | s c \. c n | g z \. c n | y n \. c n | x z \. c n | s n \. c n | g s \. c n | q h \. c n | n x \. c n | x j \. c n | t w \. c n | h k \. c n | m o \. c n | c n | c x | c z | d e | d k | f o | c o m \. e c | t m \. f r | c o m \. f r | a s s o \. f r | p r e s s e \. f r | f r | g f | g s | c o \. i l | n e t \. i l | a c \. i l | k 1 2 \. i l | g o v \. i l | m u n i \. i l | a c \. i n | c o \. i n | o r g \. i n | e r n e t \. i n | g o v \. i n | n e t \. i n | r e s \. i n | i s | i t | a c \. j p | c o \. j p | g o \. j p | o r \. j p | n e \. j p | a c \. k r | c o \. k r | g o \. k r | n e \. k r | n m \. k r | o r \. k r | l i | l t | l u | a s s o \. m c | t m \. m c | c o m \. m m | o r g \. m m | n e t \. m m | e d u \. m m | g o v \. m m | m s | n l | n o | n u | p l | r o | o r g \. r o | s t o r e \. r o | t m \. r o | f i r m \. r o | w w w \. r o | a r t s \. r o | r e c \. r o | i n f o \. r o | n o m \. r o | n t \. r o | s e | s i | c o m \. s g | o r g \. s g | n e t \. s g | g o v \. s g | s k | s t | t f | a c \. t h | c o \. t h | g o \. t h | m i \. t h | n e t \. t h | o r \. t h | t m | t o | c o m \. t r | e d u \. t r | g o v \. t r | k 1 2 \. t r | n e t \. t r | o r g \. t r | c o m \. t w | o r g \. t w | n e t \. t w | a c \. u k | u k \. c o m | u k \. n e t | g b \. c o m | g b \. n e t | v g | s h | k z | c h | i n f o | u a | g o v | n a m e | p r o | i e | h k | c o m \. h k | o r g \. h k | n e t \. h k | e d u \. h k | u s | t k | c d | b y | a d | l v | e u \. l v | b z | e s | j p | c l | a g | m o b i | e u | c o \. n z | o r g \. n z | n e t \. n z | m a o r i \. n z | i w i \. n z | i o | l a | m d | s c | s g | v c | t w | t r a v e l | m y | s e | t v | p t | c o m \. p t | e d u \. p t | a s i a | f i | c o m \. v e | n e t \. v e | f i | o r g \. v e | w e b \. v e | i n f o \. v e | c o \. v e | t e l | i m | g r | r u | n e t \. r u | o r g \. r u | h r | c o m \. h r | l y | x y z ) $ / ) ;
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 ( / ^ m a i l t o : ( [ ^ \/ ] .+ ) / ) ) {
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