IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Un exemple, pour les experts, utilisant import, shadow et web components


Sujet :

Contribuez

  1. #1
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut Un exemple, pour les experts, utilisant import, shadow et web components
    Avertissement pour les débutants

    Désolé, cet exemple de code n'est pas pour vous. Il s'agit simplement d'un code utilisant les dernières nouveautés. Vous devrez découvrir, déchiffrer et comprendre les codes de cet exemple seul.

    Avertissement pour les experts

    Je découvre et je teste des nouveautés, je serais sans doute incapable de répondre à vos questions.

    Je travaille toujours dans un même environnement que j'appelle ma page de test. Bien entendu, le code de cette page évolue et se complexifie en fonction des nouveautés et de mes besoins futurs. Je viens d'écrire et de tester une nouvelle version.

    L'adoption d'une page de test, pour l'instant, uniquement utilisable sous Chrome 36 et plus semblera prématurée à beaucoup, mais j'ai toujours eu la chance de travailler uniquement pour l'avenir sans avoir à me soucier des navigateurs obsolètes. Je vais devoir tester des codes jQuery dans ce contexte. Je fais aussi le pari que Firefox deviendra très rapidement compatible.

    Avec les outils du développeur, il vous sera très facile de consulter et de récupérer une copie de tous les fichiers mis en oeuvre. Voici le fichier principal :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1.0">
        <meta name="author" content="Daniel Hagnoul">
        <title>Page de test v2.0</title>
     
        <!-- Doit être le premier import : fontes, headjs, css et scripts -->
        <link rel="import" href="http://danielhagnoul.developpez.com/lib/dvjh/dvjhHead.php">
     
        <!-- Exemple : composant web "clock-face" -->
        <link rel="import" href="http://danielhagnoul.developpez.com/lib/dvjh/dvjhClockFace.php">
     
        <!-- Doit être le dernier import : debugBool et QUnit -->
        <link rel="import" href="http://danielhagnoul.developpez.com/lib/dvjh/dvjhFoot.php">
     
        <style>
            /* Nota bene : ici 1 rem est égal à 10 px, voir le fichier dvjhRemBase.css */
            
    /*-- Début code du test --*/
     
     
    /*-- Fin code du test --*/
     
        </style>
        <script>
            "use strict";
            
            // Doit être true, sauf en production pour une version finale.
            var debugBool = true;
            
            head.ready( [ "jquery", "jqueryui", "datefr" ], function(){
                
    /*-- Début code du test --*/
                
    $( function(){
        
        
        
    });
     
    /*-- Fin code du test --*/
     
            });
        </script>
    </head>
    <body>
        <header>
            <h1>Page de test, nouvelle version</h1>
            <h2>Le 2014-08-24, la version 2.0 n'est utilisable que sur Chrome 36 et plus.</h2>
        </header>
        <section class="conteneur">
            <article>
     
    <!-- Début code du test -->
     
    <p>Hello!</p>
     
    <!-- Fin code du test -->
     
            </article>
            <article>
     
                <!-- Exemple : composant web "clock-face" -->
                <clock-face style="height: 200px; width: 200px;"></clock-face>
     
            </article>
        </section>
        <footer>
            <!-- 
                Qunit ne fonctionne pas dans le "#shadow-root" d'un composant web.
                Les divisions "qunit" et "qunit-fixture" doivent être ici.
            -->
            <article class="qunit">
                <div id="qunit"></div>
                <div id="qunit-fixture"></div>
            </article>
            <article class="h-entry">
                <!-- 
                    Ne pas oublier la mise à jour de "dt-published" pour la version finale.
                    Une version en débogage affichera automatiquement la date du jour.
                -->
                <time class="dt-published" datetime="2014-01-22T10:36:43.443+0100">2014-01-22T10:36:43.443+0100</time>
                <a class="p-author h-card" href="http://www.developpez.net/forums/u285162/danielhagnoul/">Daniel Hagnoul</a>
                <a class="u-url" href="http://danielhagnoul.developpez.com/">Mon cahier d’exercices</a>
                <a class="u-url" href="http://javascript.developpez.com/faq/jquery/">FAQ</a>
                <a class="u-url" href="http://javascript.developpez.com/cours/?page=frameworks#jquery">Tutoriels</a> 
            </article>
        </footer>
    </body>
    </html>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    EDIT : 2014-10-09T16:09 : modification mineure, ajout de l'attribut date au tag "hEntry-item"

    Nouvelle version, légère modification, composant "hEntry-item". Le code des fichiers :

    Fichier dvjhPage.html :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1.0">
        <meta name="author" content="Daniel Hagnoul">
        <title>Page de test v2.0</title>
     
        <!-- Doit être le premier import : fontes, headjs, css et scripts -->
        <link rel="import" href="http://danielhagnoul.developpez.com/lib/dvjh/dvjhHead.php">
     
        <!-- Exemple : composant web "clock-face" -->
        <link rel="import" href="http://danielhagnoul.developpez.com/lib/dvjh/dvjhClockFace.php">
     
        <!-- Doit être le dernier import : debugBool et QUnit -->
        <link rel="import" href="http://danielhagnoul.developpez.com/lib/dvjh/dvjhFoot.php">
     
        <style>
            /* Nota bene : ici 1 rem est égal à 10 px, voir le fichier dvjhRemBase.css */
            
    /*-- Début code du test --*/
     
     
    /*-- Fin code du test --*/
     
        </style>
        <script>
            "use strict";
            
            /*
             * En production, debugBool doit être false et l'attribut date 
             * du tag "hEntry-item" doit contenir la date de la mise en 
             * production.
             */
            //debugBool = false;
                            
            head.ready( [ "jquery", "jqueryui", "datefr" ], function(){
                
    /*-- Début code du test --*/
                
    $( function(){
        
        
        
    });
     
    /*-- Fin code du test --*/
     
            });
        </script>
    </head>
    <body>
        <header>
            <h1>Page de test, nouvelle version</h1>
            <h2>Le 2014-08-24, la version 2.0 n'est utilisable que sur Chrome 36 et plus.</h2>
        </header>
        <section class="conteneur">
            <article>
     
    <!-- Début code du test -->
     
    <p>Hello!</p>
     
    <!-- Fin code du test -->
     
            </article>
            <article>
     
                <!-- Exemple : composant web "clock-face" -->
                <clock-face style="height: 200px; width: 200px;"></clock-face>
     
            </article>
        </section>
        <footer>
            <!-- 
                Qunit ne fonctionne pas dans le "#shadow-root" d'un composant web.
                Les divisions "qunit" et "qunit-fixture" doivent être ici.
            -->
            <article class="qunit">
                <div id="qunit"></div>
                <div id="qunit-fixture"></div>
            </article>
            <!-- 
                En production, debugBool doit être false et l'attribut date 
                du tag "hEntry-item" doit contenir la date de la mise en 
                production.
            -->
            <hEntry-item date="date de mise en production"></hEntry-item>
        </footer>
    </body>
    </html>

    Fichier dvjhHead.php :
    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
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
        <meta charset="utf-8">
     
        <link rel="stylesheet" href='http://fonts.googleapis.com/css?family=Sofia|Ubuntu:400|Kreon'>
     
        <script src="http://cdnjs.cloudflare.com/ajax/libs/headjs/1.0.3/head.min.js"></script>
     
        <script>
            "use strict";
            
            // Doit être true, sauf en production pour une version finale.
            var debugBool = true;
            
            head.load(
                "http://danielhagnoul.developpez.com/styles/dvjhRemBase2.css",
                "http://code.jquery.com/ui/1.11.0/themes/sunny/jquery-ui.css",
                "http://code.jquery.com/qunit/qunit-1.15.0.css",
                { "d3" : "http://d3js.org/d3.v3.min.js" },
                { "d3Hello" : "http://danielhagnoul.developpez.com/lib/dvjh/d3Hello.js" },
                { "jquery" : "http://code.jquery.com/jquery-2.1.1.min.js" },
                { "jqueryui" : "http://code.jquery.com/ui/1.11.0/jquery-ui.min.js" },
                { "datefr" : "http://danielhagnoul.developpez.com/lib/dvjh/datefr.js" },
                { "qunit" : "http://code.jquery.com/qunit/qunit-1.15.0.js" },
                { "testsQUnit" : "http://danielhagnoul.developpez.com/lib/dvjh/testsQUnit.js" }
            );      
        </script>
    </head>

    Fichier dvjhFoot.php :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
        <meta charset="utf-8">
     
        <template id="templateHEntry">
            <article class="h-entry">
                <!-- 
                    Ne pas oublier l'attribut date pour la version finale.
                    Une version en débogage affichera automatiquement la date du jour.
                -->
                <time class="dt-published" datetime="2014-01-22T10:36:43.443+0100">2014-01-22T10:36:43.443+0100</time>
                <a class="p-author h-card" href="http://www.developpez.net/forums/u285162/danielhagnoul/">Daniel Hagnoul</a>
                <a class="u-url" href="http://danielhagnoul.developpez.com/">Mon cahier d’exercices</a>
                <a class="u-url" href="http://javascript.developpez.com/faq/jquery/">FAQ</a>
                <a class="u-url" href="http://javascript.developpez.com/cours/?page=frameworks#jquery">Tutoriels</a> 
            </article>
            <style>
                :host { position: relative; display: block; margin-top: 12px; }
                :host a { margin-left: 12px; }
            </style>
        </template>
     
        <script>
            "use strict";
            
            ( function( document, view ){
                        
                head.ready( [ 
                    "d3", "d3Hello", "jquery", "jqueryui", "datefr", "qunit", "testsQUnit"
                ], function(){
                    
                    document.registerElement( "hEntry-item", {
                        "prototype" : Object.create( HTMLElement.prototype, {
                            "readAttributes" : {
                                "value" : function(){
                                    this.date = this.getAttribute( "date" ); 
                                },
                                "enumerable" : true
                            },
                            "createdCallback" : {
                                "value" : function(){
                                    this.shadow = this.createShadowRoot();
                                    
                                    var template = document.querySelector( "#templateHEntry" ).content.cloneNode( true );
                                    
                                    this.shadow.appendChild( template );
                                    
                                    this.readAttributes();
                                    
                                    var dateISO = "";
                                    
                                    if ( debugBool ){
                                        
                                        /*
                                         * Version de débogage, la "dt-published" doit 
                                         * afficher la date du jour.
                                         */
                                        dateISO = ISOformat( new Date() );
                                        
                                    } else {
                                        
                                        /*
                                         * Version finale, on reprend la date contenue dans
                                         * l'attribut date.
                                         * 
                                         * Si cette date n'est pas valide, on affiche une date
                                         * inhabituelle et un avertissement dans la console.
                                         */
                                        var date = new Date( this.date );
                                        
                                        if ( isNaN( date ) ){
                                            date = new Date( "0001-01-01T00:00:00Z" );
                                            
                                            console.log( "Attention ! La date de mise en production contenue dans " +
                                                         "l'attribut date du tag \"hEntry-item\" est invalide." );
                                        }
                                        
                                        dateISO = ISOformat( date );
                                    }
                                    
                                    $( this.shadow.querySelector( ".dt-published" ) )
                                        .attr( "dateTime", dateISO )
                                        .text( dateISO );
                                },
                                "enumerable" :true
                            }
                        })
                    });
                    
                    $( function(){
                        
                        console.log( "DOM construit : ", ISOformat( new Date() ) );
                        
                    });
                    
                    $( view ).load( function(){
                        
                        console.log( "Page web chargée : ", ISOformat( new Date() ) );
        
                        if ( debugBool ){
                            
                            /*
                             * Utilisation de view, exemple : donner les dimensions internes 
                             * de la fenêtre lorsque sa taille change.
                             */
                            
                            /*
                            $( view ).on( "resize", function( event ){
                                console.log( "Dimensions internes de la fenêtre, largeur x hauteur = ", 
                                                $( view ).innerWidth(), " x ", $( view ).innerHeight() );
                            });
                            */                        
                            
                            /*
                             * QUnit : tests unitaires.
                             * 
                             * Tests basiques, on vérifie l'existence des sélecteurs 
                             * et l'unicité des ID.
                             * 
                             * Aide au débogage, QUnit signale toutes les erreurs.
                             */
                            
                            $( ".qunit" ).show();
                            
                            testQUnitSelector( "App", [ 
                                "#qunit", "#qunit-fixture", ".conteneur"
                            ] );
                            
                            testQUnitID( "App", [ 
                                "qunit", "qunit-fixture"
                            ] );
                                           
                        }
                        
                    });
                    
                });
                        
            })(  document.currentScript.ownerDocument, document.currentScript.ownerDocument.defaultView );
        </script>
    </head>

    Fichier dvjhClockFace.php :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    <!DOCTYPE html>
     
    <template id="templateClockFace">
        <style>
            :host {
                position: relative;
                display: block;
                margin: 12px;
                width: 100px;
                height: 100px;
                border: 6px solid black;
                border-radius: 50%;
            }
            .clock-face-container::after {
                position: absolute;
                top: 50%;
                left: 50%;
                width: 12px;
                height: 12px;
                margin: -6px 0 0 -6px;
                background: black;
                border-radius: 6px;
                content: "";
                display: block;
            }
            .clock-face-container > div {
                position: absolute;
                top: 50%;
                left: 50%;
            }
            .clock-face-hour {
                margin: -4px 0 -4px -25%;
                padding: 4px 0 4px 25%;
                transform-origin: 100% 50%;
                border-radius: 4px 0 0 4px;
                background: black;
            }
            .clock-face-minute {
                margin: -40% -3px 0;
                padding: 40% 3px 0;
                transform-origin: 50% 100%;
                border-radius: 3px 3px 0 0;
                background: black;
            }
            .clock-face-second {
                margin: -40% -1px 0 0;
                padding: 40% 1px 0;
                transform-origin: 50% 100%;
                background: red;
            }
        </style>
        <div class="clock-face-container">
            <div class="clock-face-hour"></div>
            <div class="clock-face-minute"></div>
            <div class="clock-face-second"></div>
        </div>
    </template>
     
    <script>
        "use strict";
        
        ( function( document ){
                    
            document.registerElement( "clock-face", {
                "prototype" : Object.create( HTMLElement.prototype, {
                    "readAttributes" : {
                        "value" : function(){
                            this.hour = this.getAttribute( "hour" );
                            this.minute = this.getAttribute( "minute" );
                            this.second = this.getAttribute( "second" );  
                        },
                        "enumerable" : true
                    },
                    "updateClock" : {
                        "value" : function(){
                            var now = new Date(),
                                hour = this.hour || now.getHours(),
                                minute = this.minute || now.getMinutes(),
                                second = this.second || now.getSeconds(),
                                secondAngle = second * 6,
                                minuteAngle = minute * 6 + secondAngle / 60,
                                hourAngle = ( ( hour % 12 ) / 12 ) * 360 + 90 + minute / 12,
                                hourRule = "rotate(" + hourAngle + "deg)",
                                minuteRule = "rotate(" + minuteAngle + "deg)",
                                secondRule = "rotate(" + secondAngle + "deg)";
                    
                            this.hourElement.style.transform = hourRule;
                            this.minuteElement.style.transform = minuteRule;
                            this.secondElement.style.transform = secondRule;
                        },
                        "enumerable" : true
                    },
                    "createdCallback" : {
                        "value" : function(){
                            this.shadow = this.createShadowRoot();
                            
                            var template = document.querySelector( "#templateClockFace" ).content.cloneNode( true );
                            
                            this.shadow.appendChild( template );
                            
                            var that = this;
                            
                            this.readAttributes();
                    
                            this.hourElement = this.shadow.querySelector( ".clock-face-hour" );
                            this.minuteElement = this.shadow.querySelector( ".clock-face-minute" );
                            this.secondElement = this.shadow.querySelector( ".clock-face-second" );
                            
                            this.updateClock();
                            
                            if ( !this.hour && !this.minute && !this.second  ) {
                                setInterval( function(){
                                    that.updateClock();
                                }, 1000 );
                            }
                        },
                        "enumerable" :true
                    },
                    "attributeChangedCallback" : {
                        "value" : function( attrName, oldVal, newVal ){
                            if ( /^(hour|minute|second)$/.test( attrName ) ){
                                this.readAttributes();
                                this.updateClock();
                            }
                        },
                        "enumerable" : true
                    }
                })
            });
            
        })(  document.currentScript.ownerDocument );
    </script>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut Version 2.1.0
    Nouvelle version 2.1.0, voir mon blog : http://www.developpez.net/forums/blo...version-2-1-0/

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

Discussions similaires

  1. [Blague] Le langage de programmation C pour les experts
    Par valentine74 dans le forum Humour Informatique
    Réponses: 29
    Dernier message: 04/10/2009, 02h50
  2. Réponses: 14
    Dernier message: 15/10/2006, 11h22
  3. Question pour les experts
    Par Philippe66 dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 31/08/2006, 23h35
  4. [MSDN]Aide sur un exemple pour les boutons
    Par NicolasJolet dans le forum Windows
    Réponses: 4
    Dernier message: 01/08/2006, 10h41
  5. [Sécurité] Sécurité portable pour les données utilisées dans une requête
    Par berceker united dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/07/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo