Voir le flux RSS

danielhagnoul

JS : 4 simplifications et 3 améliorations.

Noter ce billet
par , 15/08/2016 à 23h58 (352 Affichages)
Je vous propose uniquement les modifications que j'utilise tous les jours depuis quelques semaines.

Quatre simplifications (taper moins de code) :

Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
const
  k$ = selector => document.querySelector( selector ),
  k$all = selector => Array.from( document.querySelectorAll( selector ) ),
  klog = ( ...args ) => { console.log( args.join(" ") ) },
  kerror = ( ...args ) => { console.error( args.join(" ") ) };

Depuis bien des années (je crois me souvenir que cela date de l'apparition du C++), toutes mes constantes commencent toujours par la lettre k, c'est une habitude qui m'a évité bien des déboires.

Les deux premières simplifications (k$ et k$all) sont évidentes.
Les deux suivantes (klog et kerror) sont inutiles si vous disposez d'un outil muni d'une autocomplétion très rapide. J'en ai eu assez de taper le mot "console" plusieurs fois par jour.

Trois améliorations (on tape autant de code, mais on l'organise différemment).

Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const
  kAddListener = arrayOfArrays => {
    for( let ar of arrayOfArrays ){
      ar[0].addEventListener( ar[1], ar[2], false );
    }
  },
  kSetAttribute = arrayOfArrays => {
    for( let ar of arrayOfArrays ){
      ar[0].setAttribute( ar[1], ar[2] );
    }
  },
  kSetStyle = arrayOfArrays => {
    for( let ar of arrayOfArrays ){
      ar[0].style[ ar[1] ] = ar[2];
    }
  };

  • kAddListener crée des gestionnaires d'événement.
  • kSetAttribute crée des attributs.
  • kSetStyle crée des styles.


Ces améliorations sont surtout utiles lorsqu'on doit apporter plusieurs modifications sur un ou plusieurs éléments du DOM.
Elles bouleversent les habitudes, mais on s'y fait très vite.
Je trouve qu'elles facilitent la compréhension, la modification et la maintenance des codes.

Exemples

Changement du style de listes dans le code JS :

Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<body>
  <main>
    <ul>
      <li>Un</li>
      <li>Deux</li>
      <li>Trois</li>
      <li>Quatre</li>
      <li>Cinq</li>
    </ul>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>
  </main>
  <script>
    // sur tous les éléments "li"
    
    for ( let elemLi of k$all( "li" ) ){
      kSetStyle( [
        [ elemLi, "margin", "0.6rem" ],
        [ elemLi, "color", "gray" ]
      ] );
    }
    
    // sur tous les éléments "li" de la première liste
    
    for( let elemLi of k$all( "ul:first-child > li" ) ){
      kSetStyle( [
        [ elemLi, "font-family", "cursive" ],
        [ elemLi, "font-size", "1.4rem" ]
      ] );
    }
  </script>
</body>

Le cas précédent, plus la modification de la couleur du fond au passage du pointeur :

Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<body>
  <main>
    <ul>
      <li>Un</li>
      <li>Deux</li>
      <li>Trois</li>
      <li>Quatre</li>
      <li>Cinq</li>
    </ul>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>
  </main>
  <script>
    'use strict';
    
    // sur tous les éléments "li"
    
    for ( let elemLi of k$all( "li" ) ){
      kSetStyle( [
        [ elemLi, "margin", "0.6rem" ],
        [ elemLi, "color", "gray" ]
      ] );
    }
    
    // sur tous les éléments "li" de la première liste
    
    for( let elemLi of k$all( "ul:first-child > li" ) ){
      kSetStyle( [
        [ elemLi, "font-family", "cursive" ],
        [ elemLi, "font-size", "1.4rem" ],
        [ elemLi, "width", "10rem" ]
      ] );
      
      kAddListener( [
        [ elemLi, "mouseenter", ev => { ev.target.style.backgroundColor = "yellow" } ],
        [ elemLi, "mouseleave", ev => { ev.target.style.backgroundColor = "white" } ]
      ] );
      
      /*
       * Notation Arrow au lieu de function, ev.target est l'élément du DOM.
       * Pour simplifier, en cas d'usage multiple dans la fonction,
       * vous pouvez écrire : let elem = ev.target;
       */
      
    }
  </script>
</body>

Création de plusieurs gestionnaires d'événements : deux sur le tag "main" et deux sur le tag "input".

Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<body>
  <main>
    <p>Hello</p>
    <input id="nomInput" type="text" value="default">
  </main>
  <script>
    'use strict';
 
    let
      elemMain = k$( "main" ),
      elemNom = k$( "#nomInput" ),
      mainClickHandler = ev => {
        klog( "mainClickHandler : ", ev.type, ev.timeStamp );
        /*
         * Notation Arrow au lieu de function, ev.target est l'élément du DOM.
         * Pour simplifier, en cas d'usage multiple dans la fonction,
         * vous pouvez écrire : let elem = ev.target;
         */
        klog( "ev.target : ", ev.target );
        klog( "ev.currentTarget : ", ev.currentTarget );
        klog( "this : ", this );
      },
      mainMouseEnterHandler = ev => {
        klog( "mainMouseEnterHandler : ", ev.type, ev.timeStamp );
      },
      elemNomClickHandler = ev => {
        ev.stopPropagation();
        klog( "elemNomInputClickHandler : ", ev.type, ev.timeStamp );
      },
      elemNomInputHandler = ev => {
        ev.stopPropagation();
        klog( "elemNomInputHandler : ", ev.type, ev.timeStamp );
      };
      
    kAddListener( [
      [ elemMain, "click", mainClickHandler ],
      [ elemMain, "mouseenter", mainMouseEnterHandler ],
      [ elemNom, "click", elemNomClickHandler ],
      [ elemNom, "input", elemNomInputHandler ]
    ] );
  </script>
</body>

L'exemple précédent dans le HEAD :

Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
  <meta http-equiv="cache-control" content="public, max-age=60">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
  <meta name="author" content="Daniel Hagnoul">
  <title>Test</title>
  <style>
  
  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>
  <script src="http://danielhagnoul.developpez.com/lib/dvjh/dvjhUtilities-1.3.0.js"></script>
  <script>
    'use strict';
 
    let
      domLoadedHandler= ev => {
        klog( `DOM ready   : ${ new kDvjhDate() }` );
        
      },
      windowLoadHandler = ev => {
        klog( `Window load : ${ new kDvjhDate() }` );
 
        let
          elemMain = k$( "main" ),
          elemNom = k$( "#nomInput" ),
          mainClickHandler = ev => {
            klog( "mainClickHandler : ", ev.type, ev.timeStamp );
            /*
             * Notation Arrow au lieu de function, ev.target est l'élément du DOM.
             * Pour simplifier, en cas d'usage multiple dans la fonction,
             * vous pouvez écrire : let elem = ev.target;
             */
            klog( "ev.target : ", ev.target );
            klog( "ev.currentTarget : ", ev.currentTarget );
            klog( "this : ", this );
          },
          mainMouseEnterHandler = ev => {
            klog( "mainMouseEnterHandler : ", ev.type, ev.timeStamp );
          },
          elemNomClickHandler = ev => {
            ev.stopPropagation();
            klog( "elemNomInputClickHandler : ", ev.type, ev.timeStamp );
          },
          elemNomInputHandler = ev => {
            ev.stopPropagation();
            klog( "elemNomInputHandler : ", ev.type, ev.timeStamp );
          };
          
        kAddListener( [
          [ elemMain, "click", mainClickHandler ],
          [ elemMain, "mouseenter", mainMouseEnterHandler ],
          [ elemNom, "click", elemNomClickHandler ],
          [ elemNom, "input", elemNomInputHandler ]
        ] );
        
      };
      
    kAddListener( [
      [ document, "DOMContentLoaded", domLoadedHandler],
      [ window, "load", windowLoadHandler ]
    ] );    
  </script>
</head>
<body>
  <main>
    <p>Hello</p>
    <input id="nomInput" type="text" value="default">
  </main>
</body>
</html>

Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Viadeo Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Twitter Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Google Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Facebook Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Digg Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Delicious Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog MySpace Envoyer le billet « JS : 4 simplifications et 3 améliorations. » dans le blog Yahoo

Mis à jour 18/08/2016 à 23h32 par danielhagnoul

Catégories
Javascript , Développement Web , ES2015

Commentaires