{"id":822,"date":"2009-01-21T11:44:15","date_gmt":"2009-01-21T10:44:15","guid":{"rendered":"http:\/\/nyams.planbweb.com\/blog\/?p=822"},"modified":"2009-01-21T11:44:15","modified_gmt":"2009-01-21T10:44:15","slug":"parcourir-un-document-html-en-utilisant-dom","status":"publish","type":"post","link":"https:\/\/nyamsprod.com\/blog\/parcourir-un-document-html-en-utilisant-dom\/","title":{"rendered":"parcourir un document web en utilisant le DOM"},"content":{"rendered":"<div class=\"message warning\">\n<p><strong>Attention:<\/strong> Les informations de ce billet sont susceptibles d'&ecirc;tre obsol&egrave;tes car vieux de plus 2 ans.<\/p>\n<p><strong>Warning: <\/strong> The information you are reading may be obsolete, this post was published more than 2 years ago.<\/p>\n<\/div><p>Pendant des ann\u00e9es, la vie quotidienne des d\u00e9veloppeurs web, lorsqu&#8217;ils travaillaient avec le DOM, se r\u00e9sumait en l&#8217;utilisation de la boucle <code>for<\/code> avec les m\u00e9thodes <a title=\"Utilisation de getElementById\" href=\"http:\/\/nyams.planbweb.com\/tutorial-dom-04.html\"><code>getElementById<\/code><\/a> et <a title=\"Utilisation de getElementsByTagName\" href=\"http:\/\/nyams.planbweb.com\/tutorial-dom-06.html\"><code>getElementsByTagName<\/code><\/a> pour r\u00e9cup\u00e9rer tel ou tel balise du HTML. Mais tout cela est fini (enfin!!), remontons le temps pour voir ce que l&#8217;on faisait avant et ce que l&#8217;on fera demain \ud83d\ude42 .<\/p>\n<p><!--more--> Le probl\u00e8me qui ce pose est toujours de ce type :<\/p>\n<blockquote><p>Comment s\u00e9lectionner toutes les balises enfants de type liste inclue dans mes balises <code>div<\/code> avec la <code>class=\"post\"<\/code> enfants d&#8217;une balise <code>div<\/code> ayant pour <code>id=\"content\"<\/code>.<\/p><\/blockquote>\n<p>Avec la sortie du DOM1, la solution \u00e0 ce probl\u00e8me fut le code suivant :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var nodeList = document.getElementById(&#039;content&#039;).getElementsByTagName(&#039;div&#039;);\nvar res = &#x5B;];\nfor (var i = 0, div; div = nodeList&#x5B;i]; i++) {\n\tif (\/(^|s)post(s|$)\/.test(div.className)) {\n\t\tif (div.hasChildNodes) {\n\t\t\tfor (var j = 0, o; o = div.childNodes&#x5B;j]; j++) {\n\t\t\t\tif(\/^(UL|OL|DL)$\/.test(o.nodeName)) {\n\t\t\t\t\tres&#x5B;res.length] = o;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}<\/pre>\n<p>Avec l&#8217;av\u00e8nement de Firefox 1.5 est <a title=\"Toutes les m\u00e9thodes avanc\u00e9es de manipulations des tableaux dans Firefox\" href=\"https:\/\/developer.mozilla.org\/fr\/Nouveaut%C3%A9s_dans_JavaScript_1.6\">des m\u00e9thodes avanc\u00e9es de manipulation des tableaux<\/a>, le code s&#8217;est &#8220;simplifi\u00e9&#8221; de la sorte<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var res = &#x5B;];\nvar nodeList = Array.filter(document.getElementById(&#039;content&#039;).getElementsByClassName(&#039;post&#039;), function (el) {\n\treturn(el.nodeName===&#039;DIV&#039;&amp;&amp;el.hasChildNodes);\n});\nif (nodeList.length&gt;0) {\n\tArray.forEach(nodeList, function (el) {\n\t\tvar r = Array.filter(el.childNodes, function (el) {\n\t\t\treturn \/^(UL|OL|DL)$\/.test(el.nodeName);\n\t\t});\n\t\tif (r.length &gt; 0) {\n\t\t\tres = res.concat(r);\n\t\t}\n\t});\n}<\/pre>\n<p>Mais seul, Firefox comprend, nativement le code ci-dessus, et bien que plus simple (il n&#8217;y a plus de boucle <code>for<\/code>), l&#8217;\u00e9criture d&#8217;un tel code est en fait plus difficile. Depuis, les diff\u00e9rentes framework javascript on mis en place toute une s\u00e9rie de m\u00e9thodes aux noms vari\u00e9s pour rem\u00e9dier \u00e0 cette complexification. Mais tous cela, c&#8217;est du pass\u00e9 gr\u00e2ce \u00e0 <code>querySelectorAll<\/code> on aura d\u00e9sormais plus qu&#8217;\u00e0 \u00e9crire ceci :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var res = document.querySelectorAll(&quot;#content div.post &gt; dl, #content div.post &gt; ul, #content div.post &gt; ol&quot;);<\/pre>\n<p><a title=\"Test des Scripts propos\u00e9s : En fonction de votre navigateur, l'un ou l'autre script sera utilis\u00e9e\" href=\"http:\/\/nyams.planbweb.com\/test\/domtraverse\/\">Essayez ces scripts dans diff\u00e9rents navigateurs<\/a> et vous verrez par vous-m\u00eame que cela donne la m\u00eame r\u00e9ponse.<\/p>\n<p><strong>Premi\u00e8re bonne nouvelle :<\/strong> <code><a title=\"Documentation de querySelectorAll pour Internet Explorer 8\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/cc288326(VS.85).aspx\">querySelectorAll<\/a><\/code> permet de faire des recherches en utilisant une d\u00e9claration CSS \u00e0 la mani\u00e8re de diff\u00e9rentes frameworks javascript <strong>mais<\/strong> diff\u00e8re de celles-ci en cela qu&#8217;elle retourne une liste de noeud et reste strict par rapport au r\u00e8gles du CSS. C&#8217;est donc une version modernis\u00e9e de <code>getElementsByTagName<\/code>. De m\u00eame <a title=\"Comment fonctionne querySelector selon Mozilla\" href=\"https:\/\/developer.mozilla.org\/En\/DOM\/Document.querySelector\"><code>querySelector<\/code><\/a> fonctionne exactement comme <code>querySelectorAll<\/code> <strong>mais<\/strong> ne renvoie que le premier noeud qui satisfait \u00e0 la condition CSS, c&#8217;est donc l&#8217;\u00e9quivalent moderne de <code>getElementById<\/code>.<\/p>\n<p><strong>Deuxi\u00e8me nouvelle :<\/strong> La rapidit\u00e9 de ces fonctions, native dans le navigateur, nous permettra d&#8217;avoir des script beaucoup plus rapide<\/p>\n<p><strong>Troisi\u00e8me bonne nouvelle :<\/strong> Cette ann\u00e9e 2009 verra la mise \u00e0 jour de minimum 3 grands navigateurs, IE passera la 8\u00e8me vitesse, Firefox fera un toilettage de sa mouture avec une version 3.1 tr\u00e8s attendue, quand \u00e0 Opera il a d\u00e9j\u00e0 annonc\u00e9 les couleurs avec une version alpha de son prochain navigateur Opera 10. De toute les nouveaut\u00e9s qui nous attendent avec l&#8217;arriv\u00e9e de ces diff\u00e9rents navigateurs une est de taille, le support par tout les navigateurs modernes de ces m\u00e9thodes <code>querySelector<\/code> et <code>querySelectorAll<\/code>, qui sont d\u00e9j\u00e0 pr\u00e9sentent sous Safari depuis sa version 3.1. Bref 2009 s&#8217;annonce comme un bon cru pour le DOM et le Javascript.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentations de 2 m\u00e9thodes DOM qui seront utilisables sous tous les nouveaux navigateurs et qui vont r\u00e9volutionn\u00e9es l&#8217;\u00e9criture des codes Javascript<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5],"tags":[101,194,196,204,224,225,267,404,439,440,471,548,567],"class_list":["post-822","post","type-post","status-publish","format-standard","hentry","category-web","tag-chrome","tag-filter","tag-firefox","tag-foreach","tag-getelementbyid","tag-getelementsbytagname","tag-ie8","tag-opera","tag-queryselector","tag-queryselectorall","tag-safari","tag-v8","tag-webkit"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts\/822","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/comments?post=822"}],"version-history":[{"count":0,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts\/822\/revisions"}],"wp:attachment":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/media?parent=822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/categories?post=822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/tags?post=822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}