在欧盟,有一项Cookie法律要求您在用户表示同意后,通过点击,滚动或导航等方式加载第三方脚本。所以我通过执行在文档加载后调用的函数来加载3个脚本。这是代码:
问题在于它并不总是有效,也不总是失败。我看到了会话和活动,但我也知道有一些事实是访问不会触发脚本,因为当我在其他几台计算机上自己测试时,并非所有活动都保存在分析中。
我应该在函数中修复什么才能让它一直工作?
答案 0 :(得分:11)
$(document).ajaxComplete(function() {
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview']);
var loadGoogleAnalytics = function(){
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
}
});
答案 1 :(得分:5)
其他回应似乎是针对ga.js这是遗留的,而你的问题似乎是针对analytics.js(当前)。
稍微研究analytics.js片段,您可以轻松找到答案(下面,格式更漂亮):
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}), (i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(
window,
document,
"script",
"https://www.google-analytics.com/analytics.js",
"ga"
);
ga("create", "UA-XXXXX-Y", "auto");
ga("send", "pageview");
诀窍很简单:Google会创建一个全局变量GoogleAnalyticsObject
,这是一个代表全球GoogleAnalytics名称的字符串。默认情况下,您可以看到"ga"
。
因此,在加载时你需要创建两个全局变量:GoogleAnalyticsObject,它是一个字符串和窗口[GoogleAnalyticsObject],它是函数(它只是累积事件,当我加载lib时会替换此函数)。然后,当您的用户接受cookie时,您可以加载lib并完成:)
答案 2 :(得分:4)
你可以尝试使用这个对我有用的功能:
function loadGoogleAnalytics(trackingId) {
var deferred = $q.defer();
function loadScript() {
var scriptId = 'google-analytics';
if (document.getElementById(scriptId)) {
deferred.resolve();
return;
}
var s = document.createElement('script');
s.id = scriptId;
s.innerText = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', '" + trackingId + "', 'auto');";
// most browsers
s.onload = initGA();
// IE 6 & 7
s.onreadystatechange = function () {
if (this.readyState == 'complete') {
initGA();
}
}
document.getElementsByTagName('head')[0].appendChild(s);
}
$window.initGA = function () {
deferred.resolve();
}
loadScript();
return deferred.promise;
}
答案 3 :(得分:4)
如果您查看this帖子,可以稍微修改一下以达到您想要的效果:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview']);
var loadGoogleAnalytics = function(){
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
}
</script>
然后只要用户同意您的Cookie使用显示
,就可以致电loadGoogleAnalytics()
答案 4 :(得分:4)
您可以尝试添加以下内容,而不是调用.innerHTML()
//...text above...
TheAnalyticsScript.text = ['ga-script-string', 'fb-script.string','hotjar.string'].join('\n');
$('body').append(TheAnalyticsScript);
如果有效,请告诉我。
答案 5 :(得分:3)
这是我对这个问题的选择。该解决方案只是将默认脚本修补为return函数,然后只有在获得同意后才添加script
标记。看看:
// for GoogleAnalytics
var loadGA = (function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
},
i[r].l = 1 * new Date();
// call this function after receiving consent
return function loadGA() {
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
}
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
// for Facebook
window.fbAsyncInit = function() {
FB.init({
appId: 'your-app-id',
autoLogAppEvents: true,
xfbml: true,
version: 'v2.10'
});
FB.AppEvents.logPageView();
};
var loadFB = (function(d, s, id) {
//- call this function after receiving consent
return function loadFB() {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {
return;
}
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, 'script', 'facebook-jssdk'));
// for HotJar
var loadHJ = (function(h, o, t, j, a, r) {
h.hj = h.hj || function() {
(h.hj.q = h.hj.q || []).push(arguments)
};
h._hjSettings = {
hjid: 1,
hjsv: 5
};
return function loadHJ() {
a = o.getElementsByTagName('head')[0];
r = o.createElement('script');
r.async = 1;
r.src = t + h._hjSettings.hjid + j + h._hjSettings.hjsv;
a.appendChild(r);
}
})(window, document, '//static.hotjar.com/c/hotjar-', '.js?sv=');
// finally when you receive the consent
function onConsentReceived() {
loadGA();
loadFB();
loadHJ();
}
//- meanwhile you can continue using ga(), hj() whatever here...
每个加载器都可以在其自己的script
标记中,但要确保这些标记的顺序。
答案 6 :(得分:0)
考虑你的代码的作用,这个函数:
<script>
元素<head>
请注意,<head>
只能在初始加载时加载。根据浏览器的实现情况,可能会出现一些访问者的浏览器忽略您在页面加载完成后添加的<script>
标记。
如果我明白你想做什么事你想要的话:
注意:许多欧盟网站在Cookie同意后重新加载页面,因为他们使用后端呈现将<script>
标记跟踪添加到页面。通常单击“我同意cookie”,他们会存储agreed: true
类型的cookie,用于更改其服务器发送的网页。
更改您的功能以运行跟踪代码,而不是将其添加到DOM。
只需查看跟踪代码并将其分解为易于阅读的代码。例如,Ga代码实际上只是:
var ga = document.createElement('script')
ga.type = 'text/javascript'
ga.async = true
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
然后
function addTrackers() {
// Execute the tracking things instead of adding them to the DOM
}
答案 7 :(得分:0)
不是附加整个分析脚本,而是可以将其包含在内,但请删除以下行:
ga("send", "pageview");
然后,当用户接受cookie时,激活使用上面同一行发送信标的分析功能。除非被特别告知,否则Google Analytics实际上不会发送任何数据。这是做你正在尝试的最合乎逻辑的方式。