<?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>Performance web &#187; Julien Lecomte</title>
	<atom:link href="http://performance.survol.fr/avec/julien-lecomte/feed/" rel="self" type="application/rss+xml" />
	<link>http://performance.survol.fr</link>
	<description>Quelques mots pour des sites web rapides</description>
	<lastBuildDate>Fri, 18 Jun 2010 12:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Éviter les événements trop fréquents</title>
		<link>http://performance.survol.fr/2008/10/eviter-les-evenements-trop-frequents/</link>
		<comments>http://performance.survol.fr/2008/10/eviter-les-evenements-trop-frequents/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 10:00:44 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[auto-completion]]></category>
		<category><![CDATA[Christian Heilmann]]></category>
		<category><![CDATA[événement]]></category>
		<category><![CDATA[event delegation]]></category>
		<category><![CDATA[High Performance Ajax Applications]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Julien Lecomte]]></category>
		<category><![CDATA[timeout]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=92</guid>
		<description><![CDATA[Les bons développeurs javascript utilisent les événements, à toutes les sauces. En fait quasiment tout ce qui est fait en javascript est en réaction à un événement. On arrive à deux problématiques qui ont un un impact plus ou moins &#8230; <a href="http://performance.survol.fr/2008/10/eviter-les-evenements-trop-frequents/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Les bons développeurs javascript utilisent les événements, à toutes les sauces. En fait quasiment tout ce qui est fait en javascript est en réaction à un événement. On arrive à deux problématiques qui ont un un impact plus ou moins important sur les performances :<span id="more-92"></span></p>
<h3>Diminuer la sensibilité</h3>
<p>Notre premier problème se voit assez facilement sur les aides à la saisie, par exemple celles qu&#8217;on trouve sur les moteurs de recherche. Vous avez forcément rencontré la chose : vous saisissez quelques lettres dans un champ texte, et le navigateur vous propose de compléter votre saisie, avec une liste des choix les plus fréquents.</p>
<p>Jusque là aucun problème. Sauf que si ce petit code tourne trop souvent ce sont plusieurs aller-retours fréquents qui vont être faits au serveur. Cela handicape votre navigateur &#8211; qui a une limite de connexions parallèles -, le serveur &#8211; qui répond donc moins rapidement -, et votre machine &#8211; qui exécute plus de javascript que nécessaire.</p>
<p>Pour jouer les stéréotypes je vais faire une recherche sur Angelina Jolie. Je sais ce que je tape, éventuellement je ne sais pas quelle est la bonne orthographe du nom de famille.</p>
<p>Tout d&#8217;abord il est inutile de lancer une aide à la saisie tant que je n&#8217;ai pas fini de saisir du texte. Je vais taper Angelina en entier, sans problèmes, sans délais. Lancer une aide dès que j&#8217;ai tapé &laquo;&nbsp;Ange&nbsp;&raquo; sera inutile. Les résultats ne seront pas pertinents et arriveront trop tard, quand j&#8217;aurai déjà taper tout ce qu&#8217;il faut. Pire, pour peu qu&#8217;ils me fassent une proposition sur &laquo;&nbsp;Anges et démons&nbsp;&raquo; je peux me retrouver perdu.</p>
<p>La première règle est donc de <strong>differer le traitement</strong>, de ne le lancer qu&#8217;après quelques dizaines de millisecondes, si et seulement si il n&#8217;y a aucune nouvelle frappe &#8211; et bien sûr d&#8217;<strong>annuler la requête si un nouvel événement apparaît avant la réponse</strong> (ici c&#8217;est une nouvelle frappe clavier). C&#8217;est <a href="http://yuiblog.com/blog/2007/07/09/downshift-your-code/">ce que propose Nicholas C. Zakas</a> sur le YUIBlog.</p>
<p>Pour peaufiner la durée d&#8217;attente peut varier suivant le nombre de caractères. A moins de quatre ou cinq caractères on peut mettre un temps d&#8217;attente important, parce qu&#8217;il est vraissembable que l&#8217;utilisateur complètera sa saisie pour continuer, et que les suggestions ont peu de chances d&#8217;être pertinentes.</p>
<h3>Rassembler les événements</h3>
<p>Le traitement des événements peut être gênant, mais sa collecte aussi. Attacher des centaines de gestionnaires d&#8217;événement a un coût, surtout sur les anciennes machines. Là dessus un ajoute que sur les vieux navigateurs il est assez facile de générer des fuites de mémoire et cela se multiplie par le nombre de gestionnaires d&#8217;événement.</p>
<p>La solution se nomme couramment event délégation (délégation d&#8217;événement). Imaginons un menu avec différents liens, vous voulez surveiller le clic ou le survol de chaque élément de la liste. Au lieu de lancer un gestionnaire d&#8217;événement par item, la délégation d&#8217;événement vous propose d&#8217;attacher votre gestionnaireur la liste elle même, puis de vérifier sur quel item a eu lieu l&#8217;événement afin de savoir quelle action lancer.</p>
<p>Julien Lecomte en parle dans sa présentation <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/1544">High Performance Ajax Applications</a> aux dernières conférences Velocity mais d&#8217;autres donnent plus de détails : par exemple Christian Heilmann avec un <a href="http://yuiblog.com/blog/2007/01/17/event-plan/">long article assez complet</a> sur le YUIBlog sur comment et pourquoi <strong>faire de la délégation d&#8217;événement</strong>, avec <a href="http://icant.co.uk/sandbox/eventdelegation/">un exemple</a> sur son site personnel. Si vous n&#8217;aimez pas YUI SitePoint fait <a href="http://www.sitepoint.com/blogs/2008/07/23/javascript-event-delegation-is-easier-than-you-think/">un article très court pour une gestion à la main</a>, ce qui n&#8217;est pas vraiment plus complexe.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/10/eviter-les-evenements-trop-frequents/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
