<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>l'indicible blog &#187; Tutoriaux</title>
	<atom:link href="http://www.lindicible.com/blog/category/tutoriaux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lindicible.com/blog</link>
	<description>&#60;!--:en--&#62;the details of the inexpressible&#60;!--:--&#62;&#60;!--:fr--&#62;les détails de l'ineffable&#60;!--:--&#62;</description>
	<lastBuildDate>Thu, 01 Jul 2010 14:20:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comment ajouter automatiquement un slash en fin d&#8217;URL</title>
		<link>http://www.lindicible.com/blog/2010/05/03/comment-ajouter-automatiquement-un-slash-en-fin-durl/</link>
		<comments>http://www.lindicible.com/blog/2010/05/03/comment-ajouter-automatiquement-un-slash-en-fin-durl/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:55:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=548</guid>
		<description><![CDATA[Après de longues et fastidieuses recherches pour ajouter automatiquement un slash ( &#8216;/&#8217; ) à la fin des adresses de mes sites web, j&#8217;ai pensé que certains pourraient profiter du fruit de ces recherches&#8230;
Pour ceux qui se demanderaient quel est le but de la manœuvre, il s&#8217;agit encore une fois d&#8217;un souci de référencement.
En effet, [...]]]></description>
			<content:encoded><![CDATA[<p>Après de longues et fastidieuses recherches pour ajouter automatiquement un slash ( &#8216;/&#8217; ) à la fin des adresses de mes sites web, j&#8217;ai pensé que certains pourraient profiter du fruit de ces recherches&#8230;</p>
<p>Pour ceux qui se demanderaient quel est le but de la manœuvre, il s&#8217;agit encore une fois d&#8217;un souci de référencement.<br />
En effet, pour un moteur de recherche, http://www.siteweb.com/nom et http://www.siteweb.com/nom/ ne sont pas équivalents. Ceci est hérité d&#8217;une époque où /nom représentait un fichier et /nom/ un répertoire. Rien alors n&#8217;empêchait d&#8217;avoir au même endroit un répertoire et un fichier du même nom.</p>
<p>Aujourd&#8217;hui, on a pris l&#8217;habitude de rendre les URIs plus clairs et plus simples pour les utilisateurs, et la plupart du temps on s&#8217;arrange pour que http://www.siteweb.com/nom et http://www.siteweb.com/nom/ renvoient sur la même page.<br />
Une fois encore, le risque est de se retrouver avec deux pages considérées comme des doublons par les moteurs de recherche, diluant le référencement global de la page.<br />
Pour éviter cela, on va donc chercher à avoir une page canonique, et à renvoyer l&#8217;autre sur celle-ci.</p>
<p>Il existe plusieurs façons de faire ça, la plus simple étant probablement l&#8217;usage de <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&#038;answer=139394" rel="external">l&#8217;attribut &laquo;&nbsp;canonical&nbsp;&raquo;</a> récemment introduit par Google.<br />
Pour référence, il s&#8217;agit d&#8217;introduire un tag du type &lt;link rel=&quot;canonical&quot; href=&quot;http://www.creation-de-sites-web.com/w3c.php?quality=high&quot;&gt; dans la balise &lt;head&gt; de la page en question. Ainsi, plusieurs URLs pourront pointer sur cette page, mais Google sera informé que c&#8217;est l&#8217;adresse indiquée dans ce href qui fait référence.</p>
<p>Une autre méthode consiste à systématiquement rediriger le visiteur sur l&#8217;adresse de page que l&#8217;on souhaite mettre en avant.<br />
Ceci peut se faire au niveau de la page elle même (par exemple <a href="http://fr2.php.net/manual/fr/function.header.php" rel="external">en php</a>), mais il est probablement beaucoup plus approprié de le faire au niveau du serveur web (Apache) ou d&#8217;un fichier .htaccess.</p>
<p>On a alors plusieurs outils à notre disposition, liés à mod_alias et mod_rewrite (pensez à vérifier qu&#8217;ils sont bien activés sur votre hébergement avant de commencer à expérimenter! Ce n&#8217;est pas toujours le cas)</p>
<p>Mes expérimentations m&#8217;ont fait passer de RewriteRule à RedirectMatch, puis de retour sur RewriteRule pour un résultat qui m&#8217;a enfin paru satisfaisant.<br />
En guise de documentation, je vous invite à visiter la documentation Apache, notamment les liens suivants :<br />
<a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule" rel="external">http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule</a><br />
<a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog" rel="external">http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog</a></p>
<p>Sans plus de préambule, voici ma solution :</p>
<pre>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} (^/blog/.*)$  [NC]
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.+[^/])$  %{REQUEST_URI}/  [R=301,L]

RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Détaillons un petit peu :</p>
<pre>
RewriteEngine On
</pre>
<p>On s&#8217;assure que le moteur de ré-écriture d&#8217;URL est allumé. S&#8217;il n&#8217;est pas disponible, on aura généralement une erreur 500.</p>
<p>On va ensuite tester différents cas de figure :</p>
<pre>
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} (^/blog/.*)$  [NC]
RewriteRule ^.*$ - [NC,L]
</pre>
<p>Si le lien pointe vers un fichier de taille non nulle (-s = sized file)<br />
ou bien<br />
que le lien pointe vers un lien (-l = link)<br />
ou bien<br />
que le lien pointe vers un répertoire (-d = directory)<br />
ou bien que l&#8217;URI commence par /blog/ sans tenir compte de la casse (NC = Not Case-sensitive)<br />
alors on va remplacer l&#8217;URL par elle même (-) et ignorer les règles suivantes (L = Last rule)</p>
<pre>
RewriteRule ^.*[^/]$  %{REQUEST_URI}/  [R=301,L]
</pre>
<p>Si l&#8217;on est toujours là, c&#8217;est que les conditions précédentes n&#8217;ont pas été remplies.<br />
On est donc pas en présence d&#8217;un fichier/lien/répertoire ni d&#8217;une entrée du blog (que nous avons mis ici à titre d&#8217;exemple d&#8217;un élément d&#8217;arborescence à exclure&#8230; A noter que les blogs comme Wordpress ont leur propre système de ré-écriture d&#8217;URLs).<br />
On va alors remplacer tout ce qui ne finit pas par un / ( soit ^.*[^/]$ en expression régulière ) par l&#8217;adresse visée suivie d&#8217;un / ( %{REQUEST_URI}/ ) et faire une redirection externe sur cette adresse (R = Redirect, 301 = le code d&#8217;erreur que l&#8217;on souhaite envoyer ).<br />
Ceci sera notre dernière règle (L = Last), afin d&#8217;éviter qu&#8217;elle ne soit remplacée par une autre avant que la redirection n&#8217;ait été prise en compte (ça n&#8217;a l&#8217;air de rien, mais j&#8217;ai du perdre un certain nombre de cheveux avant de comprendre ça!)</p>
<p>Enfin, dans le cadre de nos projets à URLs customisées, on va généralement renvoyer tout le reste sur le fichier index.php qui s&#8217;occupera de l&#8217;interpréter : </p>
<pre>
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Peut-être y a-t-il de meilleures façons de procéder. Si c&#8217;est le cas, je serai ravi de les découvrir.<br />
Quoi qu&#8217;il en soit, n&#8217;hésitez pas à laisser un commentaire, ça fait toujours plaisir <img src='http://www.lindicible.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2010/05/03/comment-ajouter-automatiquement-un-slash-en-fin-durl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bouton customisé à taille variable en CSS</title>
		<link>http://www.lindicible.com/blog/2010/02/16/bouton-customise-a-taille-variable-en-css/</link>
		<comments>http://www.lindicible.com/blog/2010/02/16/bouton-customise-a-taille-variable-en-css/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 15:41:39 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=495</guid>
		<description><![CDATA[Introduction
Récemment, je me suis penché sur ce que l&#8217;on appelle les css layout &#171;&#160;élastiques&#160;&#187;.
Basiquement, il s&#8217;agit d&#8217;utiliser l&#8217;unité &#171;&#160;em&#160;&#187; au lieu du pixel. Cette unité est une unité relative, comme le &#171;&#160;%&#160;&#187;, mais elle est relative à la taille de la police de caractères courante et non pas à la taille du contenant.
Pour comprendre son [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>Récemment, je me suis penché sur ce que l&#8217;on appelle les css layout &laquo;&nbsp;élastiques&nbsp;&raquo;.<br />
Basiquement, il s&#8217;agit d&#8217;utiliser l&#8217;unité &laquo;&nbsp;em&nbsp;&raquo; au lieu du pixel. Cette unité est une unité relative, comme le &laquo;&nbsp;%&nbsp;&raquo;, mais elle est relative à la taille de la police de caractères courante et non pas à la taille du contenant.<br />
Pour comprendre son utilité, il faut savoir que certaines personnes ayant des problèmes de vue utilisent généralement une option de leur navigateur leur permettant d&#8217;augmenter la taille par défaut de la police.<br />
Les textes sont alors plus gros et plus lisibles. Malheureusement, il est rare que le site visité ai anticipé ce changement, et généralement toute la mise en page se retrouve complètement cassée.</p>
<p>Imaginez par exemple que vous ayez décidé de mettre une jolie image sous un lien pour avoir un bouton sympathique. Si la taille de la police de caractère est augmentée, il est très probable que le texte dépasse de cette image. Tout à coup, le bouton devient beaucoup moins joli.</p>
<p>A la recherche d&#8217;une solution à ce problème, je suis tombé sur un article de l&#8217;excellent site positioniseverything.net qui propose une solution permettant d&#8217;appliquer des ombres portées semi-transparentes à n&#8217;importe quelle image. L&#8217;article en question est visible ici : <a href="http://www.positioniseverything.net/articles/dropshadows2.html" rel="external">http://www.positioniseverything.net/articles/dropshadows2.html</a></p>
<p>L&#8217;approche m&#8217;a semblé intéressante, mais pas assez souple à mon goût. En effet, elle se base sur une énorme image en espérant que le conteneur ne dépasse jamais cette taille. Sans tenir compte de l&#8217;évolution rapide de la taille des écrans, cette méthode a un coût en terme de bande passante. Par ailleurs, elle présuppose que l&#8217;on cherche à avoir un contour d&#8217;image régulier, ce qui n&#8217;est pas forcément le cas.</p>
<p>Sous flash, il existe une façon de gérer les bords arrondis appelée Scale9Grid : On découpe un bloc en 9 parties distinctes comme illustré dans le schéma ci-dessous, et celles situées dans les coins ne sont jamais redimensionnées.<br />
<img src="http://www.lindicible.com/blog/wp-content/_custom/scale9css/grid.gif" alt="scale9grid" /></p>
<p>En se basant sur cette méthode et la technique de positioniseverything, j&#8217;ai mis au point un moyen d&#8217;avoir un bouton customisé qui s&#8217;adapte à son contenu. N&#8217;hésitez pas à visiter la page de <a href="http://www.lindicible.com/blog/wp-content/_custom/scale9css/" rel="external">démonstration interactive du bouton custom redimensionnable</a>. Mais je vous entends déjà vous impatienter, aussi voici la technique en question :</p>
<h3>Découpe de l&#8217;image</h3>
<p>Nous allons découper notre bouton suivant le schema ci-dessus, à une nuance prêt.<br />
Contrairement à Flash, le CSS2 ne permet pas d&#8217;étirer les images. Nous allons donc pour les parties qui doivent s&#8217;étendre en largeur ne garder qu&#8217;un morceau de 1 pixel de large qui se répétera autant que nécessaire.<br />
De même pour les parties verticales en ne gardant qu&#8217;un pixel de haut.<br />
Cette étape n&#8217;est pas réellement nécessaire, mais elle permet de ne pas surcharger la bande passante avec des données inutiles.</p>
<h3>Le HTML</h3>
<pre>
&lt;div class="tl"&gt;
    &lt;div class="tr"&gt;
        &lt;div class="bl"&gt;
            &lt;div class="br"&gt;
                &lt;div class="t"&gt;
                    &lt;div class="b"&gt;
                        &lt;div class="l"&gt;
                            &lt;div class="r"&gt;
                                &lt;div class="content"&gt;
                                    Place your content here
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Comme vous le voyez, il faut une certaine quantité de balises qui ont pour seule utilité d&#8217;aider à la construction du bouton. Cela va à l&#8217;encontre du principe selon lequel le html doit toujours garder sa sémantique propre (ce qui est bon pour les moteurs de recherche), mais on ne fait pas d&#8217;omelette sans casser des oeufs !</p>
<p>Les classes représentent la partie de l&#8217;image qui sera utilisée. &laquo;&nbsp;l&nbsp;&raquo; pour &laquo;&nbsp;left&nbsp;&raquo;, &laquo;&nbsp;b&nbsp;&raquo; pour &laquo;&nbsp;bottom&nbsp;&raquo;, &laquo;&nbsp;br&nbsp;&raquo; pour &laquo;&nbsp;bottom-right&nbsp;&raquo;, etc.</p>
<h3>Le CSS</h3>
<p>Les commentaires sont placés directement dans le corps du CSS.</p>
<pre>
.tl{
    background:url('tl.gif') no-repeat top left;
    display:inline-block;
}

.ie7root .tl, .ie7root .tl div{ /* ie7 fix : n'importe quelle règle déclenchant haslayout peut remplacer cela */
    float:left;
}

.tr{
    background:url('tr.gif') no-repeat top right;
}
.bl{
    background:url('bl.gif') no-repeat bottom left;
}
.br{
    background:url('br.gif') no-repeat bottom right;
    padding-right:23px; /* dépend de la largeur de vos images de droite */
}
.t{
    background:url('t.gif') repeat-x top left;
    margin-left:23px; /* dépend de la largeur de vos images de gauche */
    padding-top:18px; /* dépend de la hauteur de vos images du haut */
}
.b{
    background:url('b.gif') repeat-x bottom left;
    padding-bottom:18px; /* dépend de la hauteur de vos images du bas */
}
.l{
    background:url('l.gif') repeat-y top left;
    margin-left:-23px; /* dépend de la largeur de vos images de gauche */
}
.r{
    background:url('r.gif') repeat-y top right;
    margin-left:23px; /* dépend de la largeur de vos images de gauche */
    margin-right:-23px; /* dépend de la largeur de vos images de droite */
    padding-right:23px; /* dépend de la largeur de vos images de droite */
}
.content{
    overflow:hidden; /* empêche les contenus insécables de dépasser */
    vertical-align:bottom; /* corrige un bug bizarre générant un gap de 3 pixel dans le bas */
    background-color:#28bcd9;
}
</pre>
<h3>Conclusion</h3>
<p>Cette méthode fonctionne avec tous les navigateurs testés, y compris le redoutable IE6 (qui va semble-t-il enfin bientôt prendre sa retraite!).<br />
Vous pouvez utiliser des images avec transparence en gif ou  en png (pour les navigateurs qui le supportent), et ainsi créer des ombres portées ou tout autre type de contour pour vos liens ou vos contenus.<br />
Si le contenu change ou si l&#8217;utilisateur change la taille de la police de caractère, le bouton s&#8217;adaptera !</p>
<p>Il y aura probablement plus de possibilités pour faire ce genre de choses avec l&#8217;arrivée de CSS3 et de HTML5. D&#8217;ici là, vous pouvez désormais avoir des contenant stylisés à votre goût, y compris pour les utilisateurs mal voyants. Profitez-en !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2010/02/16/bouton-customise-a-taille-variable-en-css/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DOMDocument et UTF-8, un problème de charset en php</title>
		<link>http://www.lindicible.com/blog/2009/10/18/domdocument-et-utf-8-un-probleme-de-charset-en-php/</link>
		<comments>http://www.lindicible.com/blog/2009/10/18/domdocument-et-utf-8-un-probleme-de-charset-en-php/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 23:44:11 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=481</guid>
		<description><![CDATA[Aujourd&#8217;hui, nous allons voir comment manipuler des éléments du DOM avec php.
Nous prendrons pour exemple une fonction très pratique mais pourtant apparamment bien difficile à trouver : commenter ajouter un attribut spécifique à des éléments HTML.
Ceci peut-être utile par exemple pour ajouter un attribut rel=&#160;&#187;nofollow&#160;&#187; à des liens pour signaler aux moteurs de recherche qu&#8217;ils [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui, nous allons voir comment manipuler des éléments du <a href="http://fr.wikipedia.org/wiki/Document_Object_Model" rel="external">DOM</a> avec php.<br />
Nous prendrons pour exemple une fonction très pratique mais pourtant apparamment bien difficile à trouver : commenter ajouter un attribut spécifique à des éléments HTML.<br />
Ceci peut-être utile par exemple pour ajouter un attribut rel=&nbsp;&raquo;nofollow&nbsp;&raquo; à des liens pour signaler aux moteurs de recherche qu&#8217;ils n&#8217;ont pas à les suivre, tout en laissant ces liens accessibles pour vos utilisateurs. D&#8217;un point de vue référencement, ça peut être bien pratique puisque cela vous évite de voir votre PageRank être dispersé vers tous les liens présents sur vos pages.</p>
<p>Pour arriver à ce but, nous allons rencontrer plusieurs problèmes assez vicieux. Commençons par une fonction aboutie, pour faire gagner du temps au plus vifs d&#8217;entre vous :</p>
<pre>
function addAttribute($context, $tag, $attribute, $value)
{
	$initialEncoding = mb_detect_encoding($context);
	if( $initialEncoding != 'UTF-8' ){
		$context = utf8_encode($context);
	}

	$doc = new DOMDocument("4.01", "utf-8");

	$contentPrefix = '&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;required meta for utf-8 handling!&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;/head&gt;&lt;body&gt;';
	$contentSuffix = '&lt;/body&gt;&lt;/html&gt;';

	$doc->loadHTML($contentPrefix . $context . $contentSuffix);

	$elements = $doc->getElementsByTagName($tag);

	if(!is_array($value)){
		$value = array($value);
	}

	foreach($elements as $element)
	{

		foreach($value as $currentValue)
		{
			$alreadySet = false;

			if($element->hasAttribute($attribute))
			{

				$attributeCurrentValue = $element->getAttribute($attribute);

				$attributeCurrentValues = explode(' ', $attributeCurrentValue);

				foreach( $attributeCurrentValues as $attributeCurrentValue )
				{
					if($attributeCurrentValue == $currentValue){
						$alreadySet = true;
					}
				}
				if(!$alreadySet){
					$element->setAttribute($attribute, implode(' ', $attributeCurrentValues) . ' ' . $currentValue);
				}
			} else {
				$element->setAttribute($attribute, $currentValue);
			}
		}
	}

	$output = mb_substr($doc->saveHTML(), 236, -16);

	if( $initialEncoding != 'UTF-8' ){
		mb_convert_encoding($output, $initialEncoding, 'UTF-8');
	}

	return $output;
}
</pre>
<h3>Explications</h3>
<pre>
$initialEncoding = mb_detect_encoding($context);
	if( $initialEncoding != 'UTF-8' ){
		$context = utf8_encode($context);
	}
</pre>
<p>On commence par détecter le format d&#8217;encodage actuellement utilisé dans le contexte fourni.<br />
On le stocke pour pouvoir retourner la version modifiée dans le même format, et on le converti en UTF-8.<br />
Pourquoi UTF-8 ? Ce format a l&#8217;avantage (énorme) de gérer tous les caractères, y compris les caractères accentués ou spéciaux de différents langages.</p>
<pre>
	$doc = new DOMDocument("4.01", "utf-8");
</pre>
<p>On crée ensuite un nouvel objet DOM, au constructeur duquel on passe deux paramètres : la version du document que l&#8217;on va utiliser (typiquement &laquo;&nbsp;1.0&#8243; pour du XML et &laquo;&nbsp;4.01&#8243; pour du HTML), et le jeu de caractères de ce document (charset).</p>
<pre>
	$contentPrefix = '&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;required meta for utf-8 handling!&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;/head&gt;&lt;body&gt;';
	$contentSuffix = '&lt;/body&gt;&lt;/html&gt;';

	$doc->loadHTML($contentPrefix . $context . $contentSuffix);
</pre>
<p>On va ensuite ajouter un header au contexte passé. En effet, même si on a défini les valeurs <em>attendues</em> pour le document fourni, celles-ci seront effacées par le document si ces headers ne sont pas fournis. Et je peux vous assurer que lorsqu&#8217;on ne sait pas ça, il y a de quoi s&#8217;arracher les cheveux !! C&#8217;est sans doute le point le plus vicieux de la manipulation.<br />
On peut ensuite charger le contenu dans cet objet DOM.</p>
<pre>
	if(!is_array($value)){
		$value = array($value);
	}
</pre>
<p>Cette fonction prévoit de pouvoir ajouter plusieurs valeurs à un attribut donné. Si l&#8217;argument passé à la fonction est une chaine de caractères, on la transforme donc en tableau.</p>
<p>Je ne m&#8217;attarderai pas sur le reste de la fonction en elle même, qui est assez explicite.<br />
Notez simplement que l&#8217;on préserve les valeurs déjà existantes en les stockant dans un tableau, et que l&#8217;on vérifie avant d&#8217;ajouter la valeur de l&#8217;attribut si elle n&#8217;existe pas déjà.</p>
<pre>
	$output = mb_substr($doc->saveHTML(), 236, -16);
</pre>
<p>On va ensuite sauvegarder le résultat obtenu, et retirer les préfixe et suffixe que l&#8217;on avait ajouté grâce à une fonction gérant les caractères multibytes. En effet, un substr classique ne fonctionnerait pas convenablement avec certains caractères, puisque l&#8217;on est ici en UTF-8 qui utilise plusieurs octets pour stocker certains d&#8217;entre eux.</p>
<pre>
	if( $initialEncoding != 'UTF-8' ){
		mb_convert_encoding($output, $initialEncoding, 'UTF-8');
	}

	return $output;
</pre>
<p>Il est temps de remettre le résultat obtenu dans son jeu de caractère d&#8217;origine et de retourner le résultat.</p>
<p>Et&#8230; Voila! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2009/10/18/domdocument-et-utf-8-un-probleme-de-charset-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment détecter quand la souris quitte la fenêtre du navigateur en Javascript</title>
		<link>http://www.lindicible.com/blog/2009/09/29/comment-detecter-quand-la-souris-quitte-la-fenetre-du-navigateur-en-javascript/</link>
		<comments>http://www.lindicible.com/blog/2009/09/29/comment-detecter-quand-la-souris-quitte-la-fenetre-du-navigateur-en-javascript/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 15:57:13 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=421</guid>
		<description><![CDATA[Javascript est un langage très utile pour beaucoup de choses de nos jours.
Malheureusement, chaque navigateur l&#8217;implémente à sa façon, et évidemment ils ne proposent pas la même gestion des évènements !
Prenons un exemple : vous venez de faire un div que l&#8217;on peut déplacer à volonté avec la souris. On clique, le déplacement commence&#8230; on [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript est un langage très utile pour beaucoup de choses de nos jours.<br />
Malheureusement, chaque navigateur l&#8217;implémente à sa façon, et évidemment ils ne proposent pas la même gestion des évènements !</p>
<p>Prenons un exemple : vous venez de faire un div que l&#8217;on peut déplacer à volonté avec la souris. On clique, le déplacement commence&#8230; on relâche, le déplacement s&#8217;arrête. Mais voila, si on relâche en dehors de la fenêtre du navigateur, aucun événement n&#8217;est déclenché, et on continue à déplacer notre div indéfiniment !</p>
<p>Le meilleur moyen d&#8217;éviter ça est de stopper le déplacement dès l&#8217;instant où l&#8217;on quitte la fenêtre du navigateur. Seulement voila : javascript ne déclenche aucun événement lorsque c&#8217;est le cas. Il faut tricher&#8230;</p>
<p>On commence par se dire que si l&#8217;on cesse de survoler l&#8217;objet que l&#8217;on déplace, on arrête le déplacement&#8230; Et l&#8217;on se rend vite compte que ce n&#8217;est pas pratique du tout ! En effet, la souris va presque toujours bouger plus vite que la div et le déplacement cessera instantanément, sauf si l&#8217;on bouge au ralenti.</p>
<p>Pour éviter ça, on peut chercher à déterminer vers quel élément la souris à quitté la div, et n&#8217;arrêter le déplacement que si ce n&#8217;est pas un élément inclus dans la balise html.<br />
Facile&#8230; en théorie. Mais tous les navigateurs n&#8217;utilisent pas les mêmes attributs de l&#8217;événement, et évidemment IE va encore nous poser problème !</p>
<p>Sans plus d&#8217;introduction, voici un morceau de code jQuery (&laquo;&nbsp;code less do more&nbsp;&raquo;) qui vous aidera grandement à résoudre ce problème :</p>
<pre>
$('div#dragged').bind('mouseleave.dragged',function(e) {
	var ev = e || window.event;
	if(ev.relatedTarget){
		if(ev.relatedTarget == $('html').get(0)){
			stopDrag();
		}
	} else {
	// IE
		if(!ev.toElement){
			stopDrag();
		} else if(ev.toElement.tagName == "HTML"){
			stopDrag();
		}
	}
})
</pre>
<h3>Maintenant, les explications :</h3>
<pre>$('div#dragged').bind('mouseleave.dragged',function(e) {</pre>
<p>On associe une fonction à l&#8217;événement &#8216;mouseleave&#8217; sur la div déplaçable.<br />
Notez au passage que jQuery nous permet d&#8217;associer un nom à cette fonction (ici : &#8216;.dragged&#8217;), ce qui est très pratique pour gérer ensuite les événement nominativement, surtout dans le cas ou plusieurs événement du même type sont associés à cet objet.</p>
<pre>	var ev = e || window.event;</pre>
<p>On récupère ensuite l&#8217;événement déclenché. Firefox et les browsers respectueux des standards le trouveront en paramètre de la fonction (ici : &#8216;e&#8217;), pour Internet Explorer il faudra aller le chercher dans window.event.<br />
Le double pipe (&#8216;||&#8217;) permet d&#8217;attribuer à la variable &#8216;ev&#8217; la valeur de &#8216;e&#8217; si elle existe, et la valeur de &#8216;window.event&#8217; si ce n&#8217;est pas le cas.</p>
<pre>	if(ev.relatedTarget){
		if(ev.relatedTarget == $('html').get(0)){
			stopDrag();
		}</pre>
<p>Pour les navigateurs standards, l&#8217;événement contient une propriété &#8216;relatedTarget&#8217;.<br />
Si elle existe, on est dans le cas d&#8217;un navigateur standard, sinon on est probablement sous IE.</p>
<p>Cette propriété retourne l&#8217;élément &#8216;html&#8217; quand on quitte la div en sortant du navigateur.<br />
On utilise ici une syntaxe jQuery pour comparer le contenu de cette propriété avec le contenu html (&#8216;get(0)&#8217; sur l&#8217;objet jQuery) de la balise &#8216;html&#8217;. S&#8217;ils sont identiques, on peut arrêter le déplacement.</p>
<pre>	} else {
	// IE</pre>
<p>Si la propriété &#8216;relatedTarget&#8217; n&#8217;existe pas, on est alors dans le cas d&#8217;IE. Deux cas se présentent alors :</p>
<pre>		if(!ev.toElement){
			stopDrag();</pre>
<p>Pour certaines versions d&#8217;IE, la propriété &#8216;toElement&#8217; de l&#8217;événement est indéfinie. C&#8217;est un critère suffisant pour arrêter le déplacement.</p>
<pre>		} else if(ev.toElement.tagName == "HTML"){
			stopDrag();
		}
	}
})</pre>
<p>Pour d&#8217;autres versions d&#8217;IE, la propriété &#8216;toElement&#8217; existe. On devra dans ce cas vérifier que la propriété &#8216;tagName&#8217; de &#8216;toElement&#8217; est bien &#8216;HTML&#8217;. Si c&#8217;est le cas, on arrête le déplacement.</p>
<p>Voila, j&#8217;espère que ces quelques explications pourront vous aider, il n&#8217;est pas toujours évident de trouver sur internet les ressources nécessaires pour arriver à faire cette chose pourtant si basique !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2009/09/29/comment-detecter-quand-la-souris-quitte-la-fenetre-du-navigateur-en-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ré-écriture d&#8217;URL et SEO</title>
		<link>http://www.lindicible.com/blog/2008/12/08/re-ecriture-durl-et-seo/</link>
		<comments>http://www.lindicible.com/blog/2008/12/08/re-ecriture-durl-et-seo/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 21:39:26 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[ré-écriture d'url]]></category>
		<category><![CDATA[url-rewriting]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=82</guid>
		<description><![CDATA[Vous avez décidé d&#8217;utiliser la ré-écriture d&#8217;url pour rendre vos URL plus lisibles et &#8216;amicales&#8217; pour l&#8217;utilisateur. C&#8217;est probablement une bonne chose, étant donné que les moteurs de recherche eux aussi les préfèrent ainsi. Mais attention, il y a certains écueils à éviter !
En effet, avec ce type de configuration, on ne fait plus bien [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez décidé d&#8217;utiliser la ré-écriture d&#8217;url pour rendre vos URL plus lisibles et &#8216;amicales&#8217; pour l&#8217;utilisateur. C&#8217;est probablement une bonne chose, étant donné que les moteurs de recherche eux aussi les préfèrent ainsi. Mais attention, il y a certains écueils à éviter !</p>
<p>En effet, avec ce type de configuration, on ne fait plus bien la distinction entre contenu et répertoire&#8230; et les robots non plus! Du coup, http://www.mondomaine.com/example et http://www.mondomaine.com/example/ renvoient généralement sur le même contenu, mais sont vus comme deux pages différentes par les moteurs de recherche.</p>
<p>On a alors dilution du référencement, et les doublons sont de la partie. Quelle Horreur !</p>
<p>Nous avons déjà traité un problème similaire à propos des <a href="http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/">noms de domaines multiples</a> dans un précédent article. La solution sera ici du même ordre.</p>
<p>Pour éviter tout souci de doublon, il vous faudra vous assurer que les adresses sans slash de fin (comme http://www.mondomaine.com/example) renvoient sur la même adresse avec slash de fin (comme http://www.mondomaine.com/example/) avec une erreur 301 (page définitivement déplacée).</p>
<p>Pour ce faire, il s&#8217;agira de procéder comme dans l&#8217;exemple ci dessous, à l&#8217;aide d&#8217;un fichier .htaccess ou en modifiant la configuration du serveur web :</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
	RewriteEngine On
	RewriteBase /
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_URI} !-d
	RewriteCond %{REQUEST_URI} !(.*)/$
	RewriteRule ^(.*)$ http://www.mondomaine.com/$1/ [L,R=301]
&lt;/IfModule&gt;</pre>
<ul>
<li>La première ligne annonce l&#8217;utilisation d&#8217;une règle de ré-écriture, et la seconde indique le répertoire courant comme racine.</li>
<li><em>RewriteCond %{REQUEST_FILENAME} !-f</em> exclut les fichiers existant de cette règle, afin qu&#8217;un slash ne leur soit pas adjoint.</li>
<li><em>RewriteCond %{REQUEST_FILENAME} !-d</em> fait de même avec les répertoires existant réellement sur le site.</li>
<li><em>RewriteCond %{REQUEST_URI} !(.*)/$</em> s&#8217;occupe d&#8217;exclure les URLs finissant déjà par un slash.</li>
<li>Enfin, <em>RewriteRule ^(.*)$ http://www.mondomaine.com/$1/ [L,R=301]</em> rajoute un slash à la fin des URL ainsi sélectionnées, en retournant en passant le code d&#8217;erreur approprié.</li>
</ul>
<p>Notez que vous devez placer thes règles avant celles pré-existantes pour être sûr d&#8217;avoir le comportement désiré.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/12/08/re-ecriture-durl-et-seo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Multiples noms de domaines et SEO</title>
		<link>http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/</link>
		<comments>http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 21:24:45 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[301]]></category>
		<category><![CDATA[multiple sites]]></category>
		<category><![CDATA[redirection]]></category>
		<category><![CDATA[sites multiples]]></category>

		<guid isPermaLink="false">http://blog.lindicible.com/?p=60</guid>
		<description><![CDATA[Que faire lorsque l&#8217;on a plusieurs noms de domaines pointant sur un même site pour gérer au mieux son référencement ?
Que ce soit pour protéger les noms voisins (ex: monsite.com et mon-site.com) ou pour tirer parti des avantages des différents TLD (Top Level Domain) (ex: monsite.com et monsite.org), il y a parfois de bonnes raisons [...]]]></description>
			<content:encoded><![CDATA[<p>Que faire lorsque l&#8217;on a plusieurs noms de domaines pointant sur un même site pour gérer au mieux son référencement ?</p>
<p>Que ce soit pour protéger les noms voisins (ex: monsite.com et mon-site.com) ou pour tirer parti des avantages des différents <a rel="external" href="http://fr.wikipedia.org/wiki/Tld">TLD</a> (Top Level Domain) (ex: monsite.com et monsite.org), il y a parfois de bonnes raisons d&#8217;utiliser plusieurs noms de domaine pour un même site.</p>
<p>Si l&#8217;on y prend pas garde, les moteurs de recherche importants (liste exhaustive des moteurs de recherche importants:Google) peuvent considérer ces sites comme des doublons et/ou attribuer les pages à un domaine ou un autre de manière arbitraire, diluant vos résultats dans les <a rel="external" href="http://fr.wikipedia.org/wiki/Page_de_r%C3%A9sultats_d%27un_moteur_de_recherche">SERP</a> (Search Engine Result Pages). Dans tous les cas, la qualité de votre référencement en souffre.</p>
<p>Pour éviter ce problème, il nous faut choisir un nom de domaine principal qui servira de référence. Ceci implique l&#8217;utilisation de ce nom partout où l&#8217;on peut avoir besoin d&#8217;inscrire une URL, et la modification du comportement des domaines secondaires.</p>
<p>Nous allons faire en sorte que les domaines secondaires retournent le même contenu que le domaine principal, tout en prévenant les robots qu&#8217;ils ne sont pas le domaine principal. Encore une fois, les <a rel="external" href="http://www.google.com/support/webmasters/bin/answer.py?answer=40132&#038;hl=fr">codes d&#8217;erreur HTTP</a> vont nous être utiles : nous allons retourner un code 301 (changement d&#8217;adresse définitif) avec le contenu.</p>
<p>Notez qu&#8217;un code d&#8217;erreur 302 (changement d&#8217;adresse temporaire) serait beaucoup moins efficace pour ce que nous cherchons à réaliser&#8230; et c&#8217;est ce qui est envoyé par défaut lors d&#8217;une redirection !</p>
<p>Pour retourner ce code, il existe plusieurs méthodes. La plus simple est probablement l&#8217;utilisation de l&#8217;instruction &#8216;redirect&#8217; dans la configuration du serveur web (Apache) ou dans un fichier .htaccess à la racine du serveur.</p>
<p>Voici l&#8217;instruction à utiliser pour rediriger l&#8217;ensemble des requêtes vers l&#8217;adresse principale :</p>
<pre>Redirect 301 / http://monsite.com/</pre>
<p>ou</p>
<pre>Redirect permanent / http://monsite.com/</pre>
<p>Vous pouvez par exemple inclure un virtual hostname pour tous les domaines secondaires de la manière suivante :</p>
<pre>&lt;VirtualHost *:80&gt;
    ServerName www.monsite.org
    ServerAlias monsite.org
    ServerAlias www.mon-site.com
    ServerAlias mon-site.com
    &lt;IfModule mod_alias.c&gt;
        Redirect permanent / http://www.mon-site-principal.com/
    &lt;/IfModule&gt;
&lt;/VirtualHost&gt;</pre>
<p>Une autre façon de réaliser ceci sans modifier la conf d&#8217;apache serait d&#8217;appliquer des RewriteRules à travers un fichier .htaccess à la racine de votre site. Par exemple :</p>
<pre>RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*)mon-site.com$
RewriteRule ^(.*)$ http://www.mon-site-principal.com/$1 [R=301,L]</pre>
<p>ou encore avec :</p>
<pre>RedirectMatch 301 /blog(.*) /$1</pre>
<p>Avec un code d&#8217;erreur bien géré, vous vous assurez que le nom de domaine principal bénéficie de tout son potentiel. Le moteurs de recherche importants sont contents, donc vous aussi !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/11/23/multiples-noms-de-domaines-et-seo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>404 et SEO</title>
		<link>http://www.lindicible.com/blog/2008/10/29/404-et-seo/</link>
		<comments>http://www.lindicible.com/blog/2008/10/29/404-et-seo/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 20:02:17 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[codes d'erreur]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=9</guid>
		<description><![CDATA[Lorsque l&#8217;on cherche à optimiser son site pour obtenir un meilleur référencement sur les moteurs de recherche, on tombe très vite dans le monde souterrain du SEO (Search Engine Optimization).
Il y a dans cet univers beaucoup de bon sens et quelques trucs à savoir, ainsi que certains concepts flirtant avec le sacré, comme le célèbre [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsque l&#8217;on cherche à optimiser son site pour obtenir un meilleur référencement sur les moteurs de recherche, on tombe très vite dans le monde souterrain du SEO (<a rel="external" href="http://fr.wikipedia.org/wiki/Search_engine_optimization">Search Engine Optimization</a>).</p>
<p>Il y a dans cet univers beaucoup de bon sens et quelques trucs à savoir, ainsi que certains concepts flirtant avec le sacré, comme le célèbre PageRank de Google.</p>
<p>D&#8217;une manière générale, il faut comprendre de quelle manière les robots utilisés par les référenceurs voient votre site, c&#8217;est à dire en texte uniquement. Vous pouvez en avoir un bon aperçu en utilisant un navigateur texte comme <a rel="external" href="http://home.pacific.net.sg/~kennethkwok/lynx/">lynx</a>.</p>
<p>Tout ce qui peut permettre d&#8217;aider le travail de ces robots est un avantage pour vous. Utiliser du code html validé par le <a rel="external" href="http://validator.w3.org">w3c</a> et des feuilles de style valides ne changera pas votre pagerank mais donnera une meilleure visibilité de la structure de votre site aux robots que si vous le formatiez en utilisant des tableaux ou des div partout.</p>
<p>La sémantique du code html permet aux robots de distinguer le type de contenu, et de les utiliser de manière pertinente.</p>
<p>Par exemple, le tag &lt;h1&gt; doit contenir des titres de premier niveau, le tag &lt;h2&gt; des titres secondaires, le tag &lt;p&gt; des paragraphes de texte, et ainsi de suite.</p>
<p>Le plus important est évidemment la balise &lt;title&gt; de vos pages, qui doit contenir autant que possible les mots-clefs les plus importants.</p>
<p>La spécificité des robots par rapport aux utilisateurs ne s&#8217;arrête pas là.</p>
<p>En même temps que le contenu des pages, des codes d&#8217;erreurs sont émis. Ces codes sont rarement visibles pour l&#8217;utilisateur, à part le fameux 404 (page indisponible), mais ils sont importants.</p>
<p>Pour référence, voici une <a rel="external" href="http://www.google.com/support/webmasters/bin/answer.py?answer=40132&#038;hl=fr">liste des codes d&#8217;erreur</a> que les serveurs web sont susceptibles de retourner.</p>
<p>Imaginons que vous ayez un contenu dynamique&#8230; Certaines pages peuvent disparaitre de votre site, bien que des liens externes pointent encore dessus.</p>
<p>Typiquement, nous voulons rediriger l&#8217;utilisateur vers une page proche de sa requête, plutôt que de le confronter à une page d&#8217;erreur qui risque de le bloquer. Mais nous voulons aussi prévenir les moteurs de recherche que ce lien est obsolète et qu&#8217;il faut le supprimer. Dites vous bien que lorsqu&#8217;un robot tombe trop souvent sur un 404 il n&#8217;apprécie guère et cela peut avoir des conséquences sur votre référencement !</p>
<p>Comment résout-on cela, me direz vous ? Tout simplement, en émettant le code d&#8217;erreur approprié, tout en affichant un contenu pour l&#8217;utilisateur !</p>
<p>Le code 404 est le plus connu, mais cette erreur indique juste que la page n&#8217;a pas pu être jointe, pour quelque erreur que ce soit. Pour une page volontairement désactivée, nous lui préférerons l&#8217;erreur 410 qui indique que la page n&#8217;est plus disponible de manière délibérée et non suite à un problème technique.</p>
<p>A vous de choisir quel <a rel="external" href="http://www.webrankinfo.com/outils/faq_8_61.htm">code d&#8217;erreur</a> vous semble le plus à même de refléter le statut de la page&#8230;</p>
<p>Pour générer le code d&#8217;erreur, il va falloir modifier le &#8216;header&#8217; de la page. Sous php, il s&#8217;agit d&#8217;utiliser la commande suivante :</p>
<pre>header('HTTP/1.0 410 Gone');</pre>
<p>Notez que le header est la toute première chose qui est émise lorsque la page est envoyée. Il doit donc être situé tout au tout début du document, avant même la déclaration du type de document (<a rel="external" href="http://fr.wikipedia.org/wiki/Document_Type_Definition">DTD</a>).</p>
<p>Pas très pratique lorsque la gestion du contenu est structurée de manière à dissocier les éléments fixes de la page (comme le logo ou le menu) du contenu réel. En effet, si le script affiche le haut de la page avant de traiter la requête relative au contenu et de s&#8217;apercevoir qu&#8217;il n&#8217;existe pas, il est trop tard pour modifier le header !</p>
<p>Un moyen simple de contourner ce problème est d&#8217;augmenter la taille du buffer php.</p>
<p>Dans php.ini, modifier la ligne output_buffering :</p>
<pre>output_buffering = 65535</pre>
<p>Cette valeur est une valeur limite, mais généralement suffisante (si vos pages ne pèsent pas un poids déraisonnable!)</p>
<p>Vous pouvez désormais retourner n&#8217;importe quel type d&#8217;erreur quand vous le souhaitez, sans perturber la visite de vos utilisateurs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/10/29/404-et-seo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Préchargement d&#8217;images avec jQuery</title>
		<link>http://www.lindicible.com/blog/2008/05/23/prechargement-dimages-avec-jquery/</link>
		<comments>http://www.lindicible.com/blog/2008/05/23/prechargement-dimages-avec-jquery/#comments</comments>
		<pubDate>Fri, 23 May 2008 19:54:01 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[préchargement]]></category>
		<category><![CDATA[preload]]></category>
		<category><![CDATA[preloading]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=5</guid>
		<description><![CDATA[Pour ceux qui ne connaîtraient pas encore, jquery est une librairie javascript très puissante qui permet de faire beaucoup de choses en peu de lignes de code. Elle porte fièrement sa devise de &#171;&#160;code less, do more&#160;&#187;, qui est tout à fait appropriée !
Par ailleurs, jquery permet de développer des plugins de manière assez simple, [...]]]></description>
			<content:encoded><![CDATA[<p>Pour ceux qui ne connaîtraient pas encore, jquery est une librairie javascript très puissante qui permet de faire beaucoup de choses en peu de lignes de code. Elle porte fièrement sa devise de &laquo;&nbsp;code less, do more&nbsp;&raquo;, qui est tout à fait appropriée !</p>
<p>Par ailleurs, jquery permet de développer des plugins de manière assez simple, afin de rajouter des fonctionnalités au module de base. Mais nous y reviendrons une autre fois&#8230;</p>
<p>Le sujet du jour est le préchargement d&#8217;images, un concept relativement basique et régulièrement utile.</p>
<p>Voici une méthode simple pour l&#8217;effectuer :</p>
<pre>$.preloadImages = function(arguments)
{
    for (var i = 0; i &lt; arguments.length; i++) {
        $('&lt;img/&gt;').attr('src', arguments[i]);
    }
}

var imagesToPreload = Array(\
    'image1.gif',\
    '/repertoire/des/images/image2.gif',\
    'http://www.example.com/repertoire/image3.gif');

$.preloadImages(imagesToPreload);</pre>
<p>Notes:</p>
<ul>
<li>$ est un raccourci pour l&#8217;objet de base jQuery. En cas de conflit (par exemple avec Prototype, une autre lib assez répandue), il est possible de le redéfinir.</li>
<li>imagesToPreload contient une liste (Array) d&#8217;images sous forme de texte (String).</li>
<li>Les \ en fin de lignes permettent de continuer à la ligne du dessous en rendant le retour à la ligne invisible au parser javascript, et donc d&#8217;avoir une liste d&#8217;images plus agréable à lire si l&#8217;on aligne verticalement le début du nom de chaque image.</li>
<li>La fonction preloadImages() prend chacun des arguments donnés par le tableau (Array) et crée à la volée une balise html &lt;img&gt; puis donne à l&#8217;attribut &laquo;&nbsp;src&nbsp;&raquo; de cette balise le nom de l&#8217;image. Du coup, l&#8217;image est appelée et chargée dans le cache du navigateur.</li>
<li>Comme on n&#8217;insère pas cet objet dans le DOM, rien n&#8217;est affiché.</li>
</ul>
<p>Et voila. C&#8217;est simple et efficace, à l&#8217;image de jQuery !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2008/05/23/prechargement-dimages-avec-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
