{"id":4170,"date":"2014-09-04T09:12:34","date_gmt":"2014-09-04T07:12:34","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=4170"},"modified":"2019-02-24T20:48:21","modified_gmt":"2019-02-24T19:48:21","slug":"un-onresize-ou-onscroll-plus-performant-en-js","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/un-onresize-ou-onscroll-plus-performant-en-js","title":{"rendered":"Un \u00ab\u00a0onresize\u00a0\u00bb ou \u00ab\u00a0onscroll\u00a0\u00bb plus performant en JS"},"content":{"rendered":"<p>Si vous pratiquez couramment le JS, vous avez certainement remarqu\u00e9 que certains \u00e9v\u00e8nements sont d\u00e9clench\u00e9s de mani\u00e8re assez ponctuelle, et d&rsquo;autres peuvent \u00eatre d\u00e9clench\u00e9s de mani\u00e8re tr\u00e8s fr\u00e9quente et devenir assez difficile \u00e0 g\u00e9rer, c&rsquo;est le cas de \u00ab\u00a0onscroll\u00a0\u00bb et \u00ab\u00a0onresize\u00a0\u00bb par exemple.<!--more--><\/p>\n<p>Lorsque vous impl\u00e9mentez un \u00e9couteur d&rsquo;\u00e9v\u00e8nement sur l&rsquo;un de ces \u00e9v\u00e8nements (je vais prendre \u00ab\u00a0onresize\u00a0\u00bb pour les exemples suivants), vous verrez rapidement, au redimensionnement de la fen\u00eatre, que ceux-ci sont ex\u00e9cut\u00e9s \u00e0 chaque changement de pixel dans la largeur de la fen\u00eatre.<\/p>\n<p class=\"message\"><strong>2016 Update <\/strong>: Regardez du c\u00f4t\u00e9 de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/window\/requestAnimationFrame\"><code>window.requestAnimationFrame()<\/code><\/a> qui peut aussi \u00eatre d&rsquo;une bonne aide.<\/p>\n<h2>Le code utilis\u00e9 la plupart du temps<\/h2>\n<p>Souvent, et de mani\u00e8re assez simple, nous impl\u00e9mentons un \u00e9couteur de la sorte :<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">window.addEventListener('resize', function(){\r\n  console.log('resizing');\r\n});<\/code><\/pre>\n<p><img decoding=\"async\" class=\"alignleft size-full wp-image-4171\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2014\/08\/resize-sucks-js.gif\" alt=\"\" width=\"319\" height=\"192\" \/>Si vous ajoutez \u00e7a dans les scripts JS de votre projet, et que vous ouvrez la page sur votre navigateur, vous constaterez en ouvrant votre console (F12) et en redimensionnant la fen\u00eatre, que la console s&rsquo;affole un peu.<br \/>\nImaginez qu&rsquo;\u00e0 la place d&rsquo;un <code>console.log()<\/code> votre script fasse un contr\u00f4le dans le DOM, change la structure sous certaines conditions (largeur d&rsquo;\u00e9cran, visibilit\u00e9 d&rsquo;un \u00e9l\u00e9ment, par exemple), etc. etc., et ce \u00e0 chaque pixel du redimensionnement\u2026<\/p>\n<p>Ne vous moquez pas, on est d&rsquo;accord que le redimensionnement de la fen\u00eatre ainsi fait n&rsquo;est pas fr\u00e9quent chez l&rsquo;utilisateur, mais c&rsquo;\u00e9tait la m\u00e9thode d&rsquo;un client pour tester si le responsive marchait bien, et il trouvait que \u00e7a ramait un peu sur son Mac. Je ne lui en veux pas, il a probablement lu quelque part que le responsive c&rsquo;est quand on redimensionne la fen\u00eatre de son navigateur.<\/p>\n<p>Bref, on peut optimiser la fr\u00e9quence d&rsquo;ex\u00e9cution de tout ce code au redimensionnement, voyons cela.<\/p>\n<h2>\u00ab\u00a0C&rsquo;est le m\u00eame, mais en diff\u00e9rent\u00a0\u00bb<\/h2>\n<p>Le principe est de cr\u00e9er un <code>timeout<\/code> qu&rsquo;on lance au redimensionnement et qu&rsquo;on d\u00e9truit au redimensionnement. Oui je sais, c&rsquo;est bizarre comme logique, mais vous allez comprendre.<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">\r\nvar the_timer;\r\n\u00a0\r\nwindow.addEventListener('resize', function(){\r\n  clearTimeout(the_timer);\r\n  the_timer = setTimeout(function(){\r\n    console.log('resized');\r\n  }, 75);\r\n});<\/code><\/pre>\n<p>Pour vous donner une courte explication, il suffit de lire le code de mani\u00e8re lin\u00e9aire : au moment du redimensionnement, nous supprimons le <code>timeout<\/code> (cela arr\u00eate l&rsquo;ex\u00e9cution de la fonction en param\u00e8tre), puis nous lan\u00e7ons le <code>timeout<\/code>. Celui-ci poss\u00e8de un d\u00e9lai d&rsquo;ex\u00e9cution de 75 millisecondes. Donc, si entre le premier d\u00e9clenchement de \u00ab\u00a0resize\u00a0\u00bb et le second, moins de 75 ms se sont \u00e9coul\u00e9es, le <code>timeout<\/code> est r\u00e9initialis\u00e9 avant m\u00eame l&rsquo;ex\u00e9cution de la fonction en premier param\u00e8tre. Vous m&rsquo;avez suivi\u00a0?<br \/>\nCe qui fait que cela fonctionne, c&rsquo;est la variable (globale) <code>the_timer<\/code> d\u00e9clar\u00e9e avant l&rsquo;\u00e9couteur.<\/p>\n<p><img decoding=\"async\" class=\"alignleft size-full wp-image-4174\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2014\/08\/resize-js-ok.gif\" alt=\"\" width=\"319\" height=\"192\" \/>Et voil\u00e0, c&rsquo;est un peu mieux quand m\u00eame. La fr\u00e9quence, ou \u00ab\u00a0sensibilit\u00e9\u00a0\u00bb se r\u00e8gle au nombre de millisecondes (ici <code>75<\/code>) renseign\u00e9 pour le <code>timeout<\/code>. Au plus vous augmentez ce chiffre, au moins le contenu de votre fonction sera ex\u00e9cut\u00e9 rapidement.<\/p>\n<p>Cette m\u00e9thode n&rsquo;est pas forc\u00e9ment adapt\u00e9e \u00e0 tous les cas pour tous les projets, notamment dans le cadre de l&rsquo;\u00e9v\u00e8nement \u00ab\u00a0onscroll\u00a0\u00bb, mesurez donc bien l&rsquo;impact de cette impl\u00e9mentation \ud83d\ude42<\/p>\n<p>J&rsquo;esp\u00e8re que cette astuce vous sera utile.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si vous pratiquez couramment le JS, vous avez certainement remarqu\u00e9 que certains \u00e9v\u00e8nements sont d\u00e9clench\u00e9s de mani\u00e8re assez ponctuelle, et d&rsquo;autres peuvent \u00eatre d\u00e9clench\u00e9s de mani\u00e8re tr\u00e8s fr\u00e9quente et devenir assez difficile \u00e0 g\u00e9rer, c&rsquo;est le cas de \u00ab\u00a0onscroll\u00a0\u00bb et \u00ab\u00a0onresize\u00a0\u00bb par exemple.<\/p>\n","protected":false},"author":4,"featured_media":4178,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[610,9],"tags":[596,229,403],"coauthors":[597],"class_list":["post-4170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-tutoriels","tag-js","tag-performance","tag-responsive"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/4170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=4170"}],"version-history":[{"count":2,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/4170\/revisions"}],"predecessor-version":[{"id":6721,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/4170\/revisions\/6721"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/4178"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=4170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=4170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=4170"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=4170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}