Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@googlemail.com>2014-09-03 21:26:55 +0400
committerThomas Steur <thomas.steur@googlemail.com>2014-09-03 21:26:55 +0400
commit4a439299d1b067b2d02d0cd8da37405b97a565af (patch)
treebffddb06db98eb3ef9539ecc8e065907a5a18bb1 /js
parent71c76ffd4435344024c3a9ef332daab8f908572f (diff)
refs #4996 handle interactions better / correct. Code not tested at all yet. Gonna write some tests
Diffstat (limited to 'js')
-rw-r--r--js/piwik.js160
1 files changed, 109 insertions, 51 deletions
diff --git a/js/piwik.js b/js/piwik.js
index d7207c6fd9..b8c027f333 100644
--- a/js/piwik.js
+++ b/js/piwik.js
@@ -1546,11 +1546,33 @@ if (typeof Piwik !== 'object') {
isNodeVisible: function (node) {
return isVisible(node) && this.isNodeInViewport(node);
},
- buildInteractionRequestParams: function (name, piece, interaction)
+ buildInteractionRequestParams: function (interaction, name, piece, target)
{
- return 'c_n=' + encodeWrapper(name) +
- '&c_p=' + encodeWrapper(piece) +
- '&c_i=' + encodeWrapper(interaction);
+ var params = '';
+
+ if (interaction) {
+ params += 'c_i='+ encodeWrapper(interaction);
+ }
+ if (name) {
+ if (params) {
+ params += '&';
+ }
+ params += 'c_n='+ encodeWrapper(name);
+ }
+ if (piece) {
+ if (params) {
+ params += '&';
+ }
+ params += '&c_p='+ encodeWrapper(piece);
+ }
+ if (target) {
+ if (params) {
+ params += '&';
+ }
+ params += '&c_t='+ encodeWrapper(target);
+ }
+
+ return params;
},
buildImpressionRequestParams: function (name, piece, target)
{
@@ -1593,22 +1615,6 @@ if (typeof Piwik !== 'object') {
return contents;
},
- addClickEventIfInternalLink: function (node, callback) {
- addEventListener(node, 'click', function (event) {
- var url = content.findInternalTargetLink(node);
- if (!url) {
- return;
- }
-
- if (event.preventDefault) {
- event.preventDefault();
- } else {
- event.returnValue = false;
- }
-
- callback(url);
- });
- },
findInternalTargetLink: function (node)
{
var clickNode = this.findTargetNode(node);
@@ -1630,10 +1636,6 @@ if (typeof Piwik !== 'object') {
return;
}
- if (0 === (''+ link).indexOf('#')) {
- return;
- }
-
if (link !== this.removeDomainIfIsUrl(link)) {
return; // outlink or download?
}
@@ -1645,21 +1647,18 @@ if (typeof Piwik !== 'object') {
var clickNode = this.findTargetNode(node);
if (!clickNode) {
- return false;
+ return;
}
var elementName = clickNode.nodeName.toLowerCase();
if (elementName !== 'a') {
- return false;
+ return;
}
if (clickNode && clickNode.setAttribute) {
clickNode.setAttribute('href', url);
- return true;
}
-
- return false;
}
};
@@ -2686,7 +2685,7 @@ if (typeof Piwik !== 'object') {
}
}
- function appendContentInteractionToRequestIfPossible(request, anyNode, targetFallback)
+ function appendContentInteractionToRequestIfPossible(request, anyNode, interaction, fallbackTarget)
{
if (!anyNode || !request) {
@@ -2707,17 +2706,15 @@ if (typeof Piwik !== 'object') {
return;
}
- if (!contentPiece.target && targetFallback) {
- contentPiece.target = targetFallback;
- } else if (!contentPiece.target) {
- contentPiece.target = 'Unknown';
+ if (!content.target && fallbackTarget) {
+ content.target = fallbackTarget;
}
if (request) {
request += '&';
}
- request += content.buildInteractionRequestParams(contentPiece.name, contentPiece.piece, contentPiece.target);
+ request += content.buildInteractionRequestParams(interaction, contentPiece.name, contentPiece.piece, contentPiece.target);
return request;
}
@@ -2748,16 +2745,32 @@ if (typeof Piwik !== 'object') {
return base + url
}
- function buildTrackingRedirectUrl(url) {
+ function buildContentInteractionTrackingRedirectUrl(url, contentName, contentPiece, contentTarget) {
if (0 === url.indexOf(configTrackerUrl)) {
return url;
}
var redirectUrl = toAbsoluteUrl(url);
- var request = getRequest('redirecturl=' + redirectUrl + '&c_i=' + url + '&' + buildEventRequest('Content', 'click', url, ''));
+ var request = buildContentInteractionTrackingRequest(url, contentName, contentPiece, contentTarget);
+ request += '&redirecturl=' + redirectUrl;
+
return configTrackerUrl + (configTrackerUrl.indexOf('?') < 0 ? '?' : '&') + request;
}
+ function buildContentInteractionTrackingRequest(url, contentName, contentPiece, contentTarget) {
+ if (0 === url.indexOf(configTrackerUrl)) {
+ return url;
+ }
+
+
+ var contentInteraction = 'click';
+
+ var params = content.buildInteractionRequestParams(contentInteraction, contentName, contentPiece, contentTarget);
+
+ var request = getRequest(params + buildEventRequest('Content', contentInteraction, url, ''));
+ return request;
+ }
+
function wasContentImpressionAlreadyTracked(content)
{
if (!trackedContentImpressions || !trackedContentImpressions.length) {
@@ -2841,23 +2854,68 @@ if (typeof Piwik !== 'object') {
}
for (index = 0; index < contentNodes.length; index++) {
- // TODO we should actually replace the link on the target node, not on the content node !!!IMPORTANT
- var internalLink = content.findInternalTargetLink(contentNodes[index]);
- if (internalLink) {
- content.replaceTargetLink(contentNodes[index], buildTrackingRedirectUrl(internalLink));
+ // TODO should we consult getLinkType()?
+ var targetNode = content.findTargetNode(contentNodes[index]);
+
+ if (!targetNode) {
+ continue;
}
- content.addClickEventIfInternalLink(contentNodes[index], function (url) {
- var targetUrl = buildTrackingRedirectUrl(internalLink);
+ if (targetNode && targetNode.contentTrackingRedirectSetupDone) {
+ continue;
+ }
+
+ targetNode.contentTrackingRedirectSetupDone = true;
+
+ if (targetNode.nodeName.toLowerCase() === 'a' &&
+ query.hasNodeAttributeWithValue(targetNode, 'href')) {
+
+ var internalLink = content.findInternalTargetLink(contentNodes[index]);
+
+ if (internalLink) {
+
+ content.replaceTargetLink(targetNode, buildTrackingRedirectUrl(internalLink));
+
+ addEventListener(targetNode, 'click', function () {
+ var url = content.findInternalTargetLink(this);
+ if (!url) {
+ return;
+ }
+
+ var contentName = content.findContentName(this);
+ var contentPiece = content.findContentPiece(this);
+ var contentTarget = content.findContentTarget(this);
- // location.href does not respect target=_blank so we prefer to use this
- var replaced = content.replaceTargetLink(contentNodes[index], targetUrl);
+ if (0 === internalLink.indexOf('#')) {
+ var request = buildContentInteractionTrackingRequest('click', contentName, contentPiece, contentTarget);
+ sendRequest(request);
+ } else {
+ var targetUrl = buildContentInteractionTrackingRedirectUrl(internalLink, contentName, contentPiece, contentTarget);
+
+ // location.href does not respect target=_blank so we prefer to use this
+ content.replaceTargetLink(content.findTargetNode(this), targetUrl);
+ }
- if (!replaced) {
- // fallback to location.href
- location.href = targetUrl;
+ });
+
+ } else {
+ // outlink or download
}
- });
+
+ } else {
+ // trigger event
+
+ addEventListener(targetNode, 'click', function () {
+ var contentName = content.findContentName(this);
+ var contentPiece = content.findContentPiece(this);
+ var contentTarget = content.findContentTarget(this);
+
+ var request = buildContentInteractionTrackingRequest('', contentName, contentPiece, contentTarget);
+
+ sendRequest(request);
+ });
+ }
+
}
var index, request;
@@ -2901,7 +2959,7 @@ if (typeof Piwik !== 'object') {
function logContentInteraction(contentName, contentPiece, contentInteraction)
{
- var params = content.buildInteractionRequestParams(contentName, contentPiece, contentInteraction);
+ var params = content.buildInteractionRequestParams(contentInteraction, contentName, contentPiece);
if (!params) {
return;
@@ -2980,7 +3038,7 @@ if (typeof Piwik !== 'object') {
var linkParams = linkType + '=' + encodeWrapper(purify(url));
- linkParams = appendContentInteractionToRequestIfPossible(linkParams, sourceElement, url);
+ linkParams = appendContentInteractionToRequestIfPossible(linkParams, sourceElement, 'click', url);
var request = getRequest(linkParams, customData, 'link');
sendRequest(request, (callback ? 0 : configTrackerPause), callback);