123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- (function ($) {
- Drupal.googleanalytics = {};
- $(document).ready(function() {
- // Attach mousedown, keyup, touchstart events to document only and catch
- // clicks on all elements.
- $(document.body).bind("mousedown keyup touchstart", function(event) {
- console.group("Running Google Analytics for Drupal.");
- console.info("Event '%s' has been detected.", event.type);
- // Catch the closest surrounding link of a clicked element.
- $(event.target).closest("a,area").each(function() {
- console.info("Closest element '%o' has been found. URL '%s' extracted.", this, this.href);
- // Is the clicked URL internal?
- if (Drupal.googleanalytics.isInternal(this.href)) {
- // Skip 'click' tracking, if custom tracking events are bound.
- if ($(this).is('.colorbox') && (Drupal.settings.googleanalytics.trackColorbox)) {
- // Do nothing here. The custom event will handle all tracking.
- console.info("Click on .colorbox item has been detected.");
- }
- // Is download tracking activated and the file extension configured for download tracking?
- else if (Drupal.settings.googleanalytics.trackDownload && Drupal.googleanalytics.isDownload(this.href)) {
- // Download link clicked.
- console.info("Download url '%s' has been found. Tracked download as extension '%s'.", Drupal.googleanalytics.getPageUrl(this.href), Drupal.googleanalytics.getDownloadExtension(this.href).toUpperCase());
- ga("send", {
- "hitType": "event",
- "eventCategory": "Downloads",
- "eventAction": Drupal.googleanalytics.getDownloadExtension(this.href).toUpperCase(),
- "eventLabel": Drupal.googleanalytics.getPageUrl(this.href),
- "transport": "beacon"
- });
- }
- else if (Drupal.googleanalytics.isInternalSpecial(this.href)) {
- // Keep the internal URL for Google Analytics website overlay intact.
- console.info("Click on internal special link '%s' has been tracked.", Drupal.googleanalytics.getPageUrl(this.href));
- ga("send", {
- "hitType": "pageview",
- "page": Drupal.googleanalytics.getPageUrl(this.href),
- "transport": "beacon"
- });
- }
- else {
- // e.g. anchor in same page or other internal page link
- console.info("Click on internal link '%s' detected, but not tracked by click.", this.href);
- }
- }
- else {
- if (Drupal.settings.googleanalytics.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) {
- // Mailto link clicked.
- console.info("Click on e-mail '%s' has been tracked.", this.href.substring(7));
- ga("send", {
- "hitType": "event",
- "eventCategory": "Mails",
- "eventAction": "Click",
- "eventLabel": this.href.substring(7),
- "transport": "beacon"
- });
- }
- else if (Drupal.settings.googleanalytics.trackOutbound && this.href.match(/^\w+:\/\//i)) {
- if (Drupal.settings.googleanalytics.trackDomainMode !== 2 || (Drupal.settings.googleanalytics.trackDomainMode === 2 && !Drupal.googleanalytics.isCrossDomain(this.hostname, Drupal.settings.googleanalytics.trackCrossDomains))) {
- // External link clicked / No top-level cross domain clicked.
- console.info("Outbound link '%s' has been tracked.", this.href);
- ga("send", {
- "hitType": "event",
- "eventCategory": "Outbound links",
- "eventAction": "Click",
- "eventLabel": this.href,
- "transport": "beacon"
- });
- }
- else {
- console.info("Internal link '%s' clicked, not tracked.", this.href);
- }
- }
- }
- });
- console.groupEnd();
- });
- // Track hash changes as unique pageviews, if this option has been enabled.
- if (Drupal.settings.googleanalytics.trackUrlFragments) {
- window.onhashchange = function() {
- console.info("Track URL '%s' as pageview. Hash '%s' has changed.", location.pathname + location.search + location.hash, location.hash);
- ga("send", {
- "hitType": "pageview",
- "page": location.pathname + location.search + location.hash
- });
- };
- }
- // Colorbox: This event triggers when the transition has completed and the
- // newly loaded content has been revealed.
- if (Drupal.settings.googleanalytics.trackColorbox) {
- $(document).bind("cbox_complete", function () {
- var href = $.colorbox.element().attr("href");
- if (href) {
- console.info("Colorbox transition to url '%s' has been tracked.", Drupal.googleanalytics.getPageUrl(href));
- ga("send", {
- "hitType": "pageview",
- "page": Drupal.googleanalytics.getPageUrl(href)
- });
- }
- });
- }
- });
- /**
- * Check whether the hostname is part of the cross domains or not.
- *
- * @param string hostname
- * The hostname of the clicked URL.
- * @param array crossDomains
- * All cross domain hostnames as JS array.
- *
- * @return boolean
- */
- Drupal.googleanalytics.isCrossDomain = function (hostname, crossDomains) {
- /**
- * jQuery < 1.6.3 bug: $.inArray crushes IE6 and Chrome if second argument is
- * `null` or `undefined`, https://bugs.jquery.com/ticket/10076,
- * https://github.com/jquery/jquery/commit/a839af034db2bd934e4d4fa6758a3fed8de74174
- *
- * @todo: Remove/Refactor in D8
- */
- if (!crossDomains) {
- return false;
- }
- else {
- return $.inArray(hostname, crossDomains) > -1 ? true : false;
- }
- };
- /**
- * Check whether this is a download URL or not.
- *
- * @param string url
- * The web url to check.
- *
- * @return boolean
- */
- Drupal.googleanalytics.isDownload = function (url) {
- var isDownload = new RegExp("\\.(" + Drupal.settings.googleanalytics.trackDownloadExtensions + ")([\?#].*)?$", "i");
- return isDownload.test(url);
- };
- /**
- * Check whether this is an absolute internal URL or not.
- *
- * @param string url
- * The web url to check.
- *
- * @return boolean
- */
- Drupal.googleanalytics.isInternal = function (url) {
- var isInternal = new RegExp("^(https?):\/\/" + window.location.host, "i");
- return isInternal.test(url);
- };
- /**
- * Check whether this is a special URL or not.
- *
- * URL types:
- * - gotwo.module /go/* links.
- *
- * @param string url
- * The web url to check.
- *
- * @return boolean
- */
- Drupal.googleanalytics.isInternalSpecial = function (url) {
- var isInternalSpecial = new RegExp("(\/go\/.*)$", "i");
- return isInternalSpecial.test(url);
- };
- /**
- * Extract the relative internal URL from an absolute internal URL.
- *
- * Examples:
- * - https://mydomain.com/node/1 -> /node/1
- * - https://example.com/foo/bar -> https://example.com/foo/bar
- *
- * @param string url
- * The web url to check.
- *
- * @return string
- * Internal website URL
- */
- Drupal.googleanalytics.getPageUrl = function (url) {
- var extractInternalUrl = new RegExp("^(https?):\/\/" + window.location.host, "i");
- return url.replace(extractInternalUrl, '');
- };
- /**
- * Extract the download file extension from the URL.
- *
- * @param string url
- * The web url to check.
- *
- * @return string
- * The file extension of the passed url. e.g. "zip", "txt"
- */
- Drupal.googleanalytics.getDownloadExtension = function (url) {
- var extractDownloadextension = new RegExp("\\.(" + Drupal.settings.googleanalytics.trackDownloadExtensions + ")([\?#].*)?$", "i");
- var extension = extractDownloadextension.exec(url);
- return (extension === null) ? '' : extension[1];
- };
- })(jQuery);
|