我正在使用AngularJS作为前端搭建一个新的应用程序。客户端的所有内容都是通过HTML5 pushstate完成的,我想要能够在Google Analytics中跟踪我的页面浏览量。
我正在使用AngularJS作为前端搭建一个新的应用程序。客户端的所有内容都是通过HTML5 pushstate完成的,我想要能够在Google Analytics中跟踪我的页面浏览量。
如果你在你的Angular应用中使用了ng-view
,你可以监听$viewContentLoaded
事件,并向Google Analytics推送跟踪事件。
假设你已经在主要的index.html文件中设置了跟踪代码为名为var _gaq
,并且MyCtrl是你在ng-controller
指令中定义的名称。
function MyCtrl($scope, $location, $window) {
$scope.$on('$viewContentLoaded', function(event) {
$window._gaq.push(['_trackPageView', $location.url()]);
});
}
更新:对于新版本的Google Analytics,请使用此代码
function MyCtrl($scope, $location, $window) {
$scope.$on('$viewContentLoaded', function(event) {
$window.ga('send', 'pageview', { page: $location.url() });
});
}
_trackPageview
而不是 _trackPageView
...我曾经费了10分钟来考虑这个问题 :) - sajal$rootScope.$on('$routeChangeSuccess', ...)
。 - bearfriend$rootScope
将保证它不会被其他事件或DOM更改所删除,并且使用 routeChangeSuccess
将在每次位置栏更改时触发,而不仅仅是每次更改视图源模板时。这讲得通吗? - bearfriend$window.ga('send', 'pageview', { page: $location.path() });
,而不是 $window._gaq...
的部分。此外,您可能需要从原始的 GA 代码中删除 ga('send', 'pageview');
,以防止在首次进入页面时出现重复。 - CWSpear在AngularJS
中,当一个新视图被加载时,Google Analytics不会将其视为新的页面加载。幸运的是,有一种方法可以手动告诉GA将URL记录为新的页面视图。
_gaq.push(['_trackPageview', '<url>']);
可以完成此任务,但如何将其绑定到AngularJS?
这里有一个可以使用的服务:
(function(angular) {
angular.module('analytics', ['ng']).service('analytics', [
'$rootScope', '$window', '$location', function($rootScope, $window, $location) {
var track = function() {
$window._gaq.push(['_trackPageview', $location.path()]);
};
$rootScope.$on('$viewContentLoaded', track);
}
]);
}(window.angular));
当您定义 Angular 模块时,可以像这样包含分析模块:
angular.module('myappname', ['analytics']);
更新:
你应该使用新的Universal Google Analytics跟踪代码:
$window.ga('send', 'pageview', {page: $location.url()});
这将允许您在**app.run()**函数中使用
googleAnalytics.track();` - zcoonapp.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function(){
ga('send', 'pageview', $location.path());
});
});
app.run([" $rootScope","$location",function(...
- dplass仅需简单补充。如果你正在使用新版analytics.js,则:
var track = function() {
ga('send', 'pageview', {'page': $location.path()});
};
此外,一个提示是 Google Analytics 不会在本地主机上触发。因此,如果您在本地主机上进行测试,请使用以下内容而不是默认创建(完整文档)。
ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});
$window
来访问窗口(在 Angular 中,仅使用 ga
很可能是 undefined
)。另外,您可能希望从原始的 GA 代码中移除 ga('send', 'pageview');
,以防止在首次着陆页面时产生重复。 - CWSpear$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { ga('send', 'pageview', { 'page': $location.path(), 'title': toState.name }); });
。 - pherris$location.url()
来跟踪它们。 - Ade我创建了一个服务和筛选器,可以帮助你们解决这个问题,并且如果你选择在将来添加其他提供商,也可能有所帮助。
请查看https://github.com/mgonto/angularytics,并让我知道这对你有何帮助。
对我来说,将wynnwu和dpineda的答案合并起来是有效的。
angular.module('app', [])
.run(['$rootScope', '$location', '$window',
function($rootScope, $location, $window) {
$rootScope.$on('$routeChangeSuccess',
function(event) {
if (!$window.ga) {
return;
}
$window.ga('send', 'pageview', {
page: $location.path()
});
});
}
]);
将第三个参数设置为一个对象(而不仅仅是$location.path()),并使用$routeChangeSuccess而不是$stateChangeSuccess就解决了问题。
希望这可以帮到你。
/account/:accountId
即路径为http://somesite.com/account/123
它现在将把路径报告为/account?accountId=123
。 - SnIcK我发现 gtag()
函数可用,而不是 ga()
函数。
在 index.html 文件中,在 <head>
部分中:
<script async src="https://www.googletagmanager.com/gtag/js?id=TrackingId"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'TrackingId');
</script>
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function() {
gtag('config', 'TrackingId', {'page_path': $location.path()});
});
});
将TrackingId
替换为您自己的跟踪ID。
index.html
中,复制并粘贴ga代码片段,但删除ga('send', 'pageview');
这一行。<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<script>
(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', 'UA-XXXXXXXX-X');
</script>
我希望将其放在一个独立的工厂文件中my-google-analytics.js
并进行自我注入:
angular.module('myApp')
.factory('myGoogleAnalytics', [
'$rootScope', '$window', '$location',
function ($rootScope, $window, $location) {
var myGoogleAnalytics = {};
/**
* Set the page to the current location path
* and then send a pageview to log path change.
*/
myGoogleAnalytics.sendPageview = function() {
if ($window.ga) {
$window.ga('set', 'page', $location.path());
$window.ga('send', 'pageview');
}
}
// subscribe to events
$rootScope.$on('$viewContentLoaded', myGoogleAnalytics.sendPageview);
return myGoogleAnalytics;
}
])
.run([
'myGoogleAnalytics',
function(myGoogleAnalytics) {
// inject self
}
]);
page
设置为当前路径,然后将其作为pageview
提交?这样做与仅使用$window.ga('send', 'pageview',{page:$location.url()});
有何不同之处? - Fizzix最佳方法是使用Google Tag Manager根据历史记录监听器触发您的Google Analytics标签。这些内置于GTM接口中,可以轻松地跟踪客户端HTML5交互。
启用内置的History变量,并创建一个触发器,根据历史记录更改触发事件。