Tracking de clic dans une iframe

Tracking de clic dans une iframe

Tutoriel publié en mars 2013 par Galdon dans la catégorie jQuery

En utilisant javascript il est très facile de détecter les clics sur n'importe quel élément d'une page web, c'est encore plus facile avec un framework comme jQuery. Par contre c'est impossible à faire sur une iframe et son contenu.

La raison à ça est assez simple à comprendre : une iframe c'est comme un navigateur imbriqué dans une page web (exactement comme si la page ciblée par l'iframe se trouvait dans un autre onglet ou dans une autre fenêtre de navigateur).

En javascript, on n’a pas accès aux autres onglets pour des raisons évidentes de sécurité, et bien pour les iframe c'est la même chose, les navigateurs ne donnent pas accès au contenu d'une iframe via Javascript.

Lorsque l'iframe se trouve sur le même domaine que la page parente, le navigateur donne accès au contenu de l'iframe depuis la page parente, et vice-versa, mais c'est la seule exception à ces règles de sécurité.

Pourtant, il est quand même possible de détecter les clics sur une iframe en utilisant habillement l'événement blur et quelques variables...

Dans ce tutoriel, je vais donc vous présenter une technique "maison" qui permet de faire du tracking de clics sur une iframe (en utilisant jQuery), que l'on peut utiliser pour de nombreuses applications : tracking de clic sur un bouton "J'aime" Facebook, un bouton Google +1, un player youtube ou encore les clics sur les annonces Google Adsense (ou une autre régie de pub).

C'est parti !

Tracking de clic sur une iframe

Dans cette partie, je vais vous expliquer le fonctionnement général, le principe qui permet de détecter les clics.

Pour ça, on va travailler sur une page web très simple qui contient une iframe, comme ceci :

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Tracker les clics dans une iframe avec jQuery</title>
	<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap.min.css" rel="stylesheet">
	<style>
	body{background:#efefef; padding:15px 20px;}
	.iframetrack{margin:20px 0;}
	#consoleDebug{position:fixed; top:30px; right:30px; z-index:9999; background:rgba(0,0,0,0.3);}
	#consoleDebug .alert{margin:20px;}
	</style>
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
	<p>Element actif : <span class="label" id="actif"></span></p>
	<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa. Sed eleifend nonummy diam.</p>
	<div class="iframetrack">
		<iframe width="468" height="110" src="./sample-iframe/red.html" frameborder="0" allowtransparency="true" scrolling="no"></iframe>
	</div>
	<p>Sed eleifend nonummy diam. Praesent mauris ante, elementum et, bibendum at, posuere sit amet, nibh.</p>
	<div id="consoleDebug"></div>
</body>
</html>

Le div #consoleDebug va simplement servir à afficher un message à chaque fois qu'un clic est détecté.

Au chargement d'une page web, le navigateur donne par défaut le focus à l'élément <body>, qui correspond en gros à toute la page web.

Qu'est-ce que le focus ?

Une page web est composée d'une arborescence d'éléments qu'on appelle le DOM. Certains de ses éléments comme des champs de formulaire (<input>, <textarea>), ou les liens (<a>) peuvent êtres marqués comme l'élément actif. C'est ça qu'on appelle le focus.

Lorsqu'un champ de formulaire a le focus, le curseur clignote à l'intérieur, et lorsqu'on appuie sur des touches du clavier, on écrit dans ce champ. En jQuery, on peut détecter lorsqu'un élément obtiens le focus, en utilisant l'événement .focus().

Mais ça n'est pas tout, il existe le contraire de focus, il s'agit de l'événement blur. Cet événement survient lorsqu'un élément perd le focus, ce qui est le cas par exemple lorsqu'on change de champ dans un formulaire.

Pourquoi je vous parle de ça ?
Et bien parce que l'événement blur va nous permettre de détecter le clic sur une iframe, car lorsqu'on clique sur une iframe, la page web perd le focus.

Le problème c'est qu'il y a plein d'autres cas dans lesquels la page reçoit l'événement blur, en voici quelques exemples :

  • L'utilisateur change d'onglet
  • L'utilisateur clique sur une autre fenêtre que celle du navigateur web qui affiche la page

Du coup il va falloir être en mesure de savoir si le blur a été provoqué par un clic sur une iframe, ou par autre chose.

Quand la souris survole une iframe ou au contraire revient dans la page après avoir survolé l'iframe, les événements mouseover et mouseout se produisent. Donc il est très facile de savoir si la souris est au dessus d'une iframe ou pas, en surveillant la frontière page web/iframe grâce à ces 2 événements.

Et bien voici le code javascript qui permet de faire tout ça avec jQuery :

jQuery(document).ready(function($){
	// Affichage de l'élément actif (pour aider à comprendre ce qui se passe)
	setInterval(function(){
		$('#actif').text(document.activeElement.tagName);
	}, 100);
	
	// Initialisation variable
	iframe_survol = false;
	
	// Surveillance frontière
	$('.iframetrack iframe').mouseover(function(){
		iframe_survol = true;
	}).mouseout(function(){
		iframe_survol = false;
	});
	
	// On donne le focus à la fenêtre au chargement
	$(window).focus();
	
	// Ecoute blur
	$(window).blur(function(e){
		$('<div class="alert alert-info">').html("Clic sur l'iframe").appendTo('#consoleDebug').delay(3000).fadeOut();
	});
	
	// Retour du focus sur la page au survol
	$(document).mousemove(function(e){
		if( document.activeElement.tagName == 'IFRAME' ){
			$(window).focus();
		}
	});
});

Voilà ce que ça donne en live :

Tester /ressources/exemple/jquery-iframe-track/simple.html
Iframe tracking
Tracker les clics dans une iframe avec jQuery

Cette technique fonctionne, mais elle est assez lourde à mettre en place, et ne permet pas de gérer plusieurs iframes.

De plus, elle n'est pas compatible avec tous les navigateurs : Internet Explorer gère le blur de manière très différente des autres navigateurs, et certaines fonctions ne marchent pas sur Firefox, comme le $(window).focus();.

Plugin jQuery : iframeTracker

iframeTracker est un plugin jQuery que j'ai moi-même créé, et qui permet de faire la même chose que ce qui a été présenté dans la première partie, sauf qu'il est compatible avec tous les navigateurs (j'ai résolu les soucis de compatibilité avec IE8 et Firefox grâce à une astuce un peu complexe qu'il n'est pas nécessaire d'expliquer dans ce tutoriel).

De plus, ce plug-in permet de gérer un nombre d'iframe illimité, et d'effectuer différentes actions au survol de ces iframes grâce à des callback (fonctions appelées automatiquement par le plugin en réaction à des événements).

Je vous conseille vivement d'utiliser ce plugin plutôt que le code vu dans la première partie, qui n'est là que pour montrer le fonctionnement avec un exemple assez simple.

Vous pouvez le télécharger ici (version utilisée pour ce tutoriel, avec les commentaires en français) : jquery.iframetracker.fr.js ou alors sur GitHub : iframeTracker-jquery.

Voici comment il s'utilise :

jQuery(document).ready(function($){
	// Facebook iframe
	$('.socialiframetrack_facebook iframe').iframeTracker({
		blurCallback: function(){
			$('<div class="alert alert-info">').html('Click on Facebook iframe').appendTo('#consoleDebug').delay(3000).fadeOut();
		}
	});
	
	// Autres iframes (entourées par un élément de classe CSS .iframetrack)
	$('.iframetrack iframe').iframeTracker({
		blurCallback: function(){
			$('<div class="alert alert-info">').html('Click on iframe : #' + this._overId).appendTo('#consoleDebug').delay(3000).fadeOut();
		},
		overCallback: function(element){
			// Mémorisation de l'id de l'iframe survollée
			this._overId = $(element).parents('.iframetrack').attr('id');
		},
		outCallback: function(element){
			// Reset lorsque la souris sort de l'iframe et revient dans la fenêtre
			this._overId = null;
		},
		_overId: null
	});
});

C'est très simple, il faut utiliser un sélecteur qui match toutes les iframes que vous voulez "écouter" avec un sélecteur jQuery, et d'appeler la fonction iframeTracker en lui passant en paramètre un objet qui possède ces slots :

  • blurCallback
    obligatoire
    Cette fonction est appelée lorsque la fenêtre perd le focus alors que le pointeur de la souris est au dessus d'une iframe parmi celles matchées par le sélecteur (car il peut y en avoir plusieurs)
  • overCallback
    facultatif
    Cette fonction est appelée lorsque la souris entre dans une iframe écoutée par le sélecteur.
    Elle prend en paramètre l'élément qui représente l'iframe survolée.
    C'est très pratique car on peut alors mémoriser l'iframe actuellement survolée lorsque le sélecteur match plusieurs iframe. Dans l'exemple, je stocke cette information dans la variable _overId que j'utilise ensuite dans le blurCallback.
  • outCallback
    facultatif
    Réciproque de overCallback, cette fonction est appelée lorsque la souris ressort de l'iframe pour revenir dans la page web.

Ensuite vous pouvez parfaitement ajouter des attributs supplémentaires pour stocker les différentes variables dont vous avez besoin dans vos callbacks, comme je l'ai fait avec _overId.

Voilà ce que ça donne :

Tester /ressources/exemple/jquery-iframe-track/
Demo jQuery iframeTracker
Exemple d'utilisation du plugin jQuery iframeTracker

Encore faim ? allez lire ça : zombie poulpe !

Tutoriaux similaires
88 commentaires :
Seuls les 10 derniers commentaires sont affichés.
Cliquez ici pour afficher tous les commentaires
commentaire n°18819 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18820 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18821 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18822 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18823 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18824 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18825 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18826 par Quincy Axel
Quincy Axel dimanche 26 mars 2023, 16:12
Salut tout le monde! Je m'appelle Quincy Axel... C'est un témoignage que je dirai à tout le monde d'entendre. je suis marié depuis 4 ans et la cinquième année de mon mariage, une autre femme a eu un sort pour m'éloigner de mon amant, puis mon mari m'a quitté ainsi que les enfants et nous avons souffert pendant 2 ans jusqu'à ce que je veuille dire un poste où cet homme, le Dr Ibinoba, a aidé quelqu'un et j'ai décidé de l'essayer pour m'aider à ramener mon charmant mari à la maison et croyez-moi, je viens de lui envoyer ma photo et celle de mon mari et après 48 heures comme il me l'a dit, je J'ai vu une voiture entrer dans la maison et voici que c'était mon mari, il est revenu vers moi et les enfants. vous.Contactez-le sur WhatsApp : +2348085240869, e-mail : dromionoba12@gmail.com
commentaire n°18827 par derek0jackson3
derek0jackson3 dimanche 26 mars 2023, 19:48
A few days ago, I found this https://bestonlinecasinosincanada.com/real-money-slots link and was very surprised. How did these guys manage to create such a detailed review? So now I know more gambling nuances.
commentaire n°18861 par Carmen Ménayo
Carmen Ménayo lundi 27 mars 2023, 22:48
Je pensais trop à toi parce que mon mari m'avait quitté pour une autre femme. ils ont tous deux voyagé loin de moi, je ne pouvais plus contacter mon mari. Donc tout cela m'a inquiété mon esprit n'était pas réglé. Comme tout cela se passait avec moi. J'ai choisi de regarder sur Internet, c'est là que je suis tombé sur de nombreux bons témoignages sur le DR WALE. J'ai donc pris contact avec le DR WALE et lui ai dit ce qui m'arrivait, puis il m'a dit de ne plus pleurer et de ne plus m'inquiéter. DR WALE a lancé un sortilège vaudou qui a fait que mon mari est revenu vers moi et a commencé à me supplier d'avoir pitié de lui. Si vous rencontrez des problèmes dans votre mariage ou votre relation, croyez-moi, le DR WALE est le meilleur homme à contacter. WhatsApp/Viber : +2347054019402 OU E-mail : drwalespellhome@gmail.com
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré