{"id":213,"date":"2008-08-25T07:00:06","date_gmt":"2008-08-25T05:00:06","guid":{"rendered":"http:\/\/nyams.planbweb.com\/blog\/?p=213"},"modified":"2008-08-25T07:00:06","modified_gmt":"2008-08-25T05:00:06","slug":"utilisze-l-event-delegation-comme-un-chef","status":"publish","type":"post","link":"https:\/\/nyamsprod.com\/blog\/utilisze-l-event-delegation-comme-un-chef\/","title":{"rendered":"Utilisez L&#8217;Event Delegation comme une chef"},"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>Qui ne sait pas retrouver un jour avec une liste de liens auxquels il fallait ajouter un \u00e9v\u00e8nement pour ex\u00e9cuter tel ou tel script lorsqu&#8217;on clique dessus. g\u00e9n\u00e9ralement on se retrouve alors avec une soupe HTML qu&#8217;il faudra bien maintenir sur le site et ce n&#8217;est pas la meilleur fa\u00e7on de coder en HTML de toute fa\u00e7on. Il existe une m\u00e9thode simple et facile de r\u00e9duire le nombre d&#8217;\u00e9v\u00e8nements et surtout de centraliser leur gestion, c&#8217;est la d\u00e9l\u00e9gation d&#8217;Ev\u00e8nement ou en bon anglais l&#8217;Event Delegation, k\u00e9sako ? <!--more-->C&#8217;est le fait d&#8217;utiliser un \u00e9l\u00e9ment parent commun \u00e0 un ensemble d&#8217;\u00e9l\u00e9ments pour monitorer les \u00e9v\u00e8nements qui leur sont associ\u00e9s et activer en fonction des conditions l&#8217;une ou l&#8217;autre fonction. Si vous comprenez pas mon charabia c&#8217;est normal, un simple exemple vaut mieux que mille discours \ud83d\ude09 . Partons du code suivant :<\/p>\n<pre><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n&lt;ul id=&quot;main_menu&quot;&gt;\n&lt;li&gt;&lt;strong onclick=&quot;doThis(this);&quot;&gt;lien 1&lt;\/strong&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; onclick=&quot;doThat(this); return false&quot; title=&quot;j&#039;aime avoir des trucs \u00e0 dire&quot;&gt;lien 2&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; onclick=&quot;doThat(this); return false&quot;&gt;lien 3&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; onclick=&quot;doThat(this); return false&quot; title=&quot;moi aussi, j&#039;aime avoir des trucs \u00e0 dire&quot;&gt;lien 4&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; onclick=&quot;doThat(this); return false&quot;&gt;lien 5&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; onclick=&quot;doThat(this); return false&quot;&gt;lien 6&lt;\/a&gt;&lt;\/li&gt;\n&lt;\/ul&gt;\n<\/pre>\n<p>En utilisant l&#8217;Event Delegation tel que me l&#8217;a sugg\u00e9r\u00e9 <a title=\"Event delegation without a JavaScript library\" href=\"http:\/\/usabletype.com\/weblog\/event-delegation-without-javascript-library\/\">cette article<\/a>, nous allons progressivement simplifi\u00e9 notre code et vous ne pourrez plus vous passez de cette technique. Suivez le guide :<\/p>\n<p>1) On retire tous les \u00e9v\u00e8nements que l&#8217;on ne veut plus voir et on en garde 1 mais pas n&#8217;importe o\u00f9 :<\/p>\n<pre><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n&lt;ul id=&quot;main_menu&quot; onclick=&quot;JustdoIt(event);&quot;&gt;\n&lt;li&gt;&lt;strong&gt;lien 1&lt;\/strong&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; title=&quot;j&#039;aime l&#039;event delegation&quot;&gt;lien 2&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot;&gt;lien 3&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot; title=&quot;moi aussi j&#039;aime l&#039;event delegation&quot;&gt;lien 4&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot;&gt;lien 5&lt;\/a&gt;&lt;\/li&gt;\n&lt;li&gt;&lt;a href=&quot;index.html&quot;&gt;lien 6&lt;\/a&gt;&lt;\/li&gt;\n&lt;\/ul&gt;\n<\/pre>\n<p>Et l\u00e0 on utilise la magie du javascript et on obtient :<\/p>\n<pre><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfunction justDoIt(event) {\n    var el = getEventTarget(event);\n    if (\/^a$\/i.test(el.tagName) &amp;amp;&amp;amp; a.title != &#039;&#039;) {\n        doThat(el);\n        return false;\n    } else if (\/^strong$\/i.test(el.tagName)) {\n        doThis(el);\n        return false;\n    }\n}\n\nfunction doThis(el) {\n    alert(el.innerHTML);\n}\n\nfunction doThat(el) {\n    alert(el.title);\n}<\/pre>\n<p><strong>Explications :<\/strong><\/p>\n<p>Tout d&#8217;abord, l&#8217;\u00e9lement principal c&#8217;est la fonction qui va nous permettre de d\u00e9terminer sur quel \u00e9l\u00e9ment on vient de cliquer, c&#8217;est ce que je fais avec la fonction suivante :<\/p>\n<pre><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfunction getEventTarget(e) {\n    var o = e || window.event;\n    var el = o.target || o.srcElement;\n    if (el.nodeType===3) { \/\/rajouter pour corriger un ancien bug de Safari\n        el = el.parentNode;\n    }\n    return el;\n}\n<\/pre>\n<p>Ensuite on regarde si on clique bien sur l&#8217;\u00e9l\u00e9ment qui nous int\u00e9resse, c&#8217;est-\u00e0-dire qui remplit vos conditions. Pour cela j&#8217;utilise les expressions r\u00e9guli\u00e8res et les propri\u00e9t\u00e9 de l&#8217;\u00e9l\u00e9ment s\u00e9lectionn\u00e9 pour d\u00e9terminer si cet \u00e9l\u00e9ment m&#8217;int\u00e9resse. En fonction de l&#8217;int\u00e9r\u00eat que j&#8217;ai pour l&#8217;\u00e9l\u00e9ment, le script \u00e9x\u00e9cute ou pas notre fonction.<\/p>\n<p>Derni\u00e8re touche, en utilisant <a title=\"fonction de gestion des \u00e9v\u00e8nements ind\u00e9pendantes d'un navigateur\" href=\"http:\/\/fn-js.info\/snippets\/addevent\">une fonction de gestion des Ev\u00e8nements Javascript<\/a> on peut m\u00eame retirer le dernier <code>onclick<\/code> qui subsite dans la page pour r\u00e9duire au maximum la pr\u00e9sence du javascript dans notre page. On aura donc dans un tag <code>script<\/code> suivant la liste ou en fin de page l&#8217;insertion javascript suivante :<\/p>\n<pre><pre class=\"brush: jscript; title: ; notranslate\" title=\"\"> \n&lt;script type=&quot;text\/javascript&quot;&gt;Events.addEvent(document.getElementById(&#039;main_menu&#039;),&#039;click&#039;,justDoIt);&lt;script&gt;\n<\/pre>\n<p>Soit dit en passant c&#8217;est cette technique que j&#8217;utilise pour l&#8217;affichage de mon sous-menu lorsque l&#8217;on clique sur certaines rubriques du menu principal du th\u00e8me courant de mon blog ;).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Explication simple est rapide d&#8217;une technique non-intrusive d&#8217;utilisation du javascript qui se base sur l&#8217;Event D\u00e9l\u00e9gation<\/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":[179,180,292],"class_list":["post-213","post","type-post","status-publish","format-standard","hentry","category-web","tag-event-delegation","tag-event-handler","tag-javascript"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts\/213","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=213"}],"version-history":[{"count":0,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"wp:attachment":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/categories?post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/tags?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}