11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je suis à la recherche d'un plugin jQuery "counter" comme celui-ci.

Cependant, j'ai besoin que le plugin remplissent 2 conditions:

1/ animer les nombres qui contiennent de l'espace (ex: 10 000) et une virgule (ex: 1,000)
2/ animer qu'une seule fois (au lieu de plusieurs fois pour une meilleure UX)

Le plugin que j'ai mis en lien est parfait, sauf qu'il n'anime pas les nombres qui contiennent un espace comme 10 000 (ça donne une erreur 'NaN') et qu'il ne fonctionne pas (bizarrement) !!!

Merci pour votre aide Smiley smile
Modifié par allan00958 (25 Oct 2020 - 08:23)
Modérateur
Bonjour,

Le plugin ne fonctionne que pour les nombres anglo-saxons. Et il marche par miracle (et dans certains cas seulement) pour les nombres en virgule en français parce qu'il confond notre "," décimale avec sa séparation des milliers. Par exemple, "521 243 147,21" s'écrit en anglo-saxon "521,243,147.21".

On peut s'en sortir avec le plugin que tu as cité en modifiant seulement 2 lignes de code.

1) tu remplaces dans le code du plugin
i=t.text()

par
i=t.text().replace(/,/,".").replace(/\s/g,",")

Ceci a pour effet de transformer un nombre "français" en nombre "anglo-saxon" juste avant son traitement d'incrémentation par le plugin.

2) tu remplaces dans le code du plugin
t.text(t.data("counterup-nums").shift();
par
t.text((t.data("counterup-nums").shift()+"").replace(/,/g," ").replace(".",","));
Ceci a pour effet de transformer un nombre "anglo-saxon" en nombre "français" juste avant ré-affichage du nombre dans le html.

EDIT: il y avait un bug pour le point 2) dans certains cas dans ma version initiale, j'ai fait une modification, mais c'est probablement à améliorer.

EDIT2: j'ai finalement trouvé le pourquoi du comment du bug que j'observais pour les nombres entiers (il fallait ajouter +"").

Note que l'espace des milliers est en théorie un espace insécable.

Amicalement,
Modifié par parsimonhi (25 Oct 2020 - 11:00)
Meilleure solution
@parsimonhi

Merci pour ton aide. Je pense que le plugin réponds à mes besoins.

Je vois que tu très actif sur le forum. Est-tu développeur front, back ou les 2 ? Une spécialité, peut-être ?
Modérateur
Bonjour
allan00958 a écrit :
Je vois que tu très actif sur le forum. Est-tu développeur front, back ou les 2 ? Une spécialité, peut-être ?

Les technologies du web sont relativement accessoires dans mon activité. Je viens ici dans les périodes où je travaille moins par ailleurs pour apprendre en répondant aux questions des autres. Smiley biggrin Smiley biggrin Smiley biggrin

Du coup, je ne saurais te dire si je suis front, back ou les 2 ! Il faudrait que j'essaie un jour pour voir ! Smiley cligne

Après, bon, comme je suis en phase d'apprentissage depuis plusieurs dizaines d'années, je finis par connaitre quelques trucs !

Amicalement,
Hello,

Je suis contraint de revenir ici. J'ai remarqué un bug.

Lorsque je scroll et que j'attends la fin du déroulement, le nombre exact s'affiche sans problème, par exemple: 61%. Par contre, si je scroll en haut avant la fin du déroulement et le nombre n'est plus dans le viewport, et je scroll à nouveau, le déroulement s'arrête au milieu (pax exemple: 21 ou 2 ou 13 mais pas 61 ce que j'ai dans le DOM).

Aurais-tu une idée de la source du bug @parsimonhi ?

Mon code actuel:


  $('.counterPlugin').counterUp({
    'time': 2000,
    'delay': 10
  });



<span class='number'><span class='counterPlugin'>61</span>%</span>
Modérateur
Bonjour,

Je n'arrive pas à reproduire le bug.

Il faudrait un exemple complet avec le bug.

EDIT: regarde dans la console (click-droit + inspecter), peut-être qu'un autre script de ta page a planté et fait tout arrêter !

Amicalement,
Modifié par parsimonhi (26 Oct 2020 - 10:17)
Modérateur
Bonjour,

Ça a semble-t-il le même comportement sans la modification que j'ai proposée.

Tu veux faire quoi en fait ? Quand doit se déclencher le compteur et quand doit-il s'arrêter ?

Amicalement,
Non, il y a un bug. Le déroulement ne vas pas jusqu'au bout lorsque le nombre n'est plus dans le viewport. Il n'y avait pas ce bug avant justement. Je pouvais quitter le viewport sans problème et le déroulement allait jusqu'au bout.
Modérateur
Bonjour,

T'as tester dans une page normale ? Chez moi, ça le fait effectivement sur jsFiddle, mais pas dans une page normale. Et dans jsFiddle, ça le fait aussi sans la modification (voir https://jsfiddle.net/parsimonhi/Lhm80ekd/ ).

Je redis ma question : Smiley smile
Qu'est-ce qui doit déclencher le démarrage du compteur ? (a priori ça ne doit pas s'arrêter ensuite si j'ai bien compris).

Autre question : tu testes avec quoi ?

Amicalement,

PS: mon code complet qui me semble fonctionner :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.number{
  margin: 1000px 0;
  display: block;
}
</style>
</head>
<body>
<span class='number counterPlugin'>150 000</span>

<span class='number counterPlugin'>150</span>

<span class='number counterPlugin'>1 000</span>

<span class='number counterPlugin'>50</span>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/2.0.3/waypoints.min.js"></script> 
<script>
/*!
* jquery.counterup.js 1.0
*
* Copyright 2013, Benjamin Intal  http://gambit.ph  @bfintal
* Released under the GPL v2 License
*
* Date: Nov 26, 2013
*/

(function(e) {
  "use strict";
  e.fn.counterUp = function(t) {
      var n = e.extend({
          time: 400,
          delay: 10
      }, t);
      return this.each(function() {
          var t = e(this),
              r = n,
              i = function() {
                  var e = [],
                      n = r.time / r.delay,
                      i = i=t.text().replace(/,/,".").replace(/\s/g,","),
                      s = /[0-9]+,[0-9]+/.test(i);
                  i = i.replace(/,/g, "");
                  var o = /^[0-9]+$/.test(i),
                      u = /^[0-9]+\.[0-9]+$/.test(i),
                      a = u ? (i.split(".")[1] || []).length : 0;
                  for (var f = n; f >= 1; f--) {
                      var l = parseInt(i / n * f);
                      u && (l = parseFloat(i / n * f).toFixed(a));
                      if (s)
                          while (/(\d+)(\d{3})/.test(l.toString())) l = l.toString().replace(/(\d+)(\d{3})/, "$1,$2");
                      e.unshift(l)
                  }
                  t.data("counterup-nums", e);
                  t.text("0");
                    var c = function() {
                    t.text((t.data("counterup-nums").shift()+"").replace(/,/g," ").replace(".",","));
                      if (t.data("counterup-nums").length) setTimeout(t.data("counterup-func"), r.delay);
                      else {
                          delete t.data("counterup-nums");
                          t.data("counterup-nums", null);
                          t.data("counterup-func", null)
                      }
                  };
                  t.data("counterup-func", c);
                  setTimeout(t.data("counterup-func"), r.delay)
              };
          t.waypoint(i, {
              offset: "100%",
              triggerOnce: !0
          })
      })
  }
})(jQuery);

//https://www.jqueryscript.net/other/Counting-Up-To-Numerical-Values-On-Scroll-jQuery-Countup-js.html/*

$(document).ready(function() {
  $('.counterPlugin').counterUp({
    'time': 20000,
    'delay': 10
  });
})
</script>
</body>
</html>

Amicalement,
Salut,

Oui, je suis sur un page 'normale'. Le compteur se déclenche au viewport, c'est à dire, lorsque les chiffres sont visibles au scroll. Mon projet: gulp, fichiers php et js avec du XAMPP sur mac et chrome
Modérateur
Bonjour,

C'est peut-être la version de jquery qui pose problème (ou celle de waypoints.js ou bien les deux). Ça a l'air de planter avec les jquery récents.

À vérifier dans ton contexte.

Amicalement,
Modifié par parsimonhi (26 Oct 2020 - 12:36)
Re-hello,

Le plugin semble bien fonctionner maintenant. J'ai remplacer les librairies jQuery et Waypoints par des versions antérieurs.

Merci Smiley smile

Tu sembles à l'aise en JS, donc tu dois être un programmeur, à défaut d'être développeur.
Modérateur
Bonjour,
allan00958 a écrit :
Re-hello,
Le plugin semble bien fonctionner maintenant. J'ai remplacer les librairies jQuery et Waypoints par des versions antérieurs.
Voici une version qui marche avec un jquery récent. J'ai bricolé quelques lignes de codes pour faire le peu que faisait "waypoints" (on peut donc s'en passer, et c'est pourquoi on peut utiliser du jquery récent du coup). Sauf bugs sournois, ça devrait fonctionner. À tester !

https://jsfiddle.net/parsimonhi/7Lvw8qsz/

allan00958 a écrit :
Tu sembles à l'aise en JS, donc tu dois être un programmeur, à défaut d'être développeur.
Du coup, j'ai dû faire une recherche sur internet pour savoir quelle différence il pouvait y avoir entre un programmeur et un développeur. Il m'avait échappé qu'il pouvait y en avoir une. Mais je ne suis pas plus avancé car je n'ai pas trop compris les réponses ! Smiley smile

Amicalement,
Modifié par parsimonhi (26 Oct 2020 - 14:36)