<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://hanblog.info/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Hanblog - Tag - DOM</title>
  <link>http://hanblog.info/blog/</link>
  <atom:link href="http://hanblog.info/blog/feed/tag/DOM/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Mon, 13 Oct 2008 19:49:32 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Librairies JavaScript : Connaissez vos outils</title>
    <link>http://hanblog.info/blog/post/2008/08/27/Librairies-JavaScript-%3A-Connaissez-vos-outils</link>
    <guid isPermaLink="false">urn:md5:653b96fd1a21e40ecf904cc6ae20755b</guid>
    <pubDate>Wed, 27 Aug 2008 23:15:00 +0200</pubDate>
    <dc:creator>Anthony Ricaud</dc:creator>
        <category>Informatique</category>
        <category>css</category><category>DOM</category><category>jquery</category><category>performance</category>    
    <description>    &lt;p&gt;Certes je n'aime pas les librairies JavaScript en général. Beaucoup de code téléchargé, parsé, exécuté pour n'utiliser la plupart du temps qu'un ensemble très réduit de fonctionnalités. Mais bon, mettons ça de côté aujourd'hui car il faut l'admettre, elles rendent tout de même de bons services.&lt;/p&gt;


&lt;p&gt;On va quand même garder un point qui m'embête&amp;nbsp;: ces librairies cachent souvent la complexité du code qu'elles exécutent. Pour démontrer cela, mettons nous en situation&amp;nbsp;! &lt;a href=&quot;http://hanblog.info/blog/public/toggle.html&quot; hreflang=&quot;fr&quot;&gt;L'exemple sur la page suivante&lt;/a&gt; contient 1729 paragraphes de deux mots. Pour une raison évidente&lt;sup&gt;[&lt;a href=&quot;http://hanblog.info/blog/post/2008/08/27/#pnote-73-1&quot; id=&quot;rev-pnote-73-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;, nous voulons cacher le deuxième mot de chaque paragraphe. Pour cela, nous utilisons jQuery de deux manières différentes.&lt;/p&gt;


&lt;h2&gt;La méthode toggle&lt;/h2&gt;
&lt;pre&gt;
$('span').toggle();
&lt;/pre&gt;

&lt;p&gt;Que fait réellement cette simple ligne&amp;nbsp;? Elle va récupérer tous les éléments &amp;lt;span&amp;gt; de la page puis leur appliquer la &lt;a href=&quot;http://docs.jquery.com/Effects/toggle&quot; hreflang=&quot;en&quot;&gt;méthode toggle&lt;/a&gt;. Pour chaque élément trouvé (1729 je rappelle), elle va vérifier s'il est affiché ou non et lui appliqué un style en conséquence. C'est tellement long que votre navigateur risque de bloquer sur la page de test.&lt;/p&gt;


&lt;h2&gt;La méthode classe&lt;/h2&gt;
&lt;pre&gt;
$('div').eq(0).toggleClass('hidden');
&lt;/pre&gt;

&lt;p&gt;Jeu de mot pas terrible mais qui résume bien la situation. Ce code récupère tous les éléments &amp;lt;div&amp;gt; de la page et ne travaille que sur le premier. Sur ce &amp;lt;div&amp;gt;, elle va regarder s'il a la classe hidden et en fonction, lui ajoutera ou enlèvera cette classe. Voilà, c'est tout ce qu'elle fait. Ensuite, c'est le navigateur qui travaille comme un grand grâce à la règle &lt;code&gt;.hidden span {display:none;}&lt;/code&gt;. Évidemment, le moteur CSS de votre navigateur fera ça bien plus rapidement.&lt;/p&gt;


&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Évidemment, mon exemple avec autant d'éléments est grossier. Mais tout de même, la différence est fondamentale. Permettez-moi une analogie entre un accès DOM et un accès disque, c'est à dire les parties les plus lentes des deux algorithmes précédents. Dans le premier cas, un premier accès en lecture (récupérer tous les spans) puis 1729 accès en lecture (est-il affiché ?) et 1729 accès en écriture (réglons son affichage). Dans le deuxième cas, nous avons un premier accès en lecture (récupérons tous les divs) puis un accès en lecture (est-ce que la classe est présente ?) puis un accès en écriture (ajoutons ou enlevons la classe). Le calcul est vite fait...&lt;/p&gt;


&lt;p&gt;De manière générale, rappelons qu'il faut le moins possible toucher au style d'un élément. Si vous devez accéder plus de deux fois à l'attribut style, il sera plus profitable de passer par une règle CSS. &lt;strong&gt;Le moteur CSS sera toujours plus rapide que vous.&lt;/strong&gt; De plus, vous permettez aux intégrateurs de pouvoir styler votre page en ne changeant que quelques classes. Et votre code d'affichage reste cantonné aux fichiers CSS, merci la maintenabilité.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://hanblog.info/blog/post/2008/08/27/#rev-pnote-73-1&quot; id=&quot;pnote-73-1&quot;&gt;1&lt;/a&gt;] parce qu'il faut bien un exemple à la con&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://hanblog.info/blog/post/2008/08/27/Librairies-JavaScript-%3A-Connaissez-vos-outils#comment-form</comments>
      <wfw:comment>http://hanblog.info/blog/post/2008/08/27/Librairies-JavaScript-%3A-Connaissez-vos-outils#comment-form</wfw:comment>
      <wfw:commentRss>http://hanblog.info/blog/feed/rss2/comments/73</wfw:commentRss>
      </item>
    
  <item>
    <title>Nouveautés Safari 3.1 : Selectors API</title>
    <link>http://hanblog.info/blog/post/2008/04/15/Nouveautes-Safari-31-%3A-Selectors-API</link>
    <guid isPermaLink="false">urn:md5:ab128c0f4def3a38a760cb72718ca133</guid>
    <pubDate>Tue, 03 Jun 2008 02:14:00 +0200</pubDate>
    <dc:creator>Anthony Ricaud</dc:creator>
        <category>Informatique</category>
        <category>DOM</category><category>javascript</category><category>nouveautes</category><category>safari</category><category>standards</category><category>webkit</category>    
    <description>    &lt;h2&gt;Présentation&lt;/h2&gt;


&lt;p&gt;Comme promis, on va parler de quelque chose de bien plus intéressant pour accélérer vos applications web. Une attente de longue date, la fameuse et célèbre &lt;a href=&quot;http://www.w3.org/TR/selectors-api/&quot; hreflang=&quot;en&quot;&gt;Selectors API&lt;/a&gt;&amp;nbsp;!
C'est l'équivalent de &lt;code&gt;$$&lt;/code&gt; en Prototype et Mootools, &lt;code&gt;$&lt;/code&gt; en jQuery, &lt;code&gt;YAHOO.util.Selector.query&lt;/code&gt; en YUI et... &lt;code&gt;document.querySelectorAll&lt;/code&gt; pour base2. &lt;sup&gt;[&lt;a href=&quot;http://hanblog.info/blog/post/2008/04/15/#pnote-63-1&quot; id=&quot;rev-pnote-63-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; Pour ceux qui connaissent, cela permet donc de sélectionner un liste d'éléments qui correspondent à un sélecteur CSS.&lt;/p&gt;


&lt;p&gt;L'exemple du billet précédent devient donc &lt;code&gt;document.querySelectorAll('.post')&lt;/code&gt;. Une différence à noter entre ces deux méthodes&amp;nbsp;: querySelectorAll retourne une liste statique, un tableau en quelque sorte.&lt;/p&gt;


&lt;p&gt;Regardons un peu les performances&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
var start = new Date(); for (var i = 0; i &amp;lt; 1000; i++) var list =document.querySelectorAll('.post'); new Date() - start
104
var start = new Date(); for (var i = 0; i &amp;lt; 1000; i++) var list =document.getElementsByClassName('post'); new Date() - start
2
&lt;/pre&gt;

&lt;p&gt;C'est sans appel, pour un sélecteur simple, il vaut mieux utiliser une méthode spécialisée. J'ai fait quelques autres tests. De manière générale, si vous voulez traversez simplement le DOM, tenez-vous en aux autres solutions. Cette méthode sera peut-être optimisée plus tard, ce n'est que la première implémentation.&lt;/p&gt;


&lt;p&gt;Évidemment, le navigateur ne reconnaîtra que les sélecteurs qu'il connaît. Pas de problème avec Safari 3.1 puisqu'il connaît tous les sélecteurs disponibles à ce jour (on en reparlera plus tard, peut-être). Par contre, avec IE8, ce sera plus compliqué. Oui oui, IE8 implémentera cette API&amp;nbsp;! Et comme cette API a été bien conçue, le navigateur est censé renvoyer une exception lorsqu'il ne connaît pas un sélecteur. Le monde est presque parfait&amp;nbsp;!&lt;/p&gt;


&lt;h2&gt;Les librairies&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prototype&amp;nbsp;: dans la version de dev (un appel à un div vide puis le vrai appel)&lt;/li&gt;
&lt;li&gt;YUI&amp;nbsp;: rien&lt;/li&gt;
&lt;li&gt;mootools&amp;nbsp;: rien&lt;/li&gt;
&lt;li&gt;base2&amp;nbsp;: Oui, en dev.&lt;/li&gt;
&lt;li&gt;jQuery&amp;nbsp;: rien.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Le piège.&lt;/h2&gt;

&lt;p&gt;Le comportement de cette API est pour l'instant trompeuse. Lorsque l'on utilise cette méthode sur un élément, elle va chercher tous les éléments du document qui correspondent puis ne retourne que ceux qui sont des enfants de l'élément. Le comportement des librairies (et qui me semble plus naturel) est d'appliquer le sélecteur à partir de l'élément en question. &lt;a href=&quot;http://ejohn.org/blog/thoughts-on-queryselectorall/&quot; hreflang=&quot;en&quot;&gt;John Resig en parle bien mieux que moi&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Les petits plus&lt;/h2&gt;

&lt;p&gt;Que peut-on faire de marrant avec cette API&amp;nbsp;? On peut par exemple récupérer tous les liens présents sur la page qu'a visité l'utilisateur. Un simple &lt;code&gt;document.querySelectorAll(':visited')&lt;/code&gt; fera l'affaire.&lt;/p&gt;


&lt;p&gt;On peut aussi récupérer la liste de tous les éléments qui sont actuellement survolés par l'utilisateur. &lt;code&gt;document.querySelectorAll(':hover')&lt;/code&gt; vous donnera satisfaction.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://hanblog.info/blog/post/2008/04/15/#rev-pnote-63-1&quot; id=&quot;pnote-63-1&quot;&gt;1&lt;/a&gt;] Oui, cette librairie est tellement bien qu'il n'y a pas besoin d'apprendre autre chose que les standards&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://hanblog.info/blog/post/2008/04/15/Nouveautes-Safari-31-%3A-Selectors-API#comment-form</comments>
      <wfw:comment>http://hanblog.info/blog/post/2008/04/15/Nouveautes-Safari-31-%3A-Selectors-API#comment-form</wfw:comment>
      <wfw:commentRss>http://hanblog.info/blog/feed/rss2/comments/63</wfw:commentRss>
      </item>
    
  <item>
    <title>Nouveautés Safari 3.1 : getElementsByClassName</title>
    <link>http://hanblog.info/blog/post/2008/04/10/Nouveautes-Safari-31</link>
    <guid isPermaLink="false">urn:md5:267c599a948d3f3311f4cfd6d4a72113</guid>
    <pubDate>Thu, 10 Apr 2008 20:39:00 +0200</pubDate>
    <dc:creator>Anthony Ricaud</dc:creator>
        <category>Informatique</category>
        <category>DOM</category><category>javascript</category><category>nouveautes</category><category>standards</category><category>webkit</category>    
    <description>    &lt;p&gt;Allez, on continue dans Webkit (parce que ça me botte en ce moment). Je ne suis pas tombé sur beaucoup d'articles en français résumant les nouveautés de Safari 3.1. Et comme on n'est jamais mieux servi que par soi-même...&lt;/p&gt;


&lt;p&gt;Commençons par &lt;code&gt;getElementsByClassName&lt;/code&gt;. Kékecé&amp;nbsp;? À l'instar des &lt;code&gt;getElementById&lt;/code&gt;, &lt;code&gt;getElementsByTagName&lt;/code&gt;, &lt;code&gt;getElementsByName&lt;/code&gt; c'est une méthode pour récupérer des éléments du DOM selon un critère, en l'occurence la ou les classes. Par exemple, sur la page d'accueil de ce blog, &lt;code&gt;document.getElementsByClassName('post').length&lt;/code&gt; renvoie 20 mais &lt;code&gt;document.getElementsByClassName('post odd').length&lt;/code&gt; renvoie 10. Comme toutes ces consœurs, cette méthode marche aussi à partir d'un élément du DOM, restreignant ainsi les résultats.&lt;/p&gt;


&lt;p&gt;Il faut faire attention en manipulant la liste renvoyée. Elle est &quot;live&quot;, c'est-à-dire que tout changement dans le DOM la modifie (comme &lt;code&gt;getElementsByTagName&lt;/code&gt;).
Exemple:&lt;/p&gt;
&lt;pre&gt;
var list = document.getElementsByClassName('post');
for (var i=0; i &amp;lt; list.length; i++)
{
  list[i].parentNode.removeChild(list[i]);
  alert(list.length);
}
&lt;/pre&gt;

&lt;p&gt;En exécutant cette fonction sur la page d'accueil, on verra disparaître un billet sur deux et la &lt;code&gt;NodeList&lt;/code&gt; diminuera au fur et à mesure. Attention donc en manipulant les résultats. Pour être sûr de ce qui va se passer, on peut recopier le tout dans un tableau classique, mais attention aux performances.&lt;/p&gt;


&lt;p&gt;Cette méthode est actuellement supportée par Safari 3.1 (&lt;a href=&quot;http://webkit.org/blog/153/webkit-gets-native-getelementsbyclassname/&quot; hreflang=&quot;en&quot;&gt;of course&lt;/a&gt;) et bientôt Firefox 3 et Opera 9.5. Elle fait partie du &lt;a href=&quot;http://www.w3.org/TR/html5/#getelementsbyclassname&quot; hreflang=&quot;en&quot;&gt;brouillon pour HTML 5&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Vous voyez évidemment à quoi ça sert&amp;nbsp;? Ça accélère considérablement tous les accès qu'on peut faire, si on l'utilise. Et comme de plus en plus de gens utilisent des librairies pour ne pas s'embêter avec les compatibilités entre navigateurs, on va vérifier qu'on bénéficie bien de cette amélioration quand disponible. On va surtout étudier les méthodes du style $ ou $$, qui permettent de sélectionner des éléments à partir d'un sélecteur CSS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototype n'a pas. Pire, &lt;a href=&quot;http://ejohn.org/blog/getelementsbyclassname-pre-prototype-16/&quot; hreflang=&quot;en&quot;&gt;ça peut casser dans les anciennes versions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;jQuery&amp;nbsp;: y a pas non plus.&lt;/li&gt;
&lt;li&gt;mootools&amp;nbsp;: y a pas.&lt;/li&gt;
&lt;li&gt;YUI&amp;nbsp;: non plus.&lt;/li&gt;
&lt;li&gt;base2&amp;nbsp;: non plus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bilan&amp;nbsp;: Ah bah c'est pas génial. Si j'étais mesquin, je dirais que c'est une raison de plus pour ne pas utiliser de librairies Javascript. À leur décharge, ce n'est pas vraiment nécessaire puisqu'elles utilisent XPath lorsque c'est disponible et c'est disponible sur tous les navigateurs ayant cette méthode. Pour jQuery, c'est regrettable, puisqu'elle n'a pas d'implémentation XPath. Bien évidemment, XPath est plus rapide que DOM, mais tout de même plus lent que getElementsByClassName.&lt;/p&gt;


&lt;p&gt;Mais finalement, on verra bientôt qu'il y a d'autres méthodes pour nous aider.&lt;/p&gt;</description>
    
    
    
          <comments>http://hanblog.info/blog/post/2008/04/10/Nouveautes-Safari-31#comment-form</comments>
      <wfw:comment>http://hanblog.info/blog/post/2008/04/10/Nouveautes-Safari-31#comment-form</wfw:comment>
      <wfw:commentRss>http://hanblog.info/blog/feed/rss2/comments/62</wfw:commentRss>
      </item>
    
</channel>
</rss>