/** * jQuery iframe click tracking plugin demo * Version 1.0 (2013-03-30) * Copyright © 2013 Vincent Paré, www.finalclap.com * Version FR */ (function($){ // Création de tracker d'iframe $.fn.iframeTracker = function(handler){ // Sauvegarde du tracker dans la liste $.iframeTracker.handlersList.push(handler); // Surveillance frontière iframe/page $(this) .bind('mouseover', {handler: handler}, function(e){ e.data.handler.over = true; try{ e.data.handler.overCallback(this); } catch(ex){} }) .bind('mouseout', {handler: handler}, function(e){ e.data.handler.over = false; try{ e.data.handler.outCallback(this); } catch(ex){} }); }; // Objet commun qui gère le tracking (core) $.iframeTracker = { // Attributs focusRetriever: null, // Element qui sert de focus retriever (element) focusRetrieved: false, // Indique si le focus retriever s'est exécuté sur la page courante (bool) handlersList: [], // Stocke la liste des trackers isIE8AndOlder: false, // true pour Internet Explorer 8 ou antérieur // Initialisation (au chargement de la page) init: function(){ // Vérifier le navigateur (IE8-) ($.browser.msie est déprécié depuis jQuery 1.9) try{ if( $.browser.msie == true && $.browser.version < 9 ){ this.isIE8AndOlder = true; } } catch(ex){ try{ var matches = navigator.userAgent.match(/(msie) ([\w.]+)/i); if( matches[2] < 9 ){ this.isIE8AndOlder = true; } } catch(ex2){} } // Ecoute window blur $(window).focus(); $(window).blur(function(e){ $.iframeTracker.windowLoseFocus(e); }); // Focus retriever $('body').append('
'); this.focusRetriever = $('#focus_retriever'); this.focusRetrieved = false; $(document).mousemove(function(e){ // Retour du focus sur la page au survol if( document.activeElement.tagName == 'IFRAME' ){ $.iframeTracker.focusRetriever.focus(); $.iframeTracker.focusRetrieved = true; } }); // Pour IE8 et inférieur, le blur ne remonte pas à window, donc il faut déclencher la fonction manuellement if( this.isIE8AndOlder ){ this.focusRetriever.blur(function(e){ e.stopPropagation(); e.preventDefault(); $.iframeTracker.windowLoseFocus(e); }); } // Keep focus on window (fix bug IE8- elements focusables) if( this.isIE8AndOlder ){ $('body').click(function(e){ $(window).focus(); }); $('form').click(function(e){ e.stopPropagation(); }); } }, // Perte de focus de la fenêtre => appel de tous les blurCallback des spot over windowLoseFocus: function(event){ for(var i in this.handlersList){ if( this.handlersList[i].over == true ){ try{ this.handlersList[i].blurCallback(); } catch(ex){} } } } }; // Initialisation du iframeTracker au chargement de la page $(document).ready(function(){ $.iframeTracker.init(); }); })(jQuery);