Javascript Google Analytics来自一个文件://url

Javascript Google Analytics来自一个文件://url,javascript,google-analytics,cross-domain,Javascript,Google Analytics,Cross Domain,我们有一个ajaxy类的基于html的应用程序框架,希望google analytics能够使用它。我相信我们已经设置好了,可以在需要时手动调用\u trackPageview 然而,事情似乎没有得到报告。现在要么我没有让它正常工作,要么在url上使用文件://协议从javascript进行GA跟踪,悄悄地违反了一些我不知道的跨域策略 那么GA是否通过文件://处理本地html呢?还是我的GA使用有问题 请注意,我们使用的域实际上并不存在。我们希望使用类似于但是来自JavaScript的东西,而

我们有一个ajaxy类的基于html的应用程序框架,希望google analytics能够使用它。我相信我们已经设置好了,可以在需要时手动调用
\u trackPageview

然而,事情似乎没有得到报告。现在要么我没有让它正常工作,要么在url上使用
文件://
协议从javascript进行GA跟踪,悄悄地违反了一些我不知道的跨域策略

那么GA是否通过
文件://
处理本地html呢?还是我的GA使用有问题

请注意,我们使用的域实际上并不存在。我们希望使用类似于但是来自JavaScript的东西,而不是本机库。为了做到这一点,它看起来你设置了一个假域名,并告诉跟踪者它应该报告为哪个域名


在我的
的末尾:


好的,我想我已经解决了这个问题。这已经困扰我好几天了

根据,

访问者必须在浏览器中启用JavaScript、图像和cookie,以便分析报告他们的访问

我的理论是:在我对MacOSXSnowLeopard的测试中,从文件://运行的文档无法设置cookie。这是因为Cookie是HTTP专有的,当您从文件://运行某些内容时,您没有使用HTTP协议

由于您无法设置cookies,ga.js拒绝将_utm.gif请求发送到Google的服务器。没有饼干被设置;没有向google发送任何请求,因此GA中没有任何内容

解决方案:使用一个开发环境,您可以将域设置为(类似于MAMP,如果您在Mac上并且需要LAMP堆栈)

(奇怪的脚注:我观察到一些奇怪的行为,GA Cookie将设置为来自第三方非CDN域的无关导入脚本的域的第三方Cookie。这可能是因为服务器随文件发送HTTP Cookie,GA.js将自身附加到该域。但是,这不会用作后门,因为它是till不会将_utm.gif点击发送到谷歌的服务器)

========

编辑:

您可以尝试人们为无cookie GA跟踪创建的各种解决方案之一

您可能会从该工具中获得一些成功,如下所述:

您可以不使用所有GA代码,而是包括脚本,然后使用以下代码调用它:

gaTrack('UA-XXXACCOUNTID-XX', 'myfake.domain.com', '/some/path/here');
它是为bookmarklet/injected脚本跟踪而设计的,但是如果我设置file://type,它就能够成功地发送uu utm.gif命中,这意味着它应该能够在GA中成功跟踪


缺点是cookieless意味着它无法准确跟踪访问,只能跟踪页面视图级别的数据。

最终通过resize hack消息传递机制在iframe中出现复杂反弹

本地文件在我们的服务器上包含一个iframe。当我们想要跟踪一个GA调用时,我们用我们需要的信息更改它的url哈希值
#u trackEvent,foo,bar
,然后更改iframe的宽度。在iframe中,
onresize()
函数被触发,并允许我们通过检查哈希值来提交GA调用

尽管我非常讨厌这种黑客行为,但它可以完美地工作!

任务通过将其设置为null,允许您从
文件中跟踪分析://
url:

ga('create', 'UA-XXXXX-Y', 'auto');
ga('set', 'checkProtocolTask', null); // Disable file protocol checking.
ga('set', 'checkStorageTask', null); // Disable cookie storage checking.
ga('set', 'historyImportTask', null); // Disable history checking (requires reading from cookies).
ga('send', 'pageview');

需要进行一些调整:

禁用cookie存储 Cookie无法使用,因为没有域在运行,所以我们需要阻止GA尝试使用它们。 这是通过在创建配置()中设置
'storage':'none'
完成的

禁用文件协议检查 默认情况下,如果协议(在我们的例子中是
文件
)不是
http
https
,GA将中止。 使用相应的:
ga('set','checkProtocolTask',null)禁用此检查。

手动设置活动页面 由于没有域,GA无法导出表示活动页的路径。 可以通过使用:
ga('set','page','foobar')

随后的
ga('send','pageview')
将以访问
/foobar
的形式显示在数据中

使用localStorage跟踪用户标识(可选) 禁用Cookie后,不会跨页面加载跟踪用户,因此每次刷新都会触发对另一个唯一访问者的检测。 但是,我们可以通过设置
“clientId”:localStorage.getItem(someKey)
在创建时提供自定义,它查找以前存储的客户端ID

存储ID是由

ga(function(tracker) {
  localStorage.setItem(someKey, tracker.get('clientId'));
})
一切结合在一起 结合以上所有步骤,我们得出如下结论:

(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-XXXXXXXX-Y', {
    'storage': 'none',
    'clientId': localStorage.getItem('ga:clientId')
});
ga(function(tracker) {
    localStorage.setItem('ga:clientId', tracker.get('clientId'));
});
ga('set', 'checkProtocolTask', null);

ga('set', 'page', 'myPage');
ga('send', 'pageview');
这是我的代码,它是有效的

函数sendData()
{
window.dataLayer=window.dataLayer | |[];
函数gtag(){dataLayer.push(参数);}
gtag('js',新日期());
gtag(“配置”、“UA-148029185-2”);
ga(‘创建’、‘UA-148029185-2’{
“存储”:“无”,
'clientId':localStorage.getItem('ga:clientId')
});
ga(功能(跟踪器){
setItem('ga:clientId',tracker.get('clientId');
});
ga('set','checkProtocolTask',null);
ga('set','page','/xxxxxxxx');
ga(‘发送’、‘页面浏览’);
}

我看不到任何信息暗示
script
标记在
文件://
资源上的工作方式不同。(在其他地方检查)但可能GA会阻止这一点?在我的例子中,这主要是webkit支持的浏览器。你在控制台中收到错误消息吗?没有任何输出。但我可以告诉你,
\u gaq
是一个看起来被google analytics加载了大量功能的对象。包括
push()
你已经看过GA了吗?我明白了。显然,为
文件设置cookies://
会很奇怪,因为没有域。但在我的情况下,运行本地服务器不会真正起作用。我想我不能通过JS使用它,dang。
访问者必须在浏览器中启用JavaScript、图像和cookies,才能进行分析报告他们的访问。
是的,我同意使用JavaScri
ga(function(tracker) {
  localStorage.setItem(someKey, tracker.get('clientId'));
})
(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-XXXXXXXX-Y', {
    'storage': 'none',
    'clientId': localStorage.getItem('ga:clientId')
});
ga(function(tracker) {
    localStorage.setItem('ga:clientId', tracker.get('clientId'));
});
ga('set', 'checkProtocolTask', null);

ga('set', 'page', 'myPage');
ga('send', 'pageview');
<script>
function sendData()
{
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-148029185-2');

ga('create', 'UA-148029185-2', {
    'storage': 'none',
    'clientId': localStorage.getItem('ga:clientId')
});
ga(function(tracker) {
    localStorage.setItem('ga:clientId', tracker.get('clientId'));
});
ga('set', 'checkProtocolTask', null);

ga('set', 'page', '/xxxxxxxx');
ga('send', 'pageview');
}
</script>

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-148029185-2" onload="sendData()"></script>