Mini-cours de JavaScript

Jour 6

Avec une calculatrice, pour obtenir un résultat, on tape un nombre - le premier terme -, un opérateur ( +, *, -, /, ... ), un second nombre et sur . C'est facile et rudimentaire.

L'avantage des calculatrices est la taille; elles tiennent dans la main.
Leur désavantage est l'écran : petit et sans couleurs, souvent limité à une seule ligne.

Les smartphones tiennent aussi dans la main, mais leur écran est plus grand et en couleurs.
Et, le fait qu'ils puissent lire des fichiers HTML offre d'autres avantages.

Grâce à la balise <label>, il est possible de lier un nombre à sa signification.

Grâce aux attributs de la balise <input>, il est possible de contrôler la donnée avant de l'utiliser. Par exemple, pour interdire une largeur négative.

Au lieu de la touche , on peut cliquer sur un bouton plus expressif
Par exemple,

Et, dans un formulaire, il n'est pas obligatoire d'introduire les données dans l'ordre.

Et, grâce au code CSS, il est possible de réaliser de très jolies interfaces.

Pour finir, les smartphones disposent d'un micro. Grâce à la reconnaissance vocale, il sera probablement prochainement possible de dire le nombre au lieu de le taper.

Les smartphones sont donc appelés à remplacer nos calculatrices. Ils ont déjà remplacés nos appareils photos, nos montres, réveils ...

Jusqu'ici, on utilisait des nombres entiers. Voyons tout de suite comment utiliser des nombres réels ( avec virgules ).

parseFloat()

Il est également possible de récupérer des nombres avec des décimales et de les additionner, à condition que l'utilisateur tape un point décimal au lieu d'une virgule décimale.

Dans les pays francophones, on écrit : 1.000.000,00 euros
Or, toute l'informatique a été inventée aux États-Unis ...
Aux États-unis, ce qui sépare la partie entière des décimales est le point décimal !
Dans les pays anglophones, on écrit : 1,000,000.00 dollars

+

Attention. Il ne sera pas tenu compte de ce qui suit la virgule.
Ici, il faut taper les nombres " à l'américaine ", sinon le résultat pourrait être faux !

=

Code HTML ( contenant du code JavaScript ) :

<script>
function additionner(){
    var nombre1=document.getElementById("nombre1").value;
    var nombre2=document.getElementById("nombre2").value;
    var resultat=parseFloat(nombre1)+parseFloat(nombre2);
    document.getElementById("result").value=resultat;
}
</script>

<form id="form1" onsubmit="additionner();return false;">
  <p>
    <input id="nombre1" required="required" />
    + <input id="nombre2" required="required" />
    <input type="submit" value="Additionner" />
  </p>
  <p>
    = <input type="text" readonly="readonly" class="fondGris" size="5" id="result" />
    <input type="reset" value="Effacer" />
  </p>
</form>

class="fondGris", souvenez-vous du mini-cours de CSS.

parseFloat() est une fonction qui ne prend que la partie du nombre (américain) mis entre ses parenthèses. Elle retourne un nombre ou NaN. Cette fonction ressemble fort à la fonction parseInt().

Ce code a un défaut. Si un des deux termes n'est pas un nombre, le résultat sera NaN !
Nous allons résoudre ce problème bientôt.

if

Vous savez que tout langage de programmation permet de regrouper les instructions sous un nom et de les appeler par ce nom. Une autre capacité est de mettre des données en mémoire. Voyons, une troisième capacité : faire des choix.

if ( en anglais ) = si ( en français )

Comment permettre au programme de faire un choix ?

Le programme va tester une condition mise entre parenthèses. Et, si la condition est vraie, alors il exécutera les instructions placées entre les accolades. Si elle est fausse, il "sautera" ces instructions et exécutera les éventuelles instructions après l'accolade fermante.

if ( condition ) { instruction1; instruction2, ...}

Attention, comme avec les fonctions, il n'y a jamais de point-virgule après l'accolade fermante.

La condition est écrite de telle sorte que la réponse soit vraie ou fausse.

Exemples :

   if ( nombre1 > nombre2 ) { ... }   /* nombre1 est-il supérieur à nombre2 ? */
   if ( nombre1 >= nombre2 ) { ... }  /* nombre1 est-il supérieur ou égal à nombre2 ? */
   if ( nombre1 < nombre2 ) { ... }   /* nombre1 est-il inférieur à nombre2 ? */
   if ( nombre1 <= nombre2 ) { ... }  /* nombre1 est-il inférieur ou égal à nombre2 ? */
   if ( nombre1 == nombre2 ) { ... }  /* nombre1 est-il égal à nombre2 ? */
   if ( nombre1 != nombre2 ) { ... }  /* nombre1 est-il différent à nombre2 ? */

>, >=, <, <=, == et != sont appelés des opérateurs de comparaison.
Lorsqu'il existe un opérateur de comparaison entre deux termes, le résultat est true ou false

Bonne nouvelle ! Les opérateurs de comparaison et la structure :
if ( condition ) { instruction1; instruction2, ...}
sont exactement les mêmes dans TOUS les langages de programmation.

Rappel : == veut dire égal
= veut dire ce qui est à droite, je le place à gauche
var nombre1 = 1; // 1 va dans le tiroir nombre1

Test 1 :

<script>
function testerSiBebe(){

    var age = document.getElementById("age2").value;
    age=parseInt(age);

    if (age > 5) {
        alert("Tu n'es plus un bébé !");
    }

    alert("Fin du test");
}
</script>

<form id="form2" onsubmit="testerSiBebe();return false;">
  <p>Test 1 :
    <label> Quel est ton âge ?
      <input id="age2" required="required" type="number" min="1" autocomplete="off" />
    </label>
    <input type="submit" value="Tester l'âge" />
    <input type="reset" value="Effacer" />
  </p>
</form>

required="required" type="number" min="1" sont des contraintes.
Pour permettre à l'utilisateur de voir toute de suite son erreur, il vaut mieux placer le maximum de contraintes en HTML.

Rappel : autocomplete="off" sert à interdire les suggestions du navigateur ( qui retient les valeurs introduites dans des champs semblables ).

Si l'utilisateur tape un nombre d'années supérieur à 5, deux boîtes de dialogue s'affichent. La première affiche : "Tu n'es plus un bébé !". La seconde : "Fin du test".

Si l'utilisateur tape un nombre d'années inférieur à 6, une seule boîte de dialogue s'affiche : "Fin du test".

Le programme affiche une ou deux boîtes de dialogue. Le programme est capable de faire un choix en fonction de ce qu'indique l'utilisateur.

En C, il n'existe pas de booléens. Mais, il existe aussi des if.
En C, 0 vaut false ( et tout autre nombre vaut true )
Le JavaScript "conserve" cette possibilité, en conséquence :
if(0){...} // = if(false){...}
if(1){...} // = if(true){...}

Any value that is not false, undefined, null, 0, -0, NaN, ""(empty string), and any object, including a Boolean object whose value is false, is considered truthy when used as the condition. Source

Cependant, on aimerait afficher quelque chose si le nombre d'années n'est pas supérieur à 5. Comment faire ?

if ... else ...

else ( en anglais ) = dans l'autre cas ( en français )
else signifie " et si la condition n'est pas vraie ".

Test 2 :

function testerSiEnfant(){
    var age = document.getElementById("age3").value;
    age=parseInt(age);

    if (age > 5) {
        alert("Tu n'es plus un bébé !");
    }
    else
    {
        alert("Tu es encore un bébé.");
    }
}

Ici, le programme choisit parmi les deux boîtes de dialogue celle qu'il doit afficher.


  if (...) {
    ...
  }
  else
  {
    ...
  }

/* équivaut à la forme condensée  (tout aussi lisible) ci-dessous : */

  if(...){
    ...
  }else{
    ...
  }

Cette forme condensée - }else{ - est préférée par la plupart des programmeurs. On y gagne deux lignes de code sans perte de lisibilité.

Le programmeur est autorisé de mettre un if dans un if ...

function testerSiAdulte(){
    var age = document.getElementById("age4").value;
    age=parseInt(age);

    if (age > 5) {

        if (age > 18){
            alert("Tu es devenu un adulte.");
        }else{
            alert("Tu n'es plus un bébé !");
        }

    }else{
        alert("Tu es encore un bébé.");
    }
}

Test 3 :

Le programmeur est autorisé de mettre un if dans un else ...

function testerSiAdulte2() {
  var age = document.getElementById("age5").value;
  age = parseInt(age);

  if (age < 5) {
    alert("Tu es un bébé !");
  }else{

    if (age >= 18) {
      alert("Tu es devenu un adulte.");
    }else{
      alert("Tu es un enfant ou un adolescent.");
    }

  }

}

Test 4 :

Le programmeur est autorisé de faire if ... else if ... else ...

On y gagne encore une ligne de code. Mais y gagne-t-on en lisibilité ?

function testerSiAdulte3() {
  var age = document.getElementById("age6").value;
  age = parseInt(age);

  if (age < 5) {
    alert("Tu es un bébé !");
  }else if(age >= 18){
    alert("Tu es devenu un adulte.");
  }else{
    alert("Tu es un enfant ou un adolescent.");
  }

}

Test 5 :

Mettre if dans un else ou faire un else if revient au même !

Il est même autorisé à utiliser une série de else if.

function testerSiAdulte4() {
  var age = document.getElementById("age7").value;
  age = parseInt(age);

  if (age == 1) {
    alert("Tu as un an !");
  }else if(age == 2){
    alert("Tu as deux ans.");
  }else if(age == 3){
    alert("Tu as trois ans.");
  }else{
    alert("Tu es un enfant, un adolescent ou un adulte !");
  }

}

Test 5 :

Toutefois, s'il est nécessaire de faire de nombreuses imbrications, la structure condition switch pourrait être utile, car elle condense le code tout en gardant sa lisibilité.

Puisque tous les cas peuvent être résous via un if...else, la structure switch ne sera pas abordée dans ce mini-cours.
Info sur le switch

isNaN()

Vous savez déjà que NaN signifie " pas un nombre ".
isNaN() signifie " N'est-ce pas un nombre ? ".

isNaN() est une fonction qui retourne true ou false selon ce qui est mis entre ses parenthèses. Si c'est un nombre américain ou pas.

+

=

function additionner2(){

    var nombre1=document.getElementById("nombr1").value;
    var nombre2=document.getElementById("nombr2").value;
    var resultat;

    if ( isNaN(nombre1) ){
        alert("La première donnée n'est pas un nombre.\nUtilisez un point décimal.");
    }
    else{
        if( isNaN(nombre2) ){
            alert("La deuxième donnée n'est pas un nombre.\nUtilisez un point décimal.");
        }
        else{
            resultat=parseFloat(nombre1)+parseFloat(nombre2);
            document.getElementById("result2").value=resultat;
        }
    }
}

Il est important de rendre le code lisible pour repérer plus vite les fautes.
Par exemple, une accolade manquante.

isNaN(nombre1) est la condition.
Elle ne contient pas d'opérateur de comparaison.
Une condition peut aussi contenir le résultat d'une fonction qui retourne un booléen.

nombre1 est le paramètre de la fonction isNaN().

Rappel : \n ordonne un retour à la ligne lors de l'affichage de la chaîne de caractères.

Rappel : = signifie qu'on met ce qui est à droite dans ce qui est à gauche.
Ici, on met la valeur de la variable resultat dans la valeur de l'attribut value de la balise <input>.

Attention. alert(isNaN("")) affiche false ...
Ainsi, à la question une chaîne de caractères vide est-elle pas-un-nombre, la réponse est false ...
Donc, si pas-un-nombre est faux, un-nombre est vrai ... Une chaîne vide serait un nombre !
La fonction isNaN() ne doit pas être utilisée avec une chaîne vide ou une variable dont la valeur est une chaîne vide.
Mais, alert(parseInt("")) affiche NaN ...

Plus d'info : isNaN()