<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://blog.roxing.net/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>blog.roxing.net</title>
	<link>http://blog.roxing.net/</link>
	<description>weblog roxing.net - astuces spip, php, bash, linux &amp; more</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://blog.roxing.net/spip.php?id_mot=52&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>blog.roxing.net</title>
		<url>https://blog.roxing.net/local/cache-vignettes/L144xH37/siteon0-6ddb5.png?1727125340</url>
		<link>http://blog.roxing.net/</link>
		<height>37</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>jQuery WebGL Ripples</title>
		<link>https://blog.roxing.net/jquery-webgl-ripples</link>
		<guid isPermaLink="true">https://blog.roxing.net/jquery-webgl-ripples</guid>
		<dc:date>2018-09-11T20:40:22Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierrox</dc:creator>


		<dc:subject>javascript</dc:subject>
		<dc:subject>webdesign</dc:subject>
		<dc:subject>webgl</dc:subject>

		<description>

-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/webdesign" rel="tag"&gt;webdesign&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/webgl" rel="tag"&gt;webgl&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://blog.roxing.net/local/cache-vignettes/L150xH79/arton145-ba602.jpg?1727222041' class='spip_logo spip_logo_right' width='150' height='79' alt=&#034;&#034; /&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://sirxemic.github.io/jquery.ripples/" class="spip_out"&gt;jQuery WebGL Ripples&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>[Vue.js] Collections de filtres</title>
		<link>https://blog.roxing.net/vue-js-collections-de-filtres</link>
		<guid isPermaLink="true">https://blog.roxing.net/vue-js-collections-de-filtres</guid>
		<dc:date>2017-10-16T13:06:25Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>javascript</dc:subject>
		<dc:subject>vue.js</dc:subject>

		<description>
&lt;p&gt;// formater une date (necessite moment.js) Vue.filter('formatDate', function(value,input,output) if (value) var input = input || 'MM-DD-YYYY' ; var output = output || 'DD/MM/YYYY' ; return moment(String(value),input).format(output) )
&lt;br class='autobr' /&gt;
// formater un prix Vue.filter('formatCurrency', function(value,currency) var value = parseFloat(value) ; var currency = currency || 'BRL' ;
&lt;br class='autobr' /&gt; if ( typeof(value) === 'number') (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/vue-js" rel="tag"&gt;vue.js&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;textarea readonly='readonly' cols='40' rows='28' class='spip_cadre spip_cadre_block' dir='ltr'&gt;// formater une date (necessite moment.js)
Vue.filter('formatDate', function(value,input,output) { if (value) { var input = input || 'MM-DD-YYYY'; var output = output || 'DD/MM/YYYY'; return moment(String(value),input).format(output) }
}) // formater un prix Vue.filter('formatCurrency', function(value,currency) { var value = parseFloat(value); var currency = currency || 'BRL'; if ( typeof(value) === 'number') { value = value.toLocaleString(undefined, {style: 'currency', currency: currency, minimumFractionDigits: 2, maximumFractionDigits: 2}) } return value
}) // inverser l'ordre d'un tableau
Vue.filter('reverse', function(value) { return value.slice().reverse();
})&lt;/textarea&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Testeur d'expressions r&#233;guli&#232;res en ligne </title>
		<link>https://blog.roxing.net/testeur-d-expression-reguliere-en-ligne</link>
		<guid isPermaLink="true">https://blog.roxing.net/testeur-d-expression-reguliere-en-ligne</guid>
		<dc:date>2016-03-27T15:54:14Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Pierrox</dc:creator>


		<dc:subject>php</dc:subject>
		<dc:subject>javascript</dc:subject>
		<dc:subject>regex</dc:subject>

		<description>&lt;p&gt;Un outil en ligne tr&#232;s pratique pour tester et commenter les expressions r&#233;guli&#232;res.&lt;/p&gt;

-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/php" rel="tag"&gt;php&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/regex" rel="tag"&gt;regex&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="https://regex101.com/" class="spip_out"&gt;Regular Expressions 101&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Bonnes pratiques JQuery</title>
		<link>https://blog.roxing.net/bonnes-pratiques-jquery</link>
		<guid isPermaLink="true">https://blog.roxing.net/bonnes-pratiques-jquery</guid>
		<dc:date>2014-09-18T14:14:52Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>javascript</dc:subject>
		<dc:subject>JQuery</dc:subject>
		<dc:subject>snippet</dc:subject>
		<dc:subject>astuce</dc:subject>

		<description>
&lt;p&gt;Charger le contenu depuis un CDN &lt;br class='autobr' /&gt;
Plut&#244;t que de stocker JQuery sur votre serveur, vous pouvez choisir un CDN notoire. Cela devrait r&#233;duire le temps de chargement de la page. &lt;br class='autobr' /&gt;
Voici une liste de CDN fournissant un acc&#232;s &#224; la biblioth&#232;que JQuery : Google CDN Microsoft CDN jQuery CDN CDNJS CDN jsDelivr CDN &lt;br class='autobr' /&gt;
Les bonnes pratiques ne concernent pas seuelement JQuery ; les &#233;l&#233;ments d'affichage - type CSS ou autre - peuvent aussi &#234;tre charg&#233;s parall&#232;lement. &lt;br class='autobr' /&gt;
Pr&#233;voir une m&#233;thode de chargement (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/billets" rel="directory"&gt;billets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/jquery" rel="tag"&gt;JQuery&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/snippet" rel="tag"&gt;snippet&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/astuce" rel="tag"&gt;astuce&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Charger le contenu depuis un CDN&lt;/h2&gt;
&lt;p&gt;Plut&#244;t que de stocker JQuery sur votre serveur, vous pouvez choisir un CDN&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Content Delivery Network : Un content delivery network (CDN) est constitu&#233; (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; notoire. Cela devrait r&#233;duire le temps de chargement de la page.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#034;xml&#034;&gt;&lt;!--:( --&gt;
&lt;script src=&#034;/vendor/jquery/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voici une liste de CDN fournissant un acc&#232;s &#224; la biblioth&#232;que JQuery :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://developers.google.com/speed/libraries/devguide#jquery&#034;&gt;Google CDN&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.asp.net/ajax/cdn#jQuery_Releases_on_the_CDN_0&#034;&gt;Microsoft CDN&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://jquery.com/download/#jquery-39-s-cdn-provided-by-maxcdn&#034;&gt;jQuery CDN&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://cdnjs.com/libraries/jquery/&#034;&gt;CDNJS CDN&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.jsdelivr.com/#!jquery&#034;&gt;jsDelivr CDN&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Les bonnes pratiques ne concernent pas seuelement JQuery ; les &#233;l&#233;ments d'affichage - type CSS ou autre - peuvent aussi &#234;tre charg&#233;s parall&#232;lement.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;voir une m&#233;thode de chargement alternative en cas de d&#233;failllance du CDN&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;script&gt;window.jQuery || document.write(&#034;&lt;script src='/vendor/jquery/jquery.min.js'&gt;\x3C/script&gt;&#034;);&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;f&#233;rer les versions compress&#233;es&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!-- :( --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js&#034;&gt;&lt;/script&gt;
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class=&#034;spip&#034;&gt;Placer l'appel au script en fin de page plut&#244;t qu'en en-t&#234;te&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!doctype html&gt;
&lt;head&gt;
...
&lt;!-- :( --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
...
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;/body&gt;
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Utiliser des URLs en chemins relatif&lt;/h2&gt;
&lt;p&gt;Pas besoin de sp&#233;cifier le protocole http ou https. Le navigateur optera de lui-m&#234;me pour le protocole https s'il se trouve d&#233;j&#224; dans un environemment s&#233;curis&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='xml spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!-- :( --&gt;
&lt;script src=&#034;http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;
&lt;!-- :) --&gt;
&lt;script src=&#034;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&#034;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Raccourci pour l'&#233;v&#233;nement ready&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// Appel classique
$(document).ready(function() {
...
});
// Version rapide
$(function() {
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Garder le $ lors de la d&#233;claration d'une variable de type jQuery.&lt;/h2&gt;
&lt;p&gt;Gr&#226;ce &#224; cette convention de nommage, on distingue facilement la nature de l'objet JQuery.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
var form = $('#contactForm');
// :)
var $form = $('#contactForm');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class=&#034;spip&#034;&gt;Du bon usage de $this&lt;/h2&gt;
&lt;p&gt;La variable $this s'utilise avantageusement au d&#233;but des fonctions non d&#233;clar&#233;es, par exemple dans une boucle de type each.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('li').each(function() {
$(this).on('click', function() {
$(this).addClass('active');
});
});
// :)
$('li').each(function() {
var $this = $(this);
$this.on('click', function() {
$this.addClass('active');
});
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Certains pr&#233;f&#232;rent utiliser &lt;i&gt;that&lt;/i&gt; ou &lt;i&gt;self&lt;/i&gt;. Attention de ne pas oublier qu'il s'agit d'un objet jQuery.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Mettre en cache les objets jQuery&lt;/h2&gt;
&lt;p&gt;Si un objet jQuery est utilis&#233; plusieurs fois, le mettre en cache permet d'optimiser les performances.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('.menu li').each(function() { ... });
$('.menu li').each(function() { ... });
// :)
var $items = $('.menu li');
$items.each(function() { ... });
// on recycle :)
$items.each(function() { ... });&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Encha&#238;nement des fonctions&lt;/h2&gt;
&lt;p&gt;C'est asssur&#233;ment l'une des fonctionalit&#233;s les plus appr&#233;ci&#233;e de jQuery. On peut ainsi appeler une s&#233;rie de m&#233;thodes dans la m&#234;me foul&#233;e.&lt;/p&gt;
&lt;blockquote&gt;&#034;Write less, do more&#034;, garder en t&#234;te le slogan de jQuery&lt;/blockquote&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
var $a = $('#about');
$a.hide();
$a.addClass();
$a.fadeIn();
$a.hide();
// :)
$('#about').hide().addClass().fadeIn().hide();
// c'est mieux
// Retour &#224; la ligne et identation am&#233;liorent la visibilit&#233;
$('#about')
.hide()
.addClass()
.fadeIn()
.hide();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;D&#233;clarer un nouvel &#233;l&#233;ment&lt;/h2&gt;
&lt;p&gt;Lors de la cr&#233;ation d'un &#233;l&#233;ment, fa&#238;tes en sorte de manipuler les &#233;l&#233;ments via les m&#233;thodes jQuery plut&#244;t que d'ins&#233;rer du code HTML brut.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// Don't
var $hidden = $('&lt;input class=&#034;form-control&#034; type=&#034;hidden&#034; name=&#034;foo&#034; value=&#034;bar&#034; /&gt;').appendTo('#form');
// :)
var $hidden = $('&lt;input/&gt;')
.addClass('form-control')
.attr('type', 'hidden')
.attr('name', 'foo')
.val('bar')
.appendTo('#form');
// ou bien
var $hidden = $('&lt;input/&gt;', {
class: 'form-control',
type: 'hidden',
name: 'foo',
value: 'bar'
}).appendTo('#form');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Garder le CSS loin des manipulations de jQuery&lt;/h2&gt;
&lt;p&gt;Pas la peine de d&#233;clarer le style CSS directement &#224; un &#233;l&#233;ment. Le recours aux classes est fait pour &#231;a.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('#button').css({
'background-color': '#5cb85c',
'border-color': '#4cae4c'
});
// :)
.success {
background-color: #5cb85c;
border-color: #4cae4c;
}
$('#button').addClass('success');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Choisir le bon s&#233;lecteur&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Le s&#233;lecteur d&#233;signant l'&lt;i&gt;id&lt;/i&gt; est le plus rapide&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour retrouver un &#233;l&#233;ment du DOM en fonction de son &lt;i&gt;id&lt;/i&gt;, jQuery utilise la m&#233;thode native &lt;i&gt;document.getElementById()&lt;/i&gt; qui s'av&#232;re bien plus efficace que Sizzle.&lt;/p&gt;
&lt;blockquote&gt;&lt;a href=&#034;https://github.com/jquery/sizzle&#034;&gt;Sizzle&lt;/a&gt; is a pure-JavaScript CSS selector engine used by jQuery&lt;/blockquote&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('#wrapper #inner');
$('div#inner');
$('.wrapper #inner');
// :)
$('#inner');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Du coup, mieux vaut introduire une recherche sur un &lt;i&gt;id&lt;/i&gt;, quitte &#224; encha&#238;ner les recherches.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('#container .row');
// + rapide
$('#container').find('.row');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;S&#233;lecteurs restrictifs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il faut &#234;tre sp&#233;cifique sur le partie gauche de votre s&#233;lecteur, et moins en d&#233;but.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// pas glup
$('div.data .gonzalez');
// glup glup
$('.data td.gonzalez');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&#201;viter le recours aux s&#233;lecteurs universels&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// moins rapide
$('div.container &gt; *');
// Plus rapide
$('.container').children();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mieux vaut faire pr&#233;c&#233;der les s&#233;lecteurs pseudo-class (ex &lt;i&gt;:before&lt;/i&gt;) avec un tag ou un autre s&#233;lecteur. Car, si ce n'est pas le cas, le s&#233;lecteur universel * est implicitement employ&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('.category :radio');
// :)
$('.category input:radio');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Privil&#233;giez les m&#233;thodes de tri plut&#244;t que les pseudos-s&#233;lecteurs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lorsque cele est possible, utiliser la m&#233;thode de tri jQuery plut&#244;t que des pseudos-s&#233;lecteurs. La m&#233;thode querySelectorAll s'av&#232;re l&#224; encore plus rapide que la m&#233;thode Sizzle.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$('.item:first')
// :)
$('.item').eq(0)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Pas de javascript &lt;i&gt;inline&lt;/i&gt; sur les &#233;lements HTML&lt;/h2&gt;
&lt;p&gt;Mieux vaut attacher un &#233;couteur d'&#233;v&#233;nement &#224; l'objet.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!-- :( --&gt;
&lt;button id=&#034;saveButton&#034; onclick=&#034;javascript: save();&#034;&gt;Save&lt;/button&gt;
// :)
$('#saveButton').on('click', function() {
...
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Choisir un namespace personnalis&#233; pour les &#233;v&#233;nements&lt;/h2&gt;
&lt;p&gt;Ainsi il est plus facile de d&#233;sactiver un &#233;v&#233;nement sans affecter les autres &#233;couteurs d'&#233;v&#233;nements assign&#233;s &#224; l'&#233;l&#233;ment.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$('#saveButton').on('click.bv', function() { ... });
//Plus tard, on peut retirer sans crainte l'&#233;couteur l'&#233;v&#233;nement
$('#saveButton').off('click.bv');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Ne pas passer les param&#232;tres Ajax &#034;en dur&#034;&lt;/h2&gt;
&lt;p&gt;Lorsque d'un requ&#234;te de type xmlHttpRequest, il faut utiliser le param&#232;tre &lt;i&gt;data&lt;/i&gt;, et non concat&#233;ner l'information au sein de l'URL.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='javascript spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// :(
$.ajax({
url: '/remote/url?param1=value1&amp;amp;param2=value2...'
}});
// :)
$.ajax({
url: '/remote/url',
data: {
param1: 'value1',
param2: 'value2'
...
}
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans le cas o&#249; les param&#232;tres &#224; transmettre sont tr&#232;s long (ex : le contenu int&#233;gral d'un article), on privil&#233;giera la m&#233;thode POST, &#224; la fois pour Ajax et le traitement c&#244;t&#233; serveur.&lt;/p&gt;
&lt;blockquote&gt;Internet Explorer 8 (and earlier) &lt;a href=&#034;http://support.microsoft.com/kb/208427&#034;&gt;limits&lt;/a&gt; 2083 characters in URL&lt;/blockquote&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://programer.tips/2014/09/best-jquery-practices.html" class="spip_out"&gt;Best jQuery practices &#183; Programmer Tips&lt;/a&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh1&#034; class=&#034;spip_note&#034; title=&#034;Notes 1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Content Delivery Network : Un content delivery network (CDN) est constitu&#233; d'ordinateurs reli&#233;s en r&#233;seau &#224; travers Internet et qui coop&#232;rent afin de mettre &#224; disposition du contenu ou des donn&#233;es (g&#233;n&#233;ralement du contenu multim&#233;dia volumineux) &#224; des utilisateurs.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>[SPIP] comment organiser ses fonctions javascript</title>
		<link>https://blog.roxing.net/organiser-ses-fonctions-javascript</link>
		<guid isPermaLink="true">https://blog.roxing.net/organiser-ses-fonctions-javascript</guid>
		<dc:date>2014-07-01T13:55:29Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>spip</dc:subject>
		<dc:subject>script</dc:subject>
		<dc:subject>javascript</dc:subject>
		<dc:subject>snippet</dc:subject>

		<description>&lt;p&gt;un snippet qui propose une structure de d&#233;part pour organiser ses fonctions javascript, et g&#233;rer facilement certains &#233;v&#233;nements &lt;em&gt;(ex. : scroll, resize, callback de spip ...)&lt;/em&gt;&lt;/p&gt;

-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/spip-49" rel="tag"&gt;spip&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/script-50" rel="tag"&gt;script&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/snippet" rel="tag"&gt;snippet&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;textarea readonly='readonly' cols='40' rows='82' class='spip_cadre spip_cadre_block' dir='ltr'&gt;var App = function () { var fn1 = function() { } var fn2 = function() { } var fn3 = function() { } //########################## // Surveiller le scroll var spyScroll = function() { var scrollticker; $(window).on('scroll',function() { //Clear Timeout if one is pending if(scrollticker) { window.clearTimeout(scrollticker); scrollticker = null; } scrollticker=window.setTimeout(function(){ App.scroll(); }, 2500); // timeout }); } // Surveiller le resize var spyResize = function() { var resizeticker; window.onresize = function() { // Clear Timeout if one is pending window.clearTimeout(resizeticker); resizeticker=window.setTimeout(function(){ App.resize(); }, 2500); // timeout }; } // suivre ajaxcallback de spip var spySpipAjax = function() { if (typeof onAjaxLoad == 'function') { onAjaxLoad(App.reboot); } } //########################## return { //Attention &#224; l'ordre d'appel des modules init: function () { fn1(); fn2(); fn3(); // les fonctions &#034;espions&#034; spySpipAjax(); spyScroll(); spyResize(); }, // ici les fonctions &#034;ajaxcallback proof&#034; reboot: function () { fn2(); }, // ici les fonctions qui r&#233;agissent au scroll scroll: function () { fn3(); }, // ici les fonctions qui r&#233;agissent au resize screen resize: function () { fn3(); } }; }(); //go ! $(function(){App.init();});&lt;/textarea&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;mis &#224; jour le 21 f&#233;vrier 2016&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Attributs data-*</title>
		<link>https://blog.roxing.net/attributs-data</link>
		<guid isPermaLink="true">https://blog.roxing.net/attributs-data</guid>
		<dc:date>2014-06-10T01:25:46Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>javascript</dc:subject>
		<dc:subject>html</dc:subject>

		<description>
&lt;p&gt;Utilisation avec JavaScript
&lt;br class='autobr' /&gt;
&lt;img src=&#034;mamoto.jpg&#034; alt=&#034;Une moto rouge&#034; id=&#034;moto&#034; data-auteur=&#034;Simon&#034; data-lieu=&#034;Strasbourg&#034; data-materiel=&#034;EOS&#034; data-gps=&#034;48.582967,7.74828&#034; /&gt; var monelement = document.getElementById('moto') ;
&lt;br class='autobr' /&gt;
// Lecture d'une valeur var auteur = monelement.dataset.auteur ;
&lt;br class='autobr' /&gt;
// Modification d'une valeur monelement.dataset.gps = '49.04777,7.440491' ;
&lt;br class='autobr' /&gt;
// Suppression monelement.dataset.gps = null ; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/html" rel="tag"&gt;html&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Utilisation avec JavaScript&lt;br class='autobr' /&gt;
&lt;code class='html spip_code spip_code_inline' dir='ltr'&gt;&lt;img src=&#034;mamoto.jpg&#034; alt=&#034;Une moto rouge&#034; id=&#034;moto&#034; data-auteur=&#034;Simon&#034; data-lieu=&#034;Strasbourg&#034; data-materiel=&#034;EOS&#034; data-gps=&#034;48.582967,7.74828&#034; /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;script&gt; var monelement = document.getElementById('moto'); // Lecture d'une valeur var auteur = monelement.dataset.auteur; // Modification d'une valeur monelement.dataset.gps = '49.04777,7.440491'; // Suppression monelement.dataset.gps = null; &lt;/script&gt;
&lt;/cadre&gt;
&lt;p&gt;Du c&#244;t&#233; de jQuery&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='10' class='spip_cadre spip_cadre_block' dir='ltr'&gt;// Lire $(&#034;#moto&#034;).data(&#034;lieu&#034;); // Modifier la valeur associ&#233;e $(&#034;#moto&#034;).data(&#034;lieu&#034;,&#034;Strasbourg&#034;); // Modifier l'attribut $(&#034;#moto&#034;).attr(&#034;data-lieu&#034;,&#034;Strasbourg&#034;);&lt;/textarea&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://www.alsacreations.com/article/lire/1397-attributs-data-et-api.html" class="spip_out"&gt;Attributs data-* - Alsacreations&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Code Snippets | CSS-Tricks</title>
		<link>https://blog.roxing.net/code-snippets-css-tricks</link>
		<guid isPermaLink="true">https://blog.roxing.net/code-snippets-css-tricks</guid>
		<dc:date>2014-06-08T19:00:55Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>css</dc:subject>
		<dc:subject>javascript</dc:subject>
		<dc:subject>JQuery</dc:subject>
		<dc:subject>snippet</dc:subject>
		<dc:subject>html</dc:subject>

		<description>
&lt;p&gt;HTML
&lt;br class='autobr' /&gt;
CSS
&lt;br class='autobr' /&gt;
htaccess
&lt;br class='autobr' /&gt;
PHP
&lt;br class='autobr' /&gt;
JavaScript
&lt;br class='autobr' /&gt;
jQuery
&lt;br class='autobr' /&gt;
WordPress&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/css" rel="tag"&gt;css&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/jquery" rel="tag"&gt;JQuery&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/snippet" rel="tag"&gt;snippet&lt;/a&gt;, 
&lt;a href="https://blog.roxing.net/html" rel="tag"&gt;html&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;HTML&lt;br class='autobr' /&gt;
CSS&lt;br class='autobr' /&gt;
htaccess&lt;br class='autobr' /&gt;
PHP&lt;br class='autobr' /&gt;
JavaScript&lt;br class='autobr' /&gt;
jQuery&lt;br class='autobr' /&gt;
WordPress&lt;/p&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://css-tricks.com/snippets/" class="spip_out"&gt;Code Snippets | CSS-Tricks&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>ScrollToTop sans jQuery - via Ecyseo</title>
		<link>https://blog.roxing.net/scrolltotop-sans-jquery-via-ecyseo</link>
		<guid isPermaLink="true">https://blog.roxing.net/scrolltotop-sans-jquery-via-ecyseo</guid>
		<dc:date>2014-06-05T21:39:40Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>javascript</dc:subject>

		<description>
&lt;p&gt;/* # ------------------ BEGIN LICENSE BLOCK ------------------ # # This file is part of SIGesTH # # Copyright (c) 2009 - 2014 Cyril MAGUIRE, (!Pragmagiciels) # Licensed under the CeCILL v2.1 license. # See http://www.cecill.info/licences.fr.html # # ------------------- END LICENSE BLOCK ------------------- */ ;(function(window,undefined) &lt;br class='autobr' /&gt; 'use_strict' ; &lt;br class='autobr' /&gt; var timeOut ; var isIE = isIE() ; var bodyTag = document.getElementsByTagName('body') ; var idOfBody = (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;textarea readonly='readonly' cols='40' rows='119' class='spip_cadre spip_cadre_block' dir='ltr'&gt;/* # ------------------ BEGIN LICENSE BLOCK ------------------ # # This file is part of SIGesTH # # Copyright (c) 2009 - 2014 Cyril MAGUIRE, (!Pragmagiciels) # Licensed under the CeCILL v2.1 license. # See http://www.cecill.info/licences.fr.html # # ------------------- END LICENSE BLOCK ------------------- */ ;(function(window,undefined) { 'use_strict'; var timeOut; var isIE = isIE(); var bodyTag = document.getElementsByTagName('body'); var idOfBody = bodyTag[0].getAttribute('id'); if (idOfBody == null) { idOfBody = 'top'; bodyTag[0].setAttribute('id', 'top'); } function isIE() { var nav = navigator.userAgent.toLowerCase(); return (nav.indexOf('msie') != -1) ? parseInt(nav.split('msie')[1]) : false; } function backToTop() { if (document.body.scrollTop!=0 || document.documentElement.scrollTop!=0){ window.scrollBy(0,-50); timeOut=setTimeout('backToTop()',40); } else { clearTimeout(timeOut); } } function getScrollPosition() { return Array((document.documentElement &amp;&amp; document.documentElement.scrollLeft) || window.pageXOffset || self.pageXOffset || document.body.scrollLeft,(document.documentElement &amp;&amp; document.documentElement.scrollTop) || window.pageYOffset || self.pageYOffset || document.body.scrollTop); } function Remove(idOfParent,idToRemove) { if (isIE) { document.getElementById(idToRemove).removeNode(true); } else { var Node1 = document.getElementById(idOfParent); var len = Node1.childNodes.length; for(var i = 0; i &lt; len; i++){ if (Node1.childNodes[i] != undefined &amp;&amp; Node1.childNodes[i].id != undefined &amp;&amp; Node1.childNodes[i].id == idToRemove){ Node1.removeChild(Node1.childNodes[i]); } } } } function addElement(idOfParent,idToAdd,htmlToInsert) { var DomParent = document.getElementById(idOfParent);//id of body var newdiv = document.createElement('div'); newdiv.setAttribute('id',idToAdd); newdiv.innerHTML = htmlToInsert; DomParent.appendChild(newdiv); } function displayBackButton() { var pos = []; var fleche = '\u21E7'; if (isIE) { fleche = '\u25B2'; } pos = getScrollPosition(); var topLink = document.getElementById('toplink'); if (pos[1] &gt; 150) { if (topLink == null) { addElement(idOfBody,'toplink','&lt;a href=&#034;#&#034; onclick=&#034;backToTop();return false;&#034;&gt;'+fleche+'&lt;/a&gt;'); } } else { if (topLink != null) { Remove(idOfBody,'toplink'); } } } //add to global namespace window.onscroll = displayBackButton; window.displayBackButton = displayBackButton; window.backToTop = backToTop; })(window);&lt;/textarea&gt;
&lt;p&gt;Et la CSS associ&#233;e&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='11' class='spip_cadre spip_cadre_block' dir='ltr'&gt;#toplink { position: fixed; bottom: 20px; width: 100px; text-align: center; right:10px; } #toplink a { font-size: 40px; opacity: 0.8; }&lt;/textarea&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://www.ecyseo.net/article35/scrolltotop-sans-jquery-en-pur-javascript" class="spip_out"&gt;ScrollToTop sans jQuery - Ecyseo&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Filtrer une liste en pur javascript et sans jQuery - via Ecyseo</title>
		<link>https://blog.roxing.net/filtrer-une-liste-en-pur-javascript-et-sans</link>
		<guid isPermaLink="true">https://blog.roxing.net/filtrer-une-liste-en-pur-javascript-et-sans</guid>
		<dc:date>2014-06-05T21:29:27Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>placido</dc:creator>


		<dc:subject>javascript</dc:subject>

		<description>
&lt;p&gt;/* # ------------------ BEGIN LICENSE BLOCK ------------------ # # This file is part of SIGesTH # # Copyright (c) 2009 - 2014 Cyril MAGUIRE, (!Pragmagiciels) # Licensed under the CeCILL v2.1 license. # See http://www.cecill.info/licences.fr.html # # ------------------- END LICENSE BLOCK ------------------- */ /* HTML Structure Filtrer First element */ ;(function(window,undefined) &lt;br class='autobr' /&gt; 'use_strict' ; &lt;br class='autobr' /&gt; var keyCode = 0 ; var isIE = isBrowserIE() ; function isBrowserIE() (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.roxing.net/signets" rel="directory"&gt;signets&lt;/a&gt;

/ 
&lt;a href="https://blog.roxing.net/javascript" rel="tag"&gt;javascript&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;textarea readonly='readonly' cols='40' rows='295' class='spip_cadre spip_cadre_block' dir='ltr'&gt;/* # ------------------ BEGIN LICENSE BLOCK ------------------ # # This file is part of SIGesTH # # Copyright (c) 2009 - 2014 Cyril MAGUIRE, (!Pragmagiciels) # Licensed under the CeCILL v2.1 license. # See http://www.cecill.info/licences.fr.html # # ------------------- END LICENSE BLOCK ------------------- */ /* HTML Structure &lt;label for=&#034;&#034;&gt;Filtrer&lt;/label&gt; &lt;input id=&#034;inputFilterForwhatYouWantHere&#034; name=&#034;inputName&#034; type=&#034;text&#034; placeholder=&#034;Find in the list&#034; /&gt; &lt;ul id=&#034;filterForWhatYouChooseForInputAbove&#034; class=&#034;filter&#034;&gt; &lt;li&gt;&lt;a&gt;First element&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; */ ;(function(window,undefined){ 'use_strict'; var keyCode = 0; var isIE = isBrowserIE(); function isBrowserIE() { var nav = navigator.userAgent.toLowerCase(); return (nav.indexOf('msie') != -1) ? parseInt(nav.split('msie')[1]) : false; } // from http://www.javascripter.net/faq/onkeydown.htm function fromKeyCode (n) { if( 47&lt;=n &amp;&amp; n&lt;=90 ) return unescape('%'+(n).toString(16)) if( 96&lt;=n &amp;&amp; n&lt;=105) return 'NUM '+(n-96) if(112&lt;=n &amp;&amp; n&lt;=135) return 'F'+(n-111) switch (n) { case (3): return 'Cancel' //DOM_VK_CANCEL case (6): return 'Help' //DOM_VK_HELP case (8): return 'Backspace' case (9): return 'Tab' case (12): return 'NUM 5' //DOM_VK_CLEAR case (13): return 'Enter' case (16): return 'Shift' case (17): return 'Ctrl' case (18): return 'Alt' case (19): return 'Pause|Break' case (20): return 'CapsLock' case (27): return 'Esc' case (32): return 'Space' case (33): return 'PageUp' case (34): return 'PageDown' case (35): return 'End' case (36): return 'Home' case (37): return 'Left Arrow' case (38): return 'Up Arrow' case (39): return 'Right Arrow' case (40): return 'Down Arrow' case (42): return '*' //Opera case (43): return '+' //Opera case (44): return 'PrntScrn' case (45): return 'Insert' case (46): return 'Delete' case (91): return 'WIN Start' case (92): return 'WIN Start Right' case (93): return 'WIN Menu' case (106): return '*' case (107): return '+' case (108): return 'Separator' //DOM_VK_SEPARATOR case (109): return '-' case (110): return '.' case (111): return '/' case (144): return 'NumLock' case (145): return 'ScrollLock' //Media buttons (Inspiron laptops) case (173): return 'Media Mute On|Off' case (174): return 'Media Volume Down' case (175): return 'Media Volume Up' case (176): return 'Media &gt;&gt;' case (177): return 'Media &lt;&lt;' case (178): return 'Media Stop' case (179): return 'Media Pause|Resume' case (182): return 'WIN My Computer' case (183): return 'WIN Calculator' case (186): return '; :' case (187): return '= +' case (188): return ', &lt;' case (189): return '- _' case (190): return '. &gt;' case (191): return '/ ?' case (192): return '` ~' case (219): return '[ {' case (220): return '\ |' case (221): return '] }' case (222): return '\' &#034;' case (224): return 'META|Command' case (229): return 'WIN IME' case (255): return 'Device-specific' //Dell Home button (Inspiron laptops) } return null } function arrayCompare(a1, a2) { if (a1.length != a2.length) return false; var length = a2.length; for (var i = 0; i &lt; length; i++) { if (a1[i] !== a2[i]) return false; } return true; } function inArray(needle, haystack) { var length = haystack.length; for(var i = 0; i &lt; length; i++) { if(typeof haystack[i] == 'object') { if(arrayCompare(haystack[i], needle)) return true; } else { if(haystack[i] == needle) return true; } } return false; } var object = { init: function() { var input = document.getElementsByTagName('input'); for (var i = 0, c = input.length; i &lt; c; i++) { this.addEventListener(input[i],&#034;keypress&#034;, this); this.addEventListener(input[i],&#034;keydown&#034;, this); }; }, field:'', idPressed: '', fieldVal: '', addEventListener: function(el, eventName, handler) { if (el.addEventListener) { el.addEventListener(eventName, handler, false); } else { el.attachEvent('on' + eventName, object.handleEvent); } }, handleEvent: function(e) { var obj = Object; var evt = e ? e:event; var chrTyped, chrCode = 0; if (evt.charCode!=null) chrCode = evt.charCode; else if (evt.which!=null) chrCode = evt.which; else if (evt.keyCode!=null) chrCode = evt.keyCode; if (chrCode==0) chrTyped = 'SPECIAL KEY'; else chrTyped = String.fromCharCode(chrCode); if (evt.keyCode==8) chrTyped = 'Backspace'; if (isIE) { obj = object; } else { obj = this; } obj.field = evt.target || evt.srcElement; obj.idPressed = obj.field.getAttribute('id'); obj.fieldVal = obj.field.value; if (chrTyped != 'SPECIAL KEY') { obj.action(chrTyped); } }, action: function(a) { var obj = Object; if (isIE) { obj = object; } else { obj = this; } var id = obj.idPressed; if (id == null) return true; var val = obj.fieldVal; var idList = id.substring(14,id.length); //we remove &#034;inputFilterFor&#034; from input id var list = document.getElementById('filterFor'+idList); //to find list associated with input if (list == null) return true; var listItem = list.getElementsByTagName('li'); if (listItem == null) return true; var span = null; //text filled in input form if (a != 'Backspace') { //we add key because input value is filled after key is up val += a; } else { val = val.substring(0, val.length-1);//we remove last char because input value is updated after key is up } // if empty, all the list is display if(val == ''){ for(var i =0, count = listItem.length; i &lt; count; i++) { listItem[i].style.display = 'list-item'; } return true; } // regex build from what is filled in form : (.*)e(.*)x(.*)e(.*)m(.*)p(.*)l(.*)e(.*) var regexp = '\b(.*)'; for(var i =0, count = val.length; i &lt; count; i++){ if (inArray(val[i],['.','?','*','+','/'])) {regexp += '(\'+val[i]+')(.*)';} else if (val[i] != '') {regexp += '('+val[i]+')(.*)';} } regexp += '\b'; // for each item of the list for(var i =0, count = listItem.length; i &lt; count; i++) { listItem[i].style.display = 'list-item'; // we looking for span tag wrapped by link tag var links = listItem[i].getElementsByTagName('a'); for (var k = 0, c= links.length; k &lt; c; k++) { var span = links[k].getElementsByTagName('span'); } // we take the first one if (span[0] != undefined) { span = span[0]; if(span.innerHTML.match(new RegExp(regexp,'i'))) { listItem[i].style.display = 'list-item'; } else { listItem[i].style.display = 'none'; } } } return true; } }; // Init object.init(); })(window);&lt;/textarea&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://www.ecyseo.net/article36/filtrer-une-liste-en-pur-javascript-et-sans-jquery" class="spip_out"&gt;Filtrer une liste en pur javascript et sans jQuery - Ecyseo&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
