Skip to content

Commit 24666db

Browse files
author
shengyonggen
committed
Release 1.21.10
1 parent 6e2ea50 commit 24666db

20 files changed

+1113
-382
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
## 1.21.10 (2021-03-4)
2+
1. 新增
3+
- 新增 `SiteLinkerConcatUtm` 插件,支持跨域打通传递渠道数功能
4+
- 支持动态配置指定页面的 `$WebPageLeave` 采集
5+
2. 修复
6+
- 修复 `IE 11` 浏览器下和 `Paypal` 插件不兼容的问题
7+
- 修复自定义埋点事件无法截断过长 `url` 的问题
8+
- 修复火狐浏览器出现 `cookie` 未设置 `secure` 属性警告的问题
9+
- `eventEmitter` 代码优化
10+
111
## 1.21.9 (2021-02-28)
212
1. 新增
313
- 支持存储加密

core/sensorsdata.amd.min.js

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

core/sensorsdata.es6.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/sensorsdata.min.js

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

core/sensorsdata.mtp.min.js

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

heatmap.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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.21.9",
3+
"version": "1.21.10",
44
"description": "official sensorsdata javascript sdk",
55
"main": "sensorsdata.min.js",
66
"scripts": {

plugins/site-linker-concat-utm.js

Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,345 @@
1+
sensorsDataAnalytic201505.modules['SiteLinkerConcatUtm'] = (function () {
2+
'use strict';
3+
4+
var siteLinker = {};
5+
6+
// 检查指定URL是否匹配打通规则
7+
siteLinker.getPart = function (part) {
8+
var temp = false;
9+
var len = this.option.length;
10+
if (len) {
11+
for (var i = 0; i < len; i++) {
12+
if (part.indexOf(this.option[i]['part_url']) > -1) {
13+
return true;
14+
}
15+
}
16+
}
17+
return temp;
18+
};
19+
20+
siteLinker.getPartHash = function (part) {
21+
var len = this.option.length;
22+
var temp = false;
23+
if (len) {
24+
for (var i = 0; i < len; i++) {
25+
if (part.indexOf(this.option[i]['part_url']) > -1) {
26+
return this.option[i]['after_hash'];
27+
}
28+
}
29+
}
30+
return !!temp;
31+
};
32+
33+
// 得到当前页面编码后的 ID
34+
siteLinker.getCurrenId = function () {
35+
var distinct_id = this.store.getDistinctId() || '',
36+
first_id = this.store.getFirstId() || '';
37+
if (this._.urlSafeBase64 && this._.urlSafeBase64.encode) {
38+
distinct_id = distinct_id ? this._.urlSafeBase64.trim(this._.urlSafeBase64.encode(this._.base64Encode(distinct_id))) : '';
39+
} else if (this._.rot13obfs) {
40+
distinct_id = distinct_id ? this._.rot13obfs(distinct_id) : '';
41+
}
42+
// 若有 first_id,则格式是 'f' + distinct_id,对应的旧版格式是 'u' + distinct_id
43+
// 否则格式是 'd' + distinct_id,对应的旧版格式是 'a' + distinct_id
44+
var urlId = first_id ? 'f' + distinct_id : 'd' + distinct_id;
45+
return encodeURIComponent(urlId);
46+
};
47+
48+
siteLinker.rewriteUrl = function (url, target) {
49+
var reg = /([^?#]+)(\?[^#]*)?(#.*)?/;
50+
var arr = reg.exec(url),
51+
nurl = '';
52+
if (!arr) {
53+
return;
54+
}
55+
var host = arr[1] || '',
56+
search = arr[2] || '',
57+
hash = arr[3] || '';
58+
var idIndex;
59+
if (this.getPartHash(url)) {
60+
idIndex = hash.indexOf('_sasdk');
61+
var queryIndex = hash.indexOf('?');
62+
if (queryIndex > -1) {
63+
if (idIndex > -1) {
64+
nurl = host + search + '#' + hash.substring(1, idIndex) + '_sasdk=' + this.getCurrenId();
65+
} else {
66+
nurl = host + search + '#' + hash.substring(1) + '&_sasdk=' + this.getCurrenId();
67+
}
68+
} else {
69+
nurl = host + search + '#' + hash.substring(1) + '?_sasdk=' + this.getCurrenId();
70+
}
71+
} else {
72+
idIndex = search.indexOf('_sasdk');
73+
var hasQuery = /^\?(\w)+/.test(search);
74+
if (hasQuery) {
75+
if (idIndex > -1) {
76+
nurl = host + '?' + search.substring(1, idIndex) + '_sasdk=' + this.getCurrenId() + hash;
77+
} else {
78+
nurl = host + '?' + search.substring(1) + '&_sasdk=' + this.getCurrenId() + hash;
79+
}
80+
} else {
81+
nurl = host + '?' + search.substring(1) + '_sasdk=' + this.getCurrenId() + hash;
82+
}
83+
}
84+
85+
if (target) {
86+
target.href = nurl;
87+
}
88+
return nurl;
89+
};
90+
91+
siteLinker.getUrlId = function () {
92+
/* eslint-disable no-useless-escape */
93+
var sa_id = location.href.match(/_sasdk=([aufd][^\?\#\&\=]+)/);
94+
if (this._.isArray(sa_id) && sa_id[1]) {
95+
var uid = decodeURIComponent(sa_id[1]);
96+
if (uid && (uid.substring(0, 1) === 'f' || uid.substring(0, 1) === 'd')) {
97+
if (this._.urlSafeBase64 && this._.urlSafeBase64.isUrlSafeBase64 && this._.urlSafeBase64.isUrlSafeBase64(uid)) {
98+
uid = uid.substring(0, 1) + this._.base64Decode(this._.urlSafeBase64.decode(uid.substring(1)));
99+
} else if (this._.rot13defs) {
100+
uid = uid.substring(0, 1) + this._.rot13defs(uid.substring(1));
101+
}
102+
}
103+
return uid;
104+
} else {
105+
return '';
106+
}
107+
};
108+
109+
siteLinker.setRefferId = function () {
110+
var distinct_id = this.store.getDistinctId();
111+
var urlId = this.getUrlId();
112+
if (urlId === '') {
113+
return false;
114+
}
115+
var isAnonymousId = urlId.substring(0, 1) === 'a' || urlId.substring(0, 1) === 'd';
116+
urlId = urlId.substring(1);
117+
118+
if (urlId === distinct_id) {
119+
return false;
120+
}
121+
if (urlId && isAnonymousId && this.store.getFirstId()) {
122+
this.sd.identify(urlId, true);
123+
this.sd.saEvent.send(
124+
{
125+
original_id: urlId,
126+
distinct_id: distinct_id,
127+
type: 'track_signup',
128+
event: '$SignUp',
129+
properties: {}
130+
},
131+
null
132+
);
133+
}
134+
if (urlId && isAnonymousId && !this.store.getFirstId()) {
135+
this.sd.identify(urlId, true);
136+
}
137+
if (urlId && !isAnonymousId && !this.store.getFirstId()) {
138+
this.sd.login(urlId);
139+
}
140+
};
141+
142+
siteLinker.addListen = function () {
143+
var that = this;
144+
var clickFn = function (event) {
145+
var target = event.target;
146+
var nodeName = target.tagName.toLowerCase();
147+
var parent_target = target.parentNode;
148+
var sasdk_url;
149+
var sasdk_target;
150+
if ((nodeName === 'a' && target.href) || (parent_target && parent_target.tagName && parent_target.tagName.toLowerCase() === 'a' && parent_target.href)) {
151+
if (nodeName === 'a' && target.href) {
152+
sasdk_url = target.href;
153+
sasdk_target = target;
154+
} else {
155+
sasdk_url = parent_target.href;
156+
sasdk_target = parent_target;
157+
}
158+
var location = that._.URL(sasdk_url);
159+
var protocol = location.protocol;
160+
if (protocol === 'http:' || protocol === 'https:') {
161+
if (that.getPart(sasdk_url)) {
162+
that.rewriteUrl(sasdk_url, sasdk_target);
163+
}
164+
}
165+
}
166+
};
167+
that._.addEvent(document, 'mousedown', clickFn);
168+
if (!!window.PointerEvent && 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints >= 0) {
169+
that._.addEvent(document, 'pointerdown', clickFn);
170+
}
171+
};
172+
173+
siteLinker.init = function (sd, option) {
174+
this.sd = sd;
175+
this._ = sd._;
176+
this.store = sd.store;
177+
this.para = sd.para;
178+
if (this._.isObject(option) && this._.isArray(option.linker) && option.linker.length > 0) {
179+
this.setRefferId();
180+
this.addListen();
181+
} else {
182+
sd.log('请配置打通域名参数!');
183+
return;
184+
}
185+
this.option = option.linker;
186+
this.option = resolveOption(this.option);
187+
188+
function resolveOption(option) {
189+
var len = option.length,
190+
arr = [];
191+
for (var i = 0; i < len; i++) {
192+
if (/[A-Za-z0-9]+\./.test(option[i].part_url) && Object.prototype.toString.call(option[i].after_hash) == '[object Boolean]') {
193+
arr.push(option[i]);
194+
} else {
195+
sd.log('linker 配置的第 ' + (i + 1) + ' 项格式不正确,请检查参数格式!');
196+
}
197+
}
198+
//option = arr;
199+
return arr;
200+
}
201+
};
202+
203+
var siteLinkerConcatUtm = siteLinker;
204+
var oldRewriteUrl = siteLinker.rewriteUrl;
205+
206+
// 重写 siteLinker 的 rewriteUrl 方法,原方法基础上拼接 utm 参数
207+
siteLinkerConcatUtm.rewriteUrl = function (url, target) {
208+
var me = this;
209+
var newUrl = oldRewriteUrl.call(this, url, target);
210+
211+
var reg = /([^?#]+)(\?[^#]*)?(#.*)?/;
212+
213+
// 获取 url 中的 search 参数,返回 object
214+
function getSearchParams(arr) {
215+
var obj = {};
216+
if (me._.isArray(arr)) {
217+
var temp_search = arr[2] || '';
218+
if (temp_search !== '') {
219+
var sArr = temp_search.slice(1).split('&');
220+
for (var i = 0; i < sArr.length; i++) {
221+
var tmp = sArr[i].split('=');
222+
obj[tmp[0]] = tmp[1];
223+
}
224+
}
225+
}
226+
return obj;
227+
}
228+
// 获取 url 中的 hash 参数,返回 object
229+
function getHashParams(arr) {
230+
var obj = {};
231+
if (me._.isArray(arr)) {
232+
var temp_hash = arr[3] || '';
233+
if (temp_hash !== '') {
234+
var temp = temp_hash.split('?');
235+
if (temp[1]) {
236+
var hArr = temp[1].split('&');
237+
for (var j = 0; j < hArr.length; j++) {
238+
var tmp = hArr[j].split('=');
239+
obj[tmp[0]] = tmp[1];
240+
}
241+
}
242+
}
243+
}
244+
return obj;
245+
}
246+
247+
// 拼接 utm
248+
// 解析当前页面的 url
249+
var curPage = reg.exec(location.href);
250+
var searchObj = getSearchParams(curPage);
251+
var hashObj = getHashParams(curPage);
252+
253+
// 来自 A 页面的 utm 参数
254+
var utm_type = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', '_channel_track_key'];
255+
// 用来处理 utm
256+
function utmHandler(arr) {
257+
var m = arr.length;
258+
while (m--) {
259+
var cur = arr.shift();
260+
var key = cur.split('=')[0];
261+
if (utm_type.indexOf(key) == -1) {
262+
arr.push(cur);
263+
}
264+
}
265+
return arr;
266+
}
267+
268+
var utmObj = {};
269+
this._.each(utm_type, function (type) {
270+
if (type in searchObj) {
271+
utmObj[type] = searchObj[type];
272+
}
273+
if (type in hashObj && !(type in utmObj)) {
274+
utmObj[type] = hashObj[type];
275+
}
276+
});
277+
278+
var resultUrl = '';
279+
if (!this._.isEmptyObject(utmObj)) {
280+
var utmStr = '';
281+
for (var key1 in utmObj) {
282+
utmStr += '&' + key1 + '=' + utmObj[key1];
283+
}
284+
285+
// 找 B 页面中的 utm 参数,有则删除
286+
// 解析 newUrl
287+
var new_arr = reg.exec(newUrl);
288+
var new_host = new_arr[1] || '';
289+
var new_search = new_arr[2] || '';
290+
var new_hash = new_arr[3] || '';
291+
resultUrl += new_host;
292+
293+
// 处理 search 部分的 utm 参数,均删除
294+
var search_arr = [];
295+
if (new_search !== '') {
296+
search_arr = utmHandler(new_search.slice(1).split('&'));
297+
if (search_arr.length) {
298+
resultUrl += '?' + search_arr.join('&');
299+
}
300+
}
301+
302+
// 处理 hash 部分的 utm 参数,均删除
303+
var hash_arr = [];
304+
// hash 片段中 ? 之前的部分
305+
var hash_first = '';
306+
// hash 片段中 ? 之后的部分
307+
var hash_second = '';
308+
if (new_hash !== '') {
309+
var temp = new_hash.split('?');
310+
hash_first = temp[0] || '';
311+
hash_second = temp[1] || '';
312+
resultUrl += hash_first;
313+
}
314+
if (hash_second !== '') {
315+
hash_arr = utmHandler(hash_second.split('&'));
316+
if (hash_arr.length) {
317+
resultUrl += '?' + hash_arr.join('&');
318+
}
319+
}
320+
321+
// 最后把 utm 参数拼接在 sasdk 参数之前
322+
var start = resultUrl.indexOf('_sasdk=');
323+
newUrl = resultUrl.slice(0, start) + utmStr.slice(1) + '&' + resultUrl.slice(start);
324+
}
325+
326+
if (target) {
327+
target.href = newUrl;
328+
}
329+
return newUrl;
330+
};
331+
332+
if (window.SensorsDataWebJSSDKPlugin && Object.prototype.toString.call(window.SensorsDataWebJSSDKPlugin) === '[object Object]') {
333+
window.SensorsDataWebJSSDKPlugin.SiteLinkerConcatUtm = window.SensorsDataWebJSSDKPlugin.SiteLinkerConcatUtm || siteLinkerConcatUtm;
334+
// 避免 SiteLinker 影响 SiteLinkerConcatUtm 插件功能
335+
window.SensorsDataWebJSSDKPlugin.SiteLinker = { init: function () {} };
336+
} else {
337+
window.SensorsDataWebJSSDKPlugin = {
338+
SiteLinkerConcatUtm: siteLinkerConcatUtm,
339+
SiteLinker: { init: function () {} }
340+
};
341+
}
342+
343+
return siteLinkerConcatUtm;
344+
345+
}());

plugins/site-linker-concat-utm.min.js

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

product/heatmap.full.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9420,7 +9420,7 @@
94209420

94219421
window.sa_jssdk_heatmap_render = function(se, data, type, url) {
94229422
sd = se;
9423-
sd.heatmap_version = '1.21.9';
9423+
sd.heatmap_version = '1.21.10';
94249424
_ = sd._;
94259425
_.querySelectorAll = function(val) {
94269426
if (typeof val !== 'string') {

0 commit comments

Comments
 (0)