Les Codes Sources de MaX3315 - tous droits réservés
og@votre-web.com

Version imprimmable - V1.0

Ou comment proposer automatiquement une version imprimable d'une page?

Description

Ce script va construire une popup contenant une version imrpimable de votre page html. En réalité il peut s'agir que d'un morceau d'une page puisque l'on va prendre le contenu d'un bloc <div>.

La petite originalité de ce script et que les liens vont être retouchées afin que l'utilsateur puisse voir les urls sur la version imrpimmée.

Pour une démonstration rien de plus simple ce site utilise ce script essayez l'icône Icône de démonstration.
Cette source a été déposée sur le réseau Codes-Source ici (vous verez l'url de ce lien dans la version imprimable).

Spécification et speudo-code [?]

Figure 1: Fonction de ma fonction f_printable_version()
Fonction:		f_printable_version(autoOpenPrintDialog)
Argument:		autoOpenPrintDialog true ou false.
			Détermine l'ouverture automatique de la boite de
			dialogue d'impression.
Valeur de retour:	void

Il s'agit de la seule fonction à appelé. Toutes les données variables sont définit dans les variables suivante.

Figure 2: Variable à configurer
divPrintableContentId	:	id du bloc à imprimmer
titleSuffixe		:	suffixe ajouté au titre de la page courante
classHeader		:	class css du pied de l'entête
classFooter		:	class css du pied de page
contentHeader		:	contenu html de l'entête
contentFooter		:	contenu html du pied de page
externalLinkClassName	:	class css des liens à traiter
				si null alors on traite tous les liens

Code source

Figure 3: Code source

var divPrintableContentId='divContent';
var titleSuffixe=' [version immprimable]';
var classHeader='printableHeader';
var classFooter='printableFooter';
var contentHeader='<img src="http://prodeon3.nuxit.net/codessources/images/printable/printable_top01.jpg">';
var contentFooter='Script crée par MAX3315 - Tous droits réservés à <em>Les Codes Sources de MaX3315</em>';
var externalLinkClassName='externalLink';

function f_printable_version(autoOpenPrintDialog)
{
if(autoOpenPrintDialog==null) { autoOpenPrintDialog=false; }
var objContent=document.getElementById(divPrintableContentId);
var _options='toolbar=yes,location=no,directories=no,status=no,menub ar=no,scrollbars=yes,resizable=yes,copyhistory=no,width='+objContent.offsetWidth+'
,height='+objContent.offsetHeight+'';

var popup=window.open('','_blank',_options);

//on ecrit a la voler le contenu de la popup
popup.document.write('<html>');
popup.document.write('<head>');
popup.document.write('<title>'+document.title+'</title>'); //recuperation du titre
//Listage des CSS de la page courante pour transfert a la popup imprimable
var i;
for(i=0 ; i<document.styleSheets.length ; i++)
{
if(document.styleSheets[i].href==window.location || !document.styleSheets[i].href) //pour les feuilles de style attachées
{ //premier teste concerne Firefox le second concerne IE
//on souhaite récupéré le contenu de cette feuille de style inline.
if(document.styleSheets[i].cssText) //concerne IE
{
popup.document.write('<style type="text/css">'+document.styleSheets[i].cssText+'</style>');
}
else //pas IE
{
popup.document.write('<style type="text/css">');
var j;
for(j=0 ; j<document.styleSheets[i].cssRules.length ; j++)
{
popup.document.write('\n'+document.styleSheets[i].cssRules[j].cssText);
}
popup.document.write('</style>');
}
}
else
{
popup.document.write('<link href="'+document.styleSheets[i].href+'" rel="stylesheet" type="text/css">');
}
}
popup.document.write('</head>');
popup.document.write('<body>');
popup.document.write('<div id="header"></div>');
popup.document.write('<div id="content">'+document.getElementById(divPrintableContentId).innerHTML+'</div>');
popup.document.write('<div id="footer"></div>');
popup.document.write('<script language="javascript">window.opener.printable_version_callBack(window,\'content\',\'header\',\'footer\'
,'+autoOpenPrintDialog+');</script>');
popup.document.write('</body>');
popup.document.write('</html>');

return;
}


//fonction appelée par la popup afin de lui transformé son contenu
//Arguments :
// popupwin : référence à l'object window de la popup
// nameOdDivContent : non du div de contenu dans la popup
// nameOfDivHeader,nameOfDivFooter : nom des div d'entete et de pied de page
// autoOpenPrintDialog : true | false définit si la popup ouvre toute seule le diaolgue
// d'impression de l'impression
function printable_version_callBack(popupwin,nameOfDivContent,nameOfDivHeader
,nameOfDivFooter,autoOpenPrintDialog)
{
//traitement de l'entete / header
var header=popupwin.document.getElementById(nameOfDivHeader);
header.className=classHeader;
header.innerHTML=contentHeader;

//tratement du pied de page / footer
var footer=popupwin.document.getElementById(nameOfDivFooter);
footer.className=classFooter;
footer.innerHTML=contentFooter;

//transformation des liens en liens imprimables
transformExternalUrlForPrinting(popupwin,nameOfDivContent,externalLinkClassName);

//Mise en avant de la popup imprimable
popupwin.focus();

if(autoOpenPrintDialog)
{
popupwin.print();
}
return;
}



//fonction permettant de transformer l'ensemble des liens en liens url pleinement imprimmable
//Arguments :
// popupwin : référence à l'object window de la popup
// nameOdDivContent : non du div de contenu dans la popup
// styleForExternalLink : class de style associés aux liens qui doivent êter traité par cette fonction.
// Si null alors on traite tous les liens
function transformExternalUrlForPrinting(popupwin,nameOfDivContent,styleForExternalLink)
{
var myDiv=popupwin.document.getElementById(nameOfDivContent);
var urls=myDiv.getElementsByTagName('a');
for(i=0 ; i<urls.length ; i++)
{
if(styleForExternalLink==null || urls[i].className==styleForExternalLink) // il s'agit bien d'une url a transformer : on se base sur le nom de la classe CSS
{
urls[i].style.backgroundImage='none'; //spécifique à mon site et ma feuille de style
urls[i].style.paddingRight='0px'; //spécifique à mon site et ma feuille de style

if(urls[i].innerHTML.indexOf(urls[i].href)==-1 && urls[i].innerHTML.indexOf(urls[i].href.substr(0,urls[i].href.length-1))==-1)
//on ne veut que traité les liens n'ayant pas l'url deja visible
//Nous testons href ainsi que href privé de son dernier caractere
//pour la simple raison que dans certains cas les navigateurs complete automatiquement les urls par un /
// exemple: <a href="http://www.google.com">...
//donnera en javascript obj.href => String('http://www.google.com/') un caractere a automatiquement été ajouté '/'
{
urls[i].innerHTML=urls[i].innerHTML+'&nbsp;(<em>'+urls[i].href+'</em>)';
}
}
}
return;
}

function ellipsis_onMouseOver(aEvent)
{
var myEvent = aEvent ? aEvent : window.event; //recuperation de l'evenement selon le navigateur
//on recupere cible de l'evenemet
var target= myEvent.target ? myEvent.target : myEvent.srcElement;
//on recupere sa position
var _top=target.offsetTop;
var _left=target.offsetLeft;
var objTmp=target.parentNode;
var jj=0; //anti boucle infine
while(objTmp!=document.body && jj<1000) //on limite à 1000 niveau d'imbrication
{
//seul certain element sont a prendre en compte
//(les tr, row, thead, etc... ne sont pas a prendre en compte)
if(goodTagForOffset.inArray(objTmp.nodeName))
{
_top+=objTmp.offsetTop;
_left+=objTmp.offsetLeft;
}
objTmp=objTmp.parentNode;
jj++;
}
longVersionEllipsis.innerHTML=target.innerHTML;
longVersionEllipsis.style.visibility='visible';
longVersionEllipsis.style.zIndex=ellipsisZIndex+1;
longVersionEllipsis.style.left=_left;
longVersionEllipsis.style.top=_top;
return;
}

Code source expliqué en détails

Je pense que que le code source est déjà assez commenté. Mais si un certains nombre de gens veulent plus de détails sur certains passage veuillez me le faire savoir.

Téléchargement

Voici la source complète en téléchargement

Conclusion

Pas grand chose à ajouté a part vous souhaitez un bon usage de ce script.

Validation

Ce script a été testé et validé sous IE6 et Firefox en environement Windows XP.