<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Retour à La Source • Tag: Javascript • RSS</title>
		<link>http://www.ab-d.fr/tag/Javascript/</link>
		<description>Retour à La Source • Tag: Javascript • RSS</description>
		<copyright>http://www.ab-d.fr/tag/Javascript/ (c) 2010</copyright>
		<language>fr</language>
		<pubDate>Sat, 31 Jul 2010 15:01:54 +0100</pubDate>
		<generator>Retour à La Source • Tag: Javascript • RSS • version 1.0</generator>
		<webMaster>noreply@ab-d.fr ( Benoit Asselin )</webMaster>
		<image>
			<url>http://www.ab-d.fr/images/rss.gif</url>
			<title>Retour à La Source • Tag: Javascript • RSS</title>
			<link>http://www.ab-d.fr/tag/Javascript/</link>
			<width>90</width>
			<height>30</height>
		</image>

		<item>
			<title>Combinaison de document.getElementById et RegExp ( javascript, dom )</title>
			<link>http://www.ab-d.fr/date/2008-12-14/</link>
			<pubDate>Sun, 14 Dec 2008 22:41:42 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Regex]]></category>
			<category><![CDATA[DOM]]></category>
			<description><![CDATA[<p>
On sent que la récession en France est très forte, j'ai moi-même du mal à joindre les 2 bouts... notamment à propos du temps qui m'est disponible pour rédiger ce poste (<em>Travailler plus, pour gagner plus, qui disait !</em>).<br />
L'idée du code source du jour :</p>
<p>
Rechercher dans une page (X)HTML, les <code>ID</code>entifiants correspondant à une expression régulière <code>new RegExp</code>.
</p>

<pre>
function getElementsByRegExpId(p_regexp, p_element, p_tagName) {
	p_element = p_element === undefined ? document : p_element;
	p_tagName = p_tagName === undefined ? '*' : p_tagName;
	var v_return = [];
	var v_inc = 0;
	for(var v_i = 0, v_il = p_element.getElementsByTagName(p_tagName).length; v_i &lt; v_il; v_i++) {
		if(p_element.getElementsByTagName(p_tagName).item(v_i).id &amp;&amp; p_element.getElementsByTagName(p_tagName).item(v_i).id.match(p_regexp)) {
			v_return[v_inc] = p_element.getElementsByTagName(p_tagName).item(v_i);
			v_inc++;
		}
	}
	return v_return;
}

// Exemple d'utilisation
var v_array = getElementsByRegExpId(/^test.+/);

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-12-14%2F&title=Combinaison+de+document.getElementById+et+RegExp+%28+javascript%2C+dom+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-12-14/</guid>
		</item>

		<item>
			<title>Obfuscateur de code Javascript ET geekettes en folie ( Hello geekette )</title>
			<link>http://www.ab-d.fr/date/2008-10-04/</link>
			<pubDate>Sat, 04 Oct 2008 09:00:54 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Obfuscateur]]></category>
			<category><![CDATA[Detente]]></category>
			<description><![CDATA[<p>
On peut dire qu'en ce moment, je fais fort avec des titres très accrocheur ! ( <em>ou qui ne semble avoir aucun sens... </em> ). Plus sérieusement, je vais vous parler d'un thème qui vous semblera au combien aride et en ennuyeux : l'obfuscator de code... Afin de vous captiver jusqu'au bout de ma prose, vous trouverez en fin de ce message une Geekette tout droit venue de vos rêves les plus fous !
</p>

<p>
Obfuscateur ou Obfuscator : encore un terme barbare pour ne pas dire grand chose et accessoirement pour frime dans un dîner mondain. Exemple :<br />
<br />
<em>- Oui, en effet, la semaine dernière, j'ai découvert un obfuscateur d'une grande puissance qui transforme du bytecode en un algorithme du même langage plus difficile à décompiler pour le newbie qui peine à coder deux méthodes en POO sans générer un code erreur de compilation.<br />
- Mmmffff mmmfff mmfff .....<br />
- Vous reprendrez bien un peu de thé avec ceci ?<br />
</em>
</p>

<p>
Avez-vous remarqué l'approche pédagogique qui a été faite, je vous ai donné une belle définition dans une blague totalement lamentable ?! L'obfuscateur a en effet pour mission de faire de la purée de votre code, et ainsi le rendre plus difficile à comprendre et donc à décompiler.<br />
Toutefois, dans notre cas présent, obfusquer de code Javascript a un double intérêt, rendre le code illisible (mais ceci n'est vraiment que très partiel) et surtout rendre vos scripts plus légers car ils se retrouveront débarrasser de leurs espaces et de leurs commentaires.
</p>

<p>
Voici sûrement le plus connu et gratuit <strong>/packer/</strong> de Dean Edwards disponible sur <a href="http://dean.edwards.name/packer/" rel="nofollow" onclick="window.open(this.href); return false;">http://dean.edwards.name/packer/</a> qui opère en ligne. Différentes options sont disponible, notamment retirer les espaces et commentaires, obfusquer le code, et remplacer les noms des variables sans influencer le comportent de vos scripts.
</p>

<p>
<br />
Et voici le passage que vous attendez tous : la Geekette !
</p>

<p>
Au hasard de mes navigations sur le net, je suis tombé sur le site <strong>Hello Geekette .com</strong>. Un petite série de court-métrages sur le thème des relations entre les geeks et les humains :
</p>
<pre><em>
Greg est ce que l'on peux appeler si ça existe: « un mec normal ».
Alors que Valérie est ce que l'on peux appeler: « une geekette » .

Mais cela ne serait pas grave… s’ils n’étaient pas aussi… colocataires!
</em></pre>

<p>
L'épisode <strong>Hello Geekette 5 - Geeks Vs Bobos</strong> est particulièrement savoureux ;-)<br />
Dernier épisode en date du 1er octobre <strong>Hello Geekette 8 - Faites la guerre, pas l'amour !</strong>.
</p>

<div style="text-align:center;">
<br />
Hello Geekette 5 - Geeks Vs Bobos<br />
<object width="420" height="336"><param name="movie" value="http://www.dailymotion.com/swf/k4gd0qxceKxGeoElRY&amp;related=0"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.dailymotion.com/swf/k4gd0qxceKxGeoElRY&amp;related=0" type="application/x-shockwave-flash" width="420" height="336" allowFullScreen="true" allowScriptAccess="always"></embed></object>
</div>

<p>
Sources :<br />
<a href="http://www.hellogeekette.com/" onclick="window.opent(this.href); return false;">http://www.hellogeekette.com/</a><br />
http://www.dailymotion.com/hellogeekette<br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-10-04%2F&title=Obfuscateur+de+code+Javascript+ET+geekettes+en+folie+%28+Hello+geekette+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-10-04/</guid>
		</item>

		<item>
			<title>Jeux-vidéo en Javascript ( js, svg, game, video games )</title>
			<link>http://www.ab-d.fr/date/2008-08-11/</link>
			<pubDate>Mon, 11 Aug 2008 10:09:08 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Detente]]></category>
			<description><![CDATA[<p>
Hélas, je ne vais pas vous sortir un Quake en Javascript <em>( encore que... avec les nouvelles fonctions de transformation de Webkit, je suis sûr qu'on pourrait presque y arriver )</em>. Pour le moment, on va rester dans le simple mais dont certains restent tout de même très impressionnant.
</p>

<p>
&bull; <a href="http://members.iinet.net.au/~pontipak/redsquare.html" onclick="window.open(this.href); return false;"><strong>Escapa</strong></a> : <em>vous devez sauver un carré rouge de méchants rectangles bleuuuuussss</em><br />
&bull; <a href="http://bezumie.com/" onclick="window.open(this.href); return false;"><strong>Bezumie</strong></a> :  <em>un peu de tout...</em><br />
&bull; <a href="http://p4wn.sourceforge.net/" onclick="window.open(this.href); return false;"><strong>Chess</strong></a> : <em>Jeu d'échec</em><br />
&bull; <a href="http://www.posi.net/software/othello/" onclick="window.open(this.href); return false;"><strong>Othello</strong></a> : <em>Qui ne connait pas Othello ?</em><br />
<br />
&bull; <a href="http://www.codedread.com/yastframe.php" onclick="window.open(this.href); return false;"><strong>Yast</strong></a> : <em>ni plus ni moins qu'un Tetris</em><br />
&bull; <a href="http://www.elizium.nu/scripts/lemmings/" onclick="window.open(this.href); return false;"><strong>Lemmings</strong></a> : <em>et pour finir en beauté, les Lemmings ! Oui Madame !</em><br />

</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-08-11%2F&title=Jeux-vid%C3%A9o+en+Javascript+%28+js%2C+svg%2C+game%2C+video+games+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-08-11/</guid>
		</item>

		<item>
			<title>Firefox 3 et input type=file Nouvelle Formule ! ( upload, path, nsIDOMFile )</title>
			<link>http://www.ab-d.fr/date/2008-07-12/</link>
			<pubDate>Sat, 12 Jul 2008 08:40:04 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Firefox]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[XHTML]]></category>
			<category><![CDATA[DOM]]></category>
			<description><![CDATA[<p>
De bon matin, je me lève, j'arrive sur une de mes applications en ligne, et là horreur ! cette dernière ne fonctionne plus sous Mozilla Firefox 3... Après analyse des petits messages d'erreurs, je me rends à l'évidence le formulaire <code>&lt;input type="file" /&gt;</code> ne se comporte plus de la même façon...
</p>

<p>
Les développeurs de Firefox 3 ont corrigé une petite faille de sécurité : Lorsque vous cliquez sur le bouton <strong>Parcourir</strong> le <code>value</code> de votre zone <code>input type="file"</code> contenait le nom du fichier ainsi que son chemin sur le disque dur, et bien aujourd'hui cela n'est plus, vous n'aurez plus que le nom du fichier.<br />
<em>D'ailleurs, Opera Browser se comporte aussi de la sorte, pour le moment Microsoft Internet Explorer et Apple Safari retournent toujours le chemin complet du fichier.</em>
</p>

<p>
Une très bonne nouvelle s'accompagne de ce petit changement, vous pouvez à présent accéder aux données du fichier sélectionné par l'utilisateur en Javascript sans poster le formulaire grâce à l'objet <code>FileList</code>. 
</p>

<p>
Un exemple vaut mieux qu'un long discours, voici une page qui vous permettra d'essayer cette nouvelle fonctionnalité (<em>qui je le rappelle, ne fonctionne que sur Mozilla Firefox 3</em>) :
</p>

<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"&gt;
&lt;head&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
	&lt;title&gt;input type=file &amp; Firefox 3&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
	
&lt;h1&gt;input type=file &amp; Firefox 3&lt;/h1&gt;
	
&lt;script type="text/javascript"&gt;
// &lt;![CDATA[

function inputFileOnChange() {
	var v_console = '';
	v_console += 'value: ' + document.getElementById('fichier').value;
	v_console += '&lt;br \/&gt;';
	
	if(document.getElementById('fichier')<strong>.files</strong>) {
		// Support: nsIDOMFile, nsIDOMFileList
		v_console += 'files.length: ' + document.getElementById('fichier')<strong>.files.length</strong>;
		v_console += '&lt;br \/&gt;';
		
		v_console += 'fileName: ' + document.getElementById('fichier')<strong>.files.item(0).fileName</strong>;
		v_console += '&lt;br \/&gt;';
		
		v_console += 'fileSize: ' + document.getElementById('fichier')<strong>.files.item(0).fileSize</strong>;
		v_console += '&lt;br \/&gt;';
		
		v_console += 'data: ' + document.getElementById('fichier')<strong>.files.item(0).getAsDataURL()</strong>;
//		v_console += 'data: ' + document.getElementById('fichier')<strong>.files.item(0).getAsBinary()</strong>;
//		v_console += 'data: ' + document.getElementById('fichier')<strong>.files.item(0).getAsText()</strong>;
		v_console += '&lt;br \/&gt;';
	};
	
	document.getElementById('console').innerHTML = v_console;
};

// ]]&gt;
&lt;/script&gt;
	
&lt;div&gt;
	&lt;input type="file" name="fichier" id="fichier" onchange="inputFileOnChange();" /&gt;
	&lt;br /&gt;&lt;br /&gt;
	&lt;code id="console"&gt;...console...&lt;/code&gt;
&lt;/div&gt;
	
&lt;/body&gt;
&lt;/html&gt;

</pre>

<p>Documentation officielle :<br />
&bull; <a href="http://developer.mozilla.org/en/docs/nsIDOMFile">http://developer.mozilla.org/en/docs/nsIDOMFile</a><br />
&bull; <a href="http://developer.mozilla.org/en/docs/nsIDOMFileList">http://developer.mozilla.org/en/docs/nsIDOMFileList</a><br />
&bull; <a href="http://www.w3.org/TR/file-upload/">http://www.w3.org/TR/file-upload/</a><br />
</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-07-12%2F&title=Firefox+3+et+input+type%3Dfile+Nouvelle+Formule+%21+%28+upload%2C+path%2C+nsIDOMFile+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-07-12/</guid>
		</item>

		<item>
			<title>Désactiver la saisie semi-automatique dans un input text ( autocomplete )</title>
			<link>http://www.ab-d.fr/date/2008-06-14/</link>
			<pubDate>Sat, 14 Jun 2008 00:07:08 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[XHTML]]></category>
			<description><![CDATA[<p>
Votre site comporte peut être des formulaires avec des zones <code>&lt;input type="text" /&gt;</code>, mais le navigateur soucieux d'assister l'utilisateur, pollue vos formulaires avec de la saisie semi-automatique...
</p>
<p>
Comment remédier à ce problème et surtout comment désactiver cette saisie semi-automatique ? Il "suffit" d'utiliser l'attribut <code>autocomplete</code>.
</p>
<pre>
&lt;input type="text" name="zone_texte" value="" autocomplete="off" /&gt;
</pre>
<p>
J'ai pu testé avec succès cet attribut sur les différents navigateurs du moment : Microsoft Internet Explorer, Mozilla Firefox, et Apple Safari (webkit). Toutefois, cet attribut <code>autocomplete</code> écrit de manière brute dans le code source de votre page n'est ni valide en HTML, ni valide en XHTML. Pour fixer ce petit soucis, vous pouvez initialiser l'attribut avec du Javascript au moyen de la méthode <code>setAttribute</code>.
</p>

<p>
Voici un exemple de code Javascript qui désactivera totalement la saisie semi-automatique dans vos formulaires HTML :
</p>
<pre>
&lt;script type="text/javascript"&gt;

window.onload = function() {
	for(var i = 0, l = document.getElementsByTagName('input').length; i &lt; l; i++) {
		if(document.getElementsByTagName('input').item(i).type == 'text') {
			document.getElementsByTagName('input').item(i).setAttribute('autocomplete', 'off');
		};
	};
};

&lt;script&gt;

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-14%2F&title=D%C3%A9sactiver+la+saisie+semi-automatique+dans+un+input+text+%28+autocomplete+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-14/</guid>
		</item>

		<item>
			<title>Gérer les PNG transparents avec Internet Explorer 6 ( javascript, filter, CSS )</title>
			<link>http://www.ab-d.fr/date/2008-06-01/</link>
			<pubDate>Sun, 01 Jun 2008 13:33:33 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Internet Explorer]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[CSS]]></category>
			<description><![CDATA[<p>
Voici un petit javascript qui vous permettra de fixer la transparence des images au format PNG transparent 24 bits sous Microsoft Internet Explorer 6.
</p>

<pre>
function fixPNG() {
	if(navigator.appName == 'Microsoft Internet Explorer') {
		var png = /\.png$/i;
		var imgs = document.getElementsByTagName('img');
		for(var i = 0, l = imgs.length; i &lt; l; i++) {
			if(png.test(imgs.item(i).src)) {
				imgs.item(i).style.width = imgs.item(i).offsetWidth;
				imgs.item(i).style.height = imgs.item(i).offsetHeight;
				imgs.item(i).style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + imgs.item(i).src + '\',sizingMethod=\'image\')';
				imgs.item(i).src = 'empty.gif';
			}
		}
	}
}

</pre>

<p>
Fonctionnement de la <code>function</code> :<br />
Le PNG transparent est remplacé par un fichier GIF totalement transparent de 1px&sup2;, puis le <code>filter</code> contenant le PNG est appliqué sur l'image GIF.<br />
Pour activer cette fonction, il suffit de l'appeler dans un événement <code>window.onload = function(){}</code>.
</p>


<p>
<em>Rappel des différentes écritures du <code>filter</code> en CSS :</em>
</p>
<pre>
img.image1 { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image1.png', sizingMethod='image'); }
img.image2 { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image2.png', sizingMethod='scale'); }
img.image3 { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image3.png', sizingMethod='crop'); }

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-06-01%2F&title=G%C3%A9rer+les+PNG+transparents+avec+Internet+Explorer+6+%28+javascript%2C+filter%2C+CSS+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-06-01/</guid>
		</item>

		<item>
			<title>Effectuer une rotation d'image en CSS ( rotate balise canvas HTML5 )</title>
			<link>http://www.ab-d.fr/date/2008-05-18/</link>
			<pubDate>Sun, 18 May 2008 17:18:19 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[CSS]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Canvas]]></category>
			<category><![CDATA[HTML5]]></category>
			<description><![CDATA[<p>
A l'heure où j'écris ces quelques lignes, il n'existe pas réellement de vraie solution pour effectuer une rotation sur une image (ou sur un élément) en CSS.
</p>
<p>
Sous Microsoft Internet Explorer, on peut effectuer une telle opération avec <code>filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);</code>. Toutefois, ceci ne permet pas d'effectuer une rotation au degré prêt.
</p>

<p>
Sous Apple Safari (Webkit), l'équipe de développement a proposé l'écriture suivante <code>-webkit-transform: rotate(90deg);</code>. Cette solution présente un très grand avantage, elle peut être appliquée sur tout type de balises et non simplement sur une image, mais cette propriété reste propre à Safari version 3.x...
</p>

<p>
Dans cette histoire, il reste toujours un navigateur sans réelle solution, notre cher Mozilla Firefox... on aurait pu espérer une commande du type <code>-moz-rotate: 90;</code>, mais il n'en est rien.
</p>

<p>
<br />
Voici donc la solution, utiliser la balise <code>&lt;canvas&gt;&lt;/canvas&gt;</code>.
</p>
<p>
La balise <code>&lt;canvas&gt;</code> est une extension non standard à la norme HTML qui permet d'effectuer des rendus dynamiques d'images bitmap via des scripts.<br />
Cette balise est supportée par les derniers navigateurs Mozilla Firefox, Apple Safari, et Opera Browser. A noter que Microsoft Internet Explorer ne supporte pas nativement la balise <code>&lt;canvas&gt;</code>, pour ce faire, vous devez utiliser une sous couche excanvas <em>( disponible sur http://excanvas.sourceforge.net )</em>
</p>


<p><br />
Exemple de script de rotation d'image compatible avec la plupart des navigateurs récents :</p>

<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"&gt;
&lt;head&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
	&lt;title&gt;rotate()&lt;/title&gt;
	
	&lt;style type="text/css" media="screen"&gt;
	img, canvas { border: 1px solid black; }
	&lt;/style&gt;


&lt;script type="text/javascript"&gt;

function rotate(p_deg) {
	if(document.getElementById('canvas')) {
		/*
		Ok!: Firefox 2, Safari 3, Opera 9.5b2
		Non: Opera 9.27
		*/
		var image = document.getElementById('image');
		var canvas = document.getElementById('canvas');
		var canvasContext = canvas.getContext('2d');
		
		switch(p_deg) {
			default :
			case 0 :
				canvas.setAttribute('width', image.width);
				canvas.setAttribute('height', image.height);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, 0, 0);
				break;
			case 90 :
				canvas.setAttribute('width', image.height);
				canvas.setAttribute('height', image.width);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, 0, -image.height);
				break;
			case 180 :
				canvas.setAttribute('width', image.width);
				canvas.setAttribute('height', image.height);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, -image.width, -image.height);
				break;
			case 270 :
			case -90 :
				canvas.setAttribute('width', image.height);
				canvas.setAttribute('height', image.width);
				canvasContext.rotate(p_deg * Math.PI / 180);
				canvasContext.drawImage(image, -image.width, 0);
				break;
		};
		
	} else {
		/*
		Ok!: MSIE 6 et 7
		*/
		var image = document.getElementById('image');
		switch(p_deg) {
			default :
			case 0 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=0)';
				break;
			case 90 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)';
				break;
			case 180 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2)';
				break;
			case 270 :
			case -90 :
				image.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)';
				break;
		};
		
	};
};


window.onload = function() {
	var image = document.getElementById('image');
	var canvas = document.getElementById('canvas');
	if(canvas.getContext) {
		image.style.visibility = 'hidden';
		image.style.position = 'absolute';
	} else {
		canvas.parentNode.removeChild(canvas);
	};
	
	rotate(0);
};

&lt;/script&gt;

&lt;/head&gt;

&lt;body&gt;


&lt;p&gt;
	rotate:
	&lt;input type="button" value="0&deg;" onclick="rotate(0);" /&gt;
	&lt;input type="button" value="90&deg;" onclick="rotate(90);" /&gt;
	&lt;input type="button" value="180&deg;" onclick="rotate(180);" /&gt;
	&lt;input type="button" value="-90&deg;" onclick="rotate(-90);" /&gt;
&lt;/p&gt;


&lt;p&gt;
	&lt;img id="image" src="http://www.google.com/intl/en_ALL/images/logo.gif" alt="" /&gt;
	&lt;canvas id="canvas"&gt;&lt;/canvas&gt;
&lt;/p&gt;


&lt;/body&gt;
&lt;/html&gt;

</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-05-18%2F&title=Effectuer+une+rotation+d%27image+en+CSS+%28+rotate+balise+canvas+HTML5+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-05-18/</guid>
		</item>

		<item>
			<title>Astuce avec Math.max() et Math.min() en Javascript sous Internet Explorer</title>
			<link>http://www.ab-d.fr/date/2008-04-06/</link>
			<pubDate>Sun, 06 Apr 2008 18:54:45 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Internet Explorer]]></category>
			<description><![CDATA[<p>
<code>Math.max()</code> et <code>Math.min()</code> attendent deux nombres comme paramètres. <code>Math.max()</code> retourne le plus grand des deux nombres, et <code>Math.min()</code> retourne le plus petits des deux nombres.
</p>
<p>
Depuis Microsoft Internet Explorer 5.5, vous pouvez ajouter plus de paramètres, et de manière générale les navigateurs dernières générations supportent cette écriture <em>(Microsoft Internet Explorer, Mozilla Firefox, Safari, Opera Browser...)</em>
</p>

<pre>
&lt;script type="text/javascript"&gt;

document.writeln(Math.max(5, 4, 3, -1, 9));	// retourne 9

document.writeln(Math.min(5, 4, 3, -1, 9));	// retourne -1

&lt;/script&gt;
</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-04-06%2F&title=Astuce+avec+Math.max%28%29+et+Math.min%28%29+en+Javascript+sous+Internet+Explorer"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-04-06/</guid>
		</item>

		<item>
			<title>Gérer window.orientation avec un iPhone / iPod Touch dans Safari (Webkit)</title>
			<link>http://www.ab-d.fr/date/2008-03-08/</link>
			<pubDate>Sat, 08 Mar 2008 18:31:13 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[iPhone]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Webkit]]></category>
			<description><![CDATA[<p>
Ce script vous permet de déterminer et de gérer l'orientation d'un iPhone ou d'un iPod Touch grâce à la variable <code>window.orientation</code> et à l'évènement <code>window.onorientationchange</code>.
</p>
<p>Exemple <strong>page-iphone-orientation.html</strong></p>
<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"&gt;
&lt;head&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
	&lt;title&gt; window.onorientationchange &amp; window.orientation &lt;/title&gt;
	
	&lt;script type="text/javascript"&gt;
	
	window.onorientationchange = function() {
		if(window.orientation !== undefined) {
			document.getElementById('value-1').innerHTML = window.orientation;
			switch(window.orientation) {
				case 0 :
					document.getElementById('value-2').innerHTML = 'Portrait - Normal';
					break;
				case 90 :
					document.getElementById('value-2').innerHTML = 'Paysage - Dans le sens &lt;strong&gt;contraire&lt;\/strong&gt; des aiguilles d\'une montre.';
					break;
				case -90 :
					document.getElementById('value-2').innerHTML = 'Paysage - Dans le sens des aiguilles d\'une montre.';
					break;
				case 180 :
					document.getElementById('value-2').innerHTML = 'Portrait - Renvers&eacute;';
					break;
			}
		} else {
			/* Vous n'utilisez ni un iPhone, ni un iPod Touch... */
			alert('Votre navigateur web ne supporte pas window.orientation');
		}
	}
	window.onload = window.onorientationchange;
	
	&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
	
	&lt;h1&gt;window.onorientationchange &amp; window.orientation&lt;/h1&gt;
	
	&lt;p&gt;window.orientation = &lt;span id="value-1"&gt;&lt;/span&gt; // &lt;span id="value-2"&gt;&lt;/span&gt;&lt;/p&gt;
	
	&lt;p&gt;Cette page ne fonction qu'avec les iPhone et les iPod Touch.&lt;/p&gt;
	
&lt;/body&gt;
&lt;/html&gt;

</pre>

<p>Ce script pourrait aussi servir à détecter si le navigateur utilisé est bien un navigateur Safari iPhone / iPod Touch.</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-03-08%2F&title=G%C3%A9rer+window.orientation+avec+un+iPhone+%2F+iPod+Touch+dans+Safari+%28Webkit%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-03-08/</guid>
		</item>

		<item>
			<title>insertAfter() avec insertBefore() et node.nextSibling (DOM Core Level 1)</title>
			<link>http://www.ab-d.fr/date/2008-02-23/</link>
			<pubDate>Sat, 23 Feb 2008 04:45:54 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[DOM]]></category>
			<description><![CDATA[<p>La méthode <code>element.insertBefore()</code> permet d'insérer un nœud (<em>node</em>) enfant juste avant le nœud enfant de référence parmi un nœud parent.</p>

<pre>
noeudParent.insertBefore(noeudAInserer, noeudDeReference);
</pre>

<p><br />
Il n'existe pas de méthode <code>element.insertAfter()</code> pour insérer un  nœud après le nœud de reference. Pour contourner cette limitation, vous pouvez utiliser <code>element.nextSibling</code>, qui renverra le nœud suivant au nœud spécifié.</p>

<pre>
noeudParent.insertBefore(noeudAInserer, noeudDeReference.nextSibling);
</pre>

<p><br />
Grâce au code source ci-dessous, vous pouvez ajouter la méthode <code>element.insertAfter()</code> et ainsi l'utiliser aussi simplement que <code>element.insertBefore()</code>.</p>

<pre>
Node.prototype.insertAfter = function(noeudAInserer, noeudDeReference) {
	if(noeudDeReference.nextSibling) {
		return this.insertBefore(noeudAInserer, noeudDeReference.nextSibling);
	} else {
		return this.appendChild(noeudAInserer);
	}
}
</pre>

<p><em>Attention: le code ci-dessus ne fonctionne pas sous Internet Explorer... pour ce faire, vous devez utiliser une simple fonction Javascript.</em></p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-02-23%2F&title=insertAfter%28%29+avec+insertBefore%28%29+et+node.nextSibling+%28DOM+Core+Level+1%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-02-23/</guid>
		</item>

		<item>
			<title>MAJ de Google Analytics et explications de _trackPageview() - ga.js</title>
			<link>http://www.ab-d.fr/date/2008-01-27/</link>
			<pubDate>Sun, 27 Jan 2008 00:32:23 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[Actionscript]]></category>
			<category><![CDATA[Google]]></category>
			<description><![CDATA[<p>Peut être comme moi, votre mois de décembre 2007 était chargé en divers activités professionnelles et familiales... et bien vous êtes sûrement dans ma situation, vous êtes passé à côté de la mise à jour du code Javascript de Google Analytics.</p>

<p>L'ancien code <code>urchin.js</code> reste toujours valable mais ne sera plus mise à jour</p>
<pre>
&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
_uacct = "UA-XXXXXX-X";
urchinTracker();
&lt;/script&gt;
</pre>

<p>&nbsp;</p>

<p>Voici le nouveau code <em>(pas franchement en avant première)</em> <code>ga.js</code> qui s'accompagne de son lot de nouveautés</p>
<pre>
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;

&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-XXXXXX-X");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;

</pre>
<p>Ce code Javascript se place toujours juste avant la balise fermante <code>&lt;/body&gt;</code> et doit être présent sur toutes pages de votre site internet devant être analysées par Google Analytics.</p>


<p>&nbsp;</p>
<p>&nbsp;</p>


<p><strong>Entrons maintenant un peu dans la technique avec la fonction <code>_trackPageview</code> de Google Analytics</strong></p>
<p>&nbsp;</p>
<p>La fonction <code>_trackPageview</code> de Google Analytics permet d'effectuer le suivi d'événements sur votre site internet qui ne sont pas comptabilisés dans le nombre de pages vues. Grâce à cette fonction, vous pouvez affecter le nom de fichier d'une page spécifique à des événements Adobe Flash, Javascript, à des téléchargements de fichiers, des liens sortants...</p>

<p>Exemple de lien internet sortant</p>
<pre>
&lt;a href="http://www.ab-d.fr/" onclick="javascript:pageTracker._trackPageview('/liens_externes/ab_d');"&gt;

</pre>

<p>Exemple de code Flash (Actionscript)</p>
<pre>
on (release) {
	getURL("javascript:pageTracker._trackPageview('/dossier/flash01.html');");
}
</pre>

<p>Chaque occurrence de l'événement appelant sera enregistrée comme s'il s'agissait d'une page de consultation pour l'URL <code>/mondossier/mapage</code>. L'argument doit débuter par une barre oblique et être placé entre guillemets droits.</p>

<p><ins><strong>Important</strong></ins> : Si vos pages contiennent un appel à la fonction <code>_trackPageview</code>, votre code de suivi Google Analytics doit être inséré dans votre code HTML au-dessus de cet appel. Dans ce cas, le code de suivi peut être inséré n'importe où entre la balise d'ouverture <code>&lt;body&gt;</code> et l'appel Javascript.</p>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-01-27%2F&title=MAJ+de+Google+Analytics+et+explications+de+_trackPageview%28%29+-+ga.js"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-01-27/</guid>
		</item>

		<item>
			<title>Fonction PHP trim() en JavaScript (prototype, function)</title>
			<link>http://www.ab-d.fr/date/2008-01-14/</link>
			<pubDate>Mon, 14 Jan 2008 10:10:10 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<pre>
String.prototype.trim = function() {
	return this.replace(/^\s*|\s*$/g, '');
};
</pre>
Exemple
<pre>
var v_string = ' Hello World ! ';
document.writeln('"' + v_string.trim() + '"');	// "Hello World !"
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-01-14%2F&title=Fonction+PHP+trim%28%29+en+JavaScript+%28prototype%2C+function%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-01-14/</guid>
		</item>

		<item>
			<title>Fonction PHP count() en JavaScript (prototype, function)</title>
			<link>http://www.ab-d.fr/date/2007-12-08/</link>
			<pubDate>Sat, 08 Dec 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<pre>
Array.prototype.count = function() {
	return this.length;
}
</pre>
<p>Exemples</p>
<pre>
var v_array = [ 5, 10, 15, 20, 25];
document.writeln(v_array.count());  // 5
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-12-08%2F&title=Fonction+PHP+count%28%29+en+JavaScript+%28prototype%2C+function%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-12-08/</guid>
		</item>

		<item>
			<title>Fonction PHP in_array() en JavaScript (prototype, function, inarray)</title>
			<link>http://www.ab-d.fr/date/2007-10-14/</link>
			<pubDate>Sun, 14 Oct 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<pre>
Array.prototype.in_array = function(p_val) {
	for(var i = 0, l = this.length; i &lt; l; i++) {
		if(this[i] == p_val) {
			return true;
		}
	}
	return false;
}
</pre>
<p>Exemples</p>
<pre>
var v_array = [ 5, 10, 15, 20, 25];
document.writeln(v_array.in_array(10));  // true
document.writeln(v_array.in_array(11));  // false
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-10-14%2F&title=Fonction+PHP+in_array%28%29+en+JavaScript+%28prototype%2C+function%2C+inarray%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-10-14/</guid>
		</item>

		<item>
			<title>Include CSS Stylesheet en DOM (Document Object Model)</title>
			<link>http://www.ab-d.fr/date/2007-09-18/</link>
			<pubDate>Tue, 18 Sep 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[CSS]]></category>
			<category><![CDATA[Javascript]]></category>
			<category><![CDATA[DOM]]></category>
			<description><![CDATA[<pre>
function includeCSS(p_file) {
	var v_css  = document.createElement('link');
	v_css.rel = 'stylesheet'
	v_css.type = 'text/css';
	v_css.href = p_file;
	document.getElementsByTagName('head')[0].appendChild(v_css);
}
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-09-18%2F&title=Include+CSS+Stylesheet+en+DOM+%28Document+Object+Model%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-09-18/</guid>
		</item>

		<item>
			<title>Internet Explorer ne supporte pas element.setAttritube('style')</title>
			<link>http://www.ab-d.fr/date/2007-08-02/</link>
			<pubDate>Thu, 02 Aug 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[CSS]]></category>
			<category><![CDATA[Javascript]]></category>
			<description><![CDATA[<pre>
if(navigator.appName == 'Microsoft Internet Explorer') {
	document.getElementById('test').style.cssText = 'background:gray; color:white;';
} else {
	/* document.getElementById('test').style.cssText = 'background:gray; color:white;'; */
	document.getElementById('test').setAttribute('style', 'background:gray; color:white;');
}
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-08-02%2F&title=Internet+Explorer+ne+supporte+pas+element.setAttritube%28%27style%27%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-08-02/</guid>
		</item>

		<item>
			<title>Comment rendre l'attribut target=&quot;_blank&quot; valide en XHTML ?</title>
			<link>http://www.ab-d.fr/date/2007-07-26/</link>
			<pubDate>Thu, 26 Jul 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[XHTML]]></category>
			<category><![CDATA[Javascript]]></category>
			<description><![CDATA[<p>Voici une autre manière d'écrire l'attribut "target" et valide pour la norme XHTML.</p>

<pre>
&lt;a href=&quot;http://www.ab-d.fr/&quot; onclick=&quot;window.open(this.href); return false;&quot;&gt;
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-07-26%2F&title=Comment+rendre+l%27attribut+target%3D%22_blank%22+valide+en+XHTML+%3F"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-07-26/</guid>
		</item>

		<item>
			<title>Comment sauvegarder les préférences d'un Widget (Dashboard) ?</title>
			<link>http://www.ab-d.fr/date/2007-03-12/</link>
			<pubDate>Mon, 12 Mar 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Widget]]></category>
			<category><![CDATA[Dashboard]]></category>
			<category><![CDATA[Mac OS X]]></category>
			<category><![CDATA[Javascript]]></category>
			<description><![CDATA[<p>Sauvegarder les préférences d'un Widgets ( Dashboard - Mac OSX )</p>

<p>Sauvegarder les préférences</p>
<pre>
if(window.widget) {
	widget.setPreferenceForKey(value, 'myKey');
}
</pre>

<p>Charger les préférences</p>
<pre>
if(window.widget) {
	if(!(widget.preferenceForKey('myKey') === undefined)) {
		var myKey = widget.preferenceForKey('myKey');
	}
}
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-03-12%2F&title=Comment+sauvegarder+les+pr%C3%A9f%C3%A9rences+d%27un+Widget+%28Dashboard%29+%3F"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-03-12/</guid>
		</item>

		<item>
			<title>Problème de double &quot;keypress&quot; avec Safari 2</title>
			<link>http://www.ab-d.fr/date/2007-02-25/</link>
			<pubDate>Sun, 25 Feb 2007 00:00:00 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[Safari]]></category>
			<category><![CDATA[Webkit]]></category>
			<category><![CDATA[Javascript]]></category>
			<description><![CDATA[<p>Ce script permet de fixer un bug dans Safari 2 (Mac OS X) lors d'un événement <code>keypress</code>, Safari a tendance à doubler la saisie.</p>
<pre>
var v_fixDblKey = 0;
function fixDblKey() {
	if(v_fixDblKey != 0) {
		return true;
	} else {
		v_fixDblKey = setTimeout('v_fixDblKey = 0;', 10);
		return false;
	}
}
</pre>
<p>Exemple :</p>
<pre>
...
inputOnkeyup : function(event) {
	if(fixDblKey()) { return; }
	switch(event.keyCode) {
		case 38 : /* up */
			break
		case 40 : /* down */
			break;
		case 37 : /* left */
			break;
		case 39 : /* right */
			break;
		case  9 : /* tab */
			break;
		case 13 : /* enter */
			break;
	}
}
...
</pre>
<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2007-02-25%2F&title=Probl%C3%A8me+de+double+%22keypress%22+avec+Safari+2"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/Javascript/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2007-02-25/</guid>
		</item>

	</channel>
</rss>
