« STIC:STIC I - exercice 3 (Yoshi) » : différence entre les versions

De EduTech Wiki
Aller à la navigation Aller à la recherche
(Page créée avec « {{ En construction }} {{stic12}} <categorytree mode="pages" depth="0" style="float:right; clear:right; margin-left:3px; border:1px solid gray; padding:0.7ex; background-co... »)
 
Aucun résumé des modifications
 
(82 versions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{ En construction }}
{{stic archive}}
{{stic12}}
<categorytree mode="pages" depth="0" style="float:right; clear:right; margin-left:3px; border:1px solid gray; padding:0.7ex; background-color:#f9f9f9;">STIC</categorytree>
<categorytree mode="pages" depth="0" style="float:right; clear:right; margin-left:3px; border:1px solid gray; padding:0.7ex; background-color:#f9f9f9;">STIC</categorytree>


Ligne 12 : Ligne 11 :


* Consolider les bases de la programmation et ses composantes principales (variables, types de données, structure de contrôle, etc.)
* Consolider les bases de la programmation et ses composantes principales (variables, types de données, structure de contrôle, etc.)
* Savoir reconnaître/identifier une API et comprendre que, au fond, une API signifie tout simplement: comment obtenir ce que je veux que la machine exécute
* Avoir des notions de base sur la computation et l'intérêt de l'automatisation
* Connaître les principes fondamentaux de l'interaction d'un point de vue "bottom-up"
* Comprendre l'implémentation de JavaScript dans un navigateur web et sur des pages web dynamiques (i.e. modification programmée du DOM) grâce à l'accès à l'objet <code>window</code> et <code>window.document</code> en particulier
* Identifier des mécanismes de Input/Output et les rapporter à des actions de l'utilisateur, du système, etc.
* Identifier des mécanismes de Input/Output et les rapporter à des actions de l'utilisateur, du système, etc.
* Reconnaître un gestionnaire d'événements et le type d'événement déclencheur
* Reconnaître un gestionnaire d'événements et le type d'événement déclencheur
* Comprendre l'implémentation de JavaScript dans un navigateur web et sur des pages web dynamiques
* Créer des interactions simples à travers la combinaison gestionnaire d'événement + manipulation du DOM
* Créer des interactions simples à travers la combinaison gestionnaire d'événement + manipulation du DOM
* Savoir de l'existence des Web API du navigateur (Géolocalisation, Speech Recognition, Audio/Video -> ex4, ...)


=== Prérequis ===
=== Prérequis ===


* [[Tutoriel JavaScript de base]]
;Contenu à maîtriser :
* [https://github.com/MALTT-STIC/stic-1-javascript-essentials Activité complémentaire avec exemples/hands-on/tâches sur JavaScript essentials]
 
* [[Introduction à la programmation]]
* [[Premiers pas avec JavaScript]]
 
;Lectures conseillées pour se préparer au cours en présence :
 
* [[Computation avec JavaScript]], sections 1 à 3
* [[Interactivité avec JavaScript]], sections 1 à 3
 
La lecture complète et la maîtrise des contenus est prévue pour la période à distance.


Logiciels utilisés pendant l'activité en salle de classe :
Logiciels utilisés pendant l'activité en salle de classe :


* [[Brackets]]
* [[Brackets]] / [[Visual studio code]]
* Outils de développement Google Chrome
* Outils de développement Google Chrome


Ligne 33 : Ligne 41 :
===Programme===
===Programme===


* 09:00 - 09:30 : Retour sur la syntaxe de JavaScript et les exercices du Workshop (cf. prérequis)
* 09:00 - 09:30 : Présentation/Démo JavaScript (fonctionnement du langage)
* 09:30 - 10:30 : Introduction à JavaScript côté client
* 09:30 - 10:10 : Activité/Workshop JavaScript de base
* 10:10 - 10:30 : Synthèse sur les principes de base de computation et automatisation des processus
* -- pause --
* -- pause --
* 11:00 - 12:00 : Activités/Workshop JavaScript côté client
* 11:00 - 11:30 : Démo JavaScript côté-client (interactivité)
* 12:00 - 12:30 : (s'il reste du temps) Démo Web API (géolocalisation, Speech Recognition, ...)
* 11:30 - 12:10 : Activité/Workshop JavaScript côté-client
* 12:10 - 12:30 : Synthèse sur les principes de base de l'interactivité avec JavaScript


===Retour sur la syntaxe de JavaScript===
=== Présentation/Démo JavaScript ===


Survol des éléments fondamentaux du langage :
* Retour sur [[Introduction à la programmation]] : questions ? remarques ?
* Brève introduction à [[JavaScript]] en tant que langage (histoire, cadre d'utilisation, ...)
*: [[Fichier:JavaScript trois niveau js.png|néant|thumb|400px|Les trois niveaux du code JavaScript.]]
* Live-coding session
** Le concept de donnée et type de donnée
** Présentation des caractéristiques du langage (syntaxe)
** Illustration des composantes principales (cf. [[Introduction à la programmation]])
** Les Objets natifs
* Introduction à la console JavaScript (voir plus bas dans le workshop)


* Syntaxe : règles pour écrire/organiser le code source
=== Workshop JavaScript de base ===
** Variables : <code>var cours = "STIC I";</code>
** Types de données : (1) primitives (i.e. string, number, boolean, null, undefined); (2) objects (objects, arrays, functions)
** Opérateurs : (1) mathématiques (+, -, /, *, %), (2) logiques (&&, ||, ==, !=, ..), (3) autres (...)
** Structure de contrôle (if... else if... else, switch)
** Boucles (for, while)
** Built-in objects (String, Math, Number, ...) -> properties (i.e. variables) & methods (i.e. functions)
* Instructions
*# Expressions : éléments individuels du langage, e.g. <code>var</code>, <code>+</code>, <code>.</code>, ...
*# Statements : composition d'expressions, e.g. <code>var cours = "STIC" + " I";</code>
*# Bloc de code : composition de statements qui partagent le même scope, e.g. <code>function () { ... }</code>
* Deux types d'instructions :
*# Modifier l'état de la logique de l'application (i.e. "write")
*# Récupérer le résultat d'une manipulation/l'état d'un élément à un moment donné dans la logique de l'application (i.e. "read")


Références :  
Fichiers à télécharger :


* [[Tutoriel JavaScript de base]]
* {{Goblock | [https://github.com/MALTT-STIC/stic-1-javascript-essentials MALTT-STIC/stic-1-javascript-essentials]}}


===JavaScript et le DOM===
==== Utilisation de la Console JavaScript ====


Interaction de JavaScript avec le navigateur web, concepts principaux :
{{bloc important | Pour tester le code, faites du copier/coller dans la console du navigateur }}


* [[Tutoriel_JavaScript_c%C3%B4t%C3%A9_client#L.27objet_global_window|L'objet global window]]
Pour utiliser la Console :
* [[Tutoriel_JavaScript_c%C3%B4t%C3%A9_client#L.27objet_global_windowInclure|JavaScript dans une page HTML]]
* [[Tutoriel_JavaScript_côté_client#Manipulation_des_.C3.A9l.C3.A9ments_du_DOM|Manipulation du DOM]]
* [[Tutoriel_JavaScript_côté_client#.C3.89v.C3.A9nements_du_DOM|Gestionnaire d'événements]] :
*#Identifier un élément dans le DOM
*#Lui appliquer un gestionnaire d'événement
*#Créer une fonction qui :
*#*Identifie les éléments à modifier suite à l'événement
*#*Applique les modifications et met à jour le DOM


==== Présentation interactive ====
* Internet Explorer : Menu Outils > Outils de développement (ou F12)
* Firefox : le scratchpad (SHIFT F4), sinon la console (F12) qui permet d'entrer une ligne.
* '''Chrome : Menu Outils > Console JavaScript (ou F12)'''
* Safari : D'abord dans les Options > Avancées cocher la case "Afficher le menu Développement dans la barre des menus", puis CTRL+Alt+I ou CTRL+Alt+C
* Opera: Menu Page > Outils de Développement > Opera Dragonfly (ou CTRL+Shift+I)


Présentation avec bouts de code à tester dans la console de votre navigateur :
[[Fichier:JavaScript tutoriel base console error.jpg|thumb|800px|none|Console des erreurs en Google Chrome]]


* {{Goblock|[http://tecfa.unige.ch/perso/mafritz/teaching/slides/stic-1-programming.html Slides interactives JavaScript et le DOM]}}
La console JavaScript est un endroit très utile pour tester du code JavaScript pour deux raisons :


==== Analyse/Activité sur un exemple de base ====
# On peut saisir directement du code dans la console et l'évaluer. Dans l'image suivante, les lignes précédées par > sont des lignes avec du code, et les lignes précédées par <- proposent le résultat de l'évaluation du code.
#:[[Fichier:JavaScript console code.png|none|frame|La console du navigateur évalue directement du code.]]
#:
# On peut communiquer avec la Console JavaScript. Par exemple la notation <code>console.log()</code> permet d'écrire un message dans la Console. Pour ceux qui ont utilisé Flash, cette instruction est similaire à la fonction trace() de Flash. Voici un exemple :
#:<source lang="JavaScript">
for(var i = 0; i < 5; i++) {
    console.log("Cycle actuel : " + i);
}
</source>
#:Le résultat de ce script dans la console JavaScript est le suivant :
#:[[Fichier:JavaScript tutoriel base console log.jpg|cadre|néant|La méthode log() de l'objet Console permet d'afficher des messages dans la console JavaScript.]]


Le "célèbre" compteur :
=== Synthèse des principes de base de computation et automatisation des processus ===


* {{Goblock|[http://codepen.io/mafritz/pen/NNmgqG Démo : mise à jour du DOM après téléchargement de la page]}}
[[Fichier:IntroProgrammation fxy.png|700px|vignette|néant|Programmer signifie traduire les intentions du développeur de manière que la machine les exécutes conformément aux attentes. Adaptation de Denning & Martell (2015, p. 90, Fig. 5-3) ]]


À essayer dans l'ordre, juste par analogie/intuition :
* Faire le trait d'union entre l'[[Introduction à la programmation]] et [[Computation avec JavaScript]]
* Pensée symbolique et processus de traitement de l'information
* <code>Programme = Algorithme + Données</code>
* Fonctionnement technique de l'interprète JavaScript
*: [[Fichier:ComputationJS expression and statement.png|400px|vignette|néant|Lecture du code source du point de vue de l'interprète qui décompose le code source à la recherche de pattern qu'il reconnaît.]]
* Avantages de l'automatisation :
** Rendre les processus plus vite (sur le moyen terme !)
** Rendre les processus plus fiables (si le code est bon !)
** Répliquer les processus par d'autres personnes (e.g. problème de réplicabilité des Sciences Sociales)


# Faire diminuer au lieu d'augmenter le compteur à chaque clique d'une unité (hint: vous pouvez modifier le HTML pour être cohérents avec l'expérience utilisateur)
'''À retenir''', programmer en JavaScript correspond à :
# Faire démarrer le compteur à 100 (hint: vous devez modifier le HTML initial pour refléter le changement)
# Faire diminuer le compteur de 5 unités à la fois
# Placer le compteur à 1 et associer à chaque clique une multiplication de 10


==== Fix the problem: "Shouting App" ====
{{bloc important |
# Réduire la complexité d'un problème ou d'un besoin à une suite d'instructions automatisées.
# Traduire ces instructions en code JavaScript, afin que l'interprète puisse les computer de manière correspondante aux attentes. }}


L'exemple suivant montre une petite application qui permet de ''crier'' (i.e. transformer un texte en majuscules). Le code JavaScript de l'exemple suivant '''est correct''', mais '''l'application ne marche pas'''. Essayez par analogie à l'exemple du compteur de trouver ce qui manque '''dans le HTML''' pour que l'application marche :
=== Démo JavaScript côté-client ===


* {{Goblock|[https://codepen.io/mafritz/pen/qPLMyL Application à corriger]}}
Fonctionnement de JavaScript côté-client :


; Solution
* Retour sur [[Premiers pas avec JavaScript]] : questions ? remarques ?
* {{ Goblock | [http://tecfa.unige.ch/perso/mafritz/teaching/slides/stic-1-javascript-client-side.html#/ Présentation interactive] }}
* Téléchargement des instructions avec le <code><script>...</script></code> JavaScript
* La notion de ''Application Programming Interface'' (API) : <code> JavaScript côté-client = JavaScript de base + Web API</code>
** Accès (limité) de JavaScript au navigateur web avec l'objet <code>window</code>
** Accès (presque illimité) de JavaScript au DOM de la page web avec l'objet <code>window.document</code>
* Ambivalence du DOM :
*# Définit la structure de votre interface utilisateur (paragraphe, bouton, image, ...)
*# Définit la structure de vos "données", e.g. :
*#*<code><nowiki><p class="instructions">Cliquer sur ce bouton</p></nowiki></code>
*#*: Le paragraphe représente la donnée ''instructions à donner à l'utilisateur''
*#*<code><nowiki><p class="feedback">la réponse est correcte !</p></nowiki></code>
*#*: Le paragraphe représente la  donnée ''feedback à donner à l'utilisateur''
*#*<code><nowiki><span id="score">100</span></nowiki></code>
*#*: Le span représente la  donnée ''score de l'utilisateur''
* Le script JavaScript peut agir sur les deux versants :
*# {{bloc important | Modifier la structure de l'interface graphique }}
*#* [https://maltt-stic.github.io/stic-1-app-examples/02-blink/ Application sur la lecture qui cache le mot après 200ms]
*#* [https://maltt-stic.github.io/stic-1-first-steps-with-javascript/06-final/ Brain lobes] (exercice 2)
*# {{bloc important | Modifier la structure des "données" }}
*#* [https://maltt-stic.github.io/stic-1-app-examples/01-reverse/ Application sur la lecture qui affiche un mot différent (i.e., une donnée différente) au même endroit]
*#* [https://codepen.io/mafritz/pen/NNmgqG Simple compteur '''sur base 10''']
*#* [https://codepen.io/mafritz/pen/eGvVVy Simple compteur '''sur base 2''']


* [https://codepen.io/mafritz/pen/GOgvmK Voir la solution]
Analyse techniques des deux applications pour la lecture présentées en P1 :


==== API: Utilisation des éléments mis à disposition par le langage ====
* {{Goblock | [https://maltt-stic.github.io/stic-1-app-examples/01-reverse/ esrever] }} : entraînement de la voie d'assemblage (construction des mots à travers le déchiffrage des lettres)
** L'algorithme permet d'afficher les lettres qui composent un mot à l'inverse, de cette manière on ne peut pas utiliser la forme du mot.
**:<source lang="JavaScript" line="">
/**
* Code pour construire une simple application interactive qui affiche aléatoirement un mot à l'envers depuis une liste
*/


Dans la "Shouting App" nous avons utilisé la méthode <code>.toUpperCase()</code> qui nous a permis d'obtenir exactement ce qui était dans nos intentions (i.e. ''crier''). Bien évidemment, il n'y a pas toujours une méthode qui fait exactement ce qu'on veut, et il faut donc construire notre fonction en combinant plusieurs éléments.
//Liste de mots
var wordList = [
  "maison",
  "chien",
  "chat",
  "avion",
  "lettre",
  "marionette",
  "chaise",
  "école",
  "mathématique",
  "livre",
  "français",
  "géographie",
  "cahier",
  "stylo"
];


C'est à ce moment qu'il est bien d'utiliser une référence aux élément que le langage et/ou l'environnement mettent à disposition pour obtenir ce qu'on veut, ce qu'on appelle une '''API''', de l'anglais ''Application Programming Interface'', ou [https://fr.wikipedia.org/wiki/Interface_de_programmation Interface de programmation en français].
//Fonction pour enverser le mot
 
* Voir par exemple [https://www.w3schools.com/jsref/default.asp la référence sur W3Schools pour JavaScript et le DOM]
 
'''Problème''' : je veux obtenir l'inverse d'un mot. E.g. STIC --> CITS
 
Démarche :
 
# Avec quelle type de données on a à faire ? Une suite de caractère --> String
# Existe-t-il une fonctionnalité du langage qui fait ce que je veux ?
#* Contrôler la [http://www.w3schools.com/jsref/jsref_obj_string.asp liste des propriétés/méthodes associés aux String]
#* Il n'y a rien qui fait exactement ce dont j'ai besoin
# Existe-t-il quelque chose qui pourrait être utile ?
#* La méthode <code>split()</code> sépare une suite de caractère et en fait une liste indexée, i.e. un array ([http://www.w3schools.com/jsref/jsref_split.asp référence])
#* Donc je peux passer de "STIC" à ["S", "T", "I", "C"]
# Maintenant je me retrouve avec un array. Existe-t-il une fonctionnalité du langage qui permet d'inverser un array?
#* Contrôler la [http://www.w3schools.com/jsref/jsref_obj_array.asp liste des propriétés/méthode associés aux Array]
#* La méthode <code>reverse()</code> s'occupe exactement de cela ([http://www.w3schools.com/jsref/jsref_reverse.asp référence])
#* Donc je peux passer de ["S", "T", "I", "C"] à ["C", "I", "T", "S"]
# Maintenant je me retrouve avec un array qui a les lettres dans le bon ordre. Existe-t-il une fonctionnalité du langage qui permet de passer d'un Array à un String?
#* Contrôler à nouveau la liste des propriétés/méthodes associés aux Array (vour plus haut)
#* La méthode <code>join()</code> s'occupe exactement de cela ([http://www.w3schools.com/jsref/jsref_join.asp référence])
#* Donc je peux passer de ["C", "I", "T", "S"] à "CITS"
# Résolution du problème
 
Même passage en code :
 
<source lang="JavaScript">
//Déclarer une variable avec le mot que je veux inverser
var init= "STIC"; //--> "STIC"
 
//Commencer par le traduir en array
var singleLetters = init.split(""); //--> ["S", "T", "I", "C"]
 
//Inverser l'ordre des éléments
var reverseLetters = singleLetters.reverse(); //--> ["C", "I", "T", "S"]
 
//Unire les lettres dans l'ordre inverse
var end = reverseLetters.join(""); //--> "CITS"
</source>
 
Dans cet exemple de code on a utilisé beaucoup de variables qui en fait ne servent pas. Donc on peut améliorer le code (i.e. faire du '''refactoring''') :
 
<source lang="JavaScript">
var init = "STIC"; //--> "STIC"
var end = init.split("").reverse().join(""); //--> "CITS";
</source>
 
À ce point on a un meilleur algorithme, mais si on voulait connaître l'inverse de "ERGO", il faudrait écrire à nouveau les mêmes passages juste avec une nouvelle valeur associée à la variable init. On peut faire mieux, on peut créer une '''fonction''' :
 
<source lang="JavaScript">
//Déclarer une fonction avec un argument. Ce sera le mot initial
function reverseWord(init) {
function reverseWord(init) {
   //Renvoyer le mot inversée en utilisant l'aglorithme que nous avons créé
   //Renvoyer le mot inversée en utilisant l'aglorithme que nous avons créé
   return init.split("").reverse().join("");
   return init
    .split("")
    .reverse()
    .join("");
}
}


//Maintenant il sera suffisant d'invoquer cette fonction et lui passer le mot en tant qu'argument pour obtenir l'inverse
//Fonction pour récupérer un mot aléatoire
var sticReverse = reverseWord("Sciences et Technologies de l’Information et de la Communication");
function getRandomWord() {
var ergoReverse = reverseWord("Design centré utilisateur et ergonomie");
  var randomIndex = Math.floor(Math.random() * wordList.length);
</source>
  return wordList[randomIndex];
}


==== Extension de l'exemple ====
//Ajouter le gestionnaire d'événement au bouton
 
document.querySelector("#randomWordBtn").addEventListener("click", function() {
Par extension de l'exemple fixé au point précédent, '''transformez l'application pour que l'utilisateur puisse obtenir l'envers de ce qu'il a écrit''' dans le textinput au lieu que la transformation en majuscules.  
  var randomWord = getRandomWord();
 
  var reverse = reverseWord(randomWord);
* Créez l'application avec des fichiers sur votre ordinateur (i.e. avec Brackets), pas dans Codepen.io
  document.querySelector("#targetWord").textContent = reverse;
* Mettez le code JavaScript dans un fichier externe et incorporez le dans votre page html, e.g. :
});
 
<source lang="HTML5">
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Untitled Document</title>
</head>
<body>
<!-- Ajoutez le code HTML nécessaire ici -->
 
<!-- Laissez le lien au fichier JavaScript juste avant le tag de fermeture </body>. Modifiez l'attribut src pour pointer au fichier que vous avez créé -->
<script src="path/to/file.js"></script>
</body>
</html>
</source>
</source>
* {{Goblock | [https://maltt-stic.github.io/stic-1-app-examples/02-blink/ Mot clignotant] }} : entraînement de la voie d'adressage (reconnaissance des mots par leur "forme")
** L'algorithme affiche le mot seulement pour 200ms, de cette manière on n'a pas le temps de construire le mot lettre par lettre.
**:<source lang="JavaScript" line="">
/**
* Code pour construire une simple application interactive qui affiche aléatoirement un mot à l'envers depuis une liste
*/


* '''Hint''' : récupérez la fonction qu'on a vu plus tôt pour inverser une suite de caractères
//Liste de mots
var wordList = [
  "maison",
  "chien",
  "chat",
  "avion",
  "lettre",
  "marionette",
  "chaise",
  "école",
  "mathématique",
  "livre",
  "français",
  "géographie",
  "cahier",
  "stylo"
];


==== Solution de l'exemple ====
//Fonction pour récupérer un mot aléatoire
 
function getRandomWord() {
; Code HTML
  var randomIndex = Math.floor(Math.random() * wordList.length);
 
  return wordList[randomIndex];
<source lang="HTML5">
}
<!doctype html>
<html>
 
<head>
    <meta charset="UTF-8">
    <title>Reverse word</title>
</head>
 
<body>
    <!-- Ajoutez le code HTML nécessaire ici -->
    <!-- Something is mîssing in the HTML, see the JS code to find out what and correct it -->
    <h1>Fix this example</h1>
    <p>There is something missing in the HTML of this example to make it work, find and correct the problem.</p>
 
    <!-- Input + Element for the event listener -->
    <input id="shoutInput">
    <button id="shoutBtn">Shout it!</button>
 
    <!-- Output -->
    <p id="shoutOutput"></p>
    <!-- Laissez le lien au fichier JavaScript juste avant le tag de fermeture </body>. Modifiez l'attribut src pour pointer au fichier que vous avez créé -->
    <script src="app.js"></script>
</body>
 
</html>
</source>


; Code JS
//Ajouter le gestionnaire d'événement au bouton
document.querySelector("#randomWordBtn").addEventListener("click", function () {
  //Sélectionner un mot aléatoire
  var randomWord = getRandomWord();


<source lang="JavaScript">
  //Associr le mot aléatoire au placeholder
//The code here is good
  var targetWord = document.querySelector("#targetWord");
//Identiy the interactive elements
  targetWord.textContent = randomWord;
var messageToShout = document.getElementById("shoutInput");
var clickToShout = document.getElementById("shoutBtn");
var shoutBox = document.getElementById("shoutOutput");


//Declaration of function
  //Afficher le mot s'il est caché
function reverseWord(init) {
  var wordContainer = document.querySelector(".showWord");
    //Renvoyer le mot inversée en utilisant l'aglorithme que nous avons créé
  wordContainer.style.display = "block";
    return init.split("").reverse().join("");
}


//Event listener and handler
clickToShout.onclick = function () {
    shoutBox.innerHTML = reverseWord(messageToShout.value);
};


  //Démarrer un timer qui cache le mot après 200ms
  setTimeout(function () {
    wordContainer.style.display = "none";
  }, 200)
});
</source>
</source>


==== Exemples ====
Liens vers le ''repository'' avec les fichiers des exemples : [https://github.com/MALTT-STIC/stic-1-app-examples MALTT-STIC/stic-1-app-examples]


Vous pouvez vous appuyez sur les exemples suivantes pour vos applications à rendre sans la nécessité de les citer. Il faudra par contre les modifier/adapter aux objectifs de votre application.
=== Workshop JavaScript côté-client ===


; Manipulation du DOM et événement :
Fichiers à télécharger :


* [http://codepen.io/mafritz/pen/vNRVxw Simple manipulation du DOM avec JavaScript]
* {{Goblock | [https://github.com/MALTT-STIC/stic-1-javascript-client-side MALTT-STIC/stic-1-javascript-client-side] }}
* [http://codepen.io/mafritz/pen/XdQZQR Modifier le comportement "normal" du navigateur web]
* [http://codepen.io/mafritz/pen/NGzpEo Événements liés à la souris]
* [http://codepen.io/mafritz/pen/JRVAGj L'object "event"]
* [http://codepen.io/mafritz/pen/OyZzpw JavaScript et CSS]
* [http://codepen.io/mafritz/pen/OyZJvx L'éléments this dans le DOM]
* [http://codepen.io/mafritz/pen/PPeodJ JavaScript et formulaires HTML]
* [http://codepen.io/mafritz/pen/NRvGJZ JavaScript et les événements lié au temps]


Ces exemples (et plus) sont disponibles également ici http://codepen.io/collection/XgkejK/
==== Utilisation de la Console JavaScript ====


===== Un autre exemple =====
{{bloc important | Utilisez encore une fois la console pour repérer des erreurs. Cela doit devenir une habitude : contrôlez toujours la console lorsque vous testez vos dispositifs ! }}
Voici un exemple pour une fenêtre JavaScript qui permet de montrer la bonne réponse avec une fenêtre qui s'affiche et sur le bouton après avoir cliqué dessus :


nom du bouton à cliquer.onclick = function () {
=== Synthèse des principes de base de l'interactivité avec JavaScript ===


this.innerHTML = "texte qui apparaît et qui reste après avoir cliqué sur le bouton.";
[[Fichier:Interactivité avec JavaScript composantes.png|700px|vignette|néant|Trois caractéristiques d'une application interactive qui utilise une interface utilisateur.]]


alert("texte qui apparaît sur la fenêtre qui s'affiche.");        
* Faire le trait d'union entre l'[[Introduction à la programmation]] et [[Interactivité avec JavaScript]]
* <code>Interactivité = inputs générés par les utilisateurs</code>
* Fonctionnement de JavaScript côté-client : l'utilisateur télécharge les instructions avec le contenu de la page
** JavaScript a accès à la page grâce à l'objet global <code>window</code> et au DOM grâce à l'objet <code>window.document</code>
** Tout élément d'une page peut être rendu interactif avec la même démarche :
**# Identifier l'élément parmi tous les éléments
**# Lui appliquer un gestionnaire d'événements
**# Appliquer à l'intérieur du gestionnaire une règle qui génère une modification
**: [[Fichier:Interactivité avec JavaScript - structure of an interaction.png|400px|vignette|néant|Structure d'une interaction, adaptation de [http://microinteractions.com/what-is-a-microinteraction/ What is a microinteraction] de Saffer (2014)]]
* Possibilité d'animer le DOM ([[Animation avec JavaScript]])
* Accès à travers le navigateur à d'autres API (e.g. [[Canvas (HTML5)]], Géolocalisation, Webcam, ...)
** Lien avec exercice 4 : [[HTML5 audio et video]]
* Importance du guidage pour suggérer les interactions attendues par l'application et orienter l'attention au(x) bon(s) endroit(s)
** {{ citation | Tout le monde sait ce qu’est l’attention. C’est la prise de possession par l’esprit, sous forme claire et vive, de l’un parmi ce qui semble plusieurs objets ou trains de pensée simultanément possibles. La focalisation, la concentration de la conscience, participent de son essence. '''Elle implique un retrait de certaines choses afin de traiter efficacement les autres''' (…) }} (William James, ''Principes de psychologie'', 1890, p.404).


; Utiliser JavaScript avec SVG :
'''À retenir''' :


* [http://tecfa.unige.ch/perso/mafritz/teaching/stic-1/svg/javascript-svg-ex1.html Ajouter des éléments SVG]
{{bloc important | L'interactivité avec JavaScript consiste dans le changement programmé du DOM à travers les instructions contenues dans un ou plusieurs scripts. Ces changements se reflètent dans la mise à jour de l'interface utilisateur affichée par le navigateur.}}
* [http://tecfa.unige.ch/perso/mafritz/teaching/stic-1/svg/javascript-svg-ex2.html Rendre des éléments SVG interactifs]


=== Workshop ===
== Projet 3 / Tâche ==


Workshop files from GitHub :
Voici de suite la description détaillée de la tâche et le matériel de support à votre disposition pour compléter l'exercice pendant la période à distance.


* https://github.com/MALTT-STIC/stic-1-javascript-client-side
=== Lectures et matériel de support ===


==== Références ====
Ces articles proposent les contenus utiles aux finalités pédagogiques du cours. Pour compléter l'exercice ou atteindre les objectifs spécifiques à votre dispositif (voir plus bas), d'autres ressources peuvent être nécessaires.


* [[Tutoriel JavaScript côté client]]
* {{Goblock | [[Interactivité avec JavaScript]] }} : aspects théoriques et pratiques, lecture commune avec exercice 4, niveau des exemples à calibrer en fonction de vos besoins et intérêts
* [https://www.w3schools.com/jsref/default.asp JavaScript and HTML DOM reference on W3Schools] (i.e. API de JavaScript côté client)
* {{Goblock | [[Computation avec JavaScript]] }} : aspects théoriques et pratiques, niveau des exemples à calibrer en fonction de vos besoins et intérêts.
 
=== Web API (avancé) ===
 
Grâce à l'environnement du navigateur web, JavaScript a accès non seulement au DOM, mais également à d'autres éléments/informations. Pour les plus ambitieux, vous pouvez regarder/essayer :
 
* '''La géolocalisation''' : possibilité de récupérer la position de l'utilisateur (avec son consentement!) 
** Voir [https://www.w3schools.com/html/html5_geolocation.asp HTML5 Geolocation sur W3Schools]
* '''Le canvas''' : possibilité de dessiner à travers JavaScript sur une "toile" représenté par l'élément HTML5 <code><canvas></canvas></code>. Utilisé souvent pour des jeux.
** Voir [[Canvas (HTML5)]] sur ce wiki
** [https://www.w3schools.com/html/html5_geolocation.asp HTML5 Canvas sur W3Schools]
 
'''NB''' : on verra la possibilité d'interagir avec des éléments Audio/Video dans l'exercice 4 (voir également [[HTML5 audio et video]])
 
== Projet 3 / Tâche ==


=== Dispositif ===
=== Dispositif ===
Ligne 313 : Ligne 297 :
* Ajoutez une ou plusieurs manipulations du DOM suite à un événement (e.g. afficher un feedback, remplacer une image, etc.)
* Ajoutez une ou plusieurs manipulations du DOM suite à un événement (e.g. afficher un feedback, remplacer une image, etc.)
* Le tout doit servir à un objectif déclaré dans votre rapport (pas juste votre objectif d'apprentissage !)
* Le tout doit servir à un objectif déclaré dans votre rapport (pas juste votre objectif d'apprentissage !)
Vous pouvez adapter/revisiter '''tous''' les exemples disponibles dans le matériel de support, voir également :
* {{Goblock | [[SVG avec JavaScript]] }}
si vous voulez rendre un dessin SVG interactif en continuité avec l'exercice 2. '''Mais ne répétez pas simplement le principe de la Flash card !'''


==== Contraintes ====  
==== Contraintes ====  


* Contenu de la page selon vos envies, mais en rapport avec une thématique MALTT
* Contenu de la page selon vos envies, mais en rapport avec une thématique MALTT
* Vous devez inclure un fichier JavaScript externe
* Vous devez inclure un fichier JavaScript '''externe'''
* La page doit contenir au moins deux éléments interactifs (e.g. bouton, zone de texte modifiable, ...)
* Vous devez créer au moins '''une action interactive déclenchée par l'utilisateur''' qui modifie le contenu de la page en modifiant le DOM
* Vous devez créer au moins une manipulation du DOM qui modifie le contenu de la page sans actualiser la page ou pointer vers un autre lien
** C'est-à-dire <code>gestionnaire d'événement + règle de comportement + feedback à l'interface</code>
** Pas de drag&drop (on le verra en P3)
* Votre code doit contenir au moins '''l'une de ces caractéristiques''' (à choix) :
** Une structure de contrôle de type <code>if... else...</code>
** La génération d'un élément aléatoire
** L'utilisation d'une boucle <code>for...</code> ou <code>while</code>
* Vous pouvez utiliser du clipart (SVG ou autre) fait par d'autres, mais citez la source dans le rapport et dans la page de votre dispositif
* Vous pouvez utiliser du clipart (SVG ou autre) fait par d'autres, mais citez la source dans le rapport et dans la page de votre dispositif
* Vous pouvez utiliser des bouts du code depuis les exemples en cours, mais il faudra au moins adapter le code JavaScript (pas simplement changer/adapter le contenu HTML)
* Vous pouvez vous appuyer sur des exemples vus en cours ou disponibles dans le matériel pédagogique, mais il faudra au moins '''adapter le code JavaScript''' (pas simplement changer/adapter le contenu HTML)
* Vous ne pouvez pas combiner '''sur la même page''' les exercices 3 et 4
** Mais vous pouvez utiliser le même sujet (e.g. ''mini''-site avec deux pages)


=== Pour les plus ambitieux ===
=== Pour les plus ambitieux ===


En général, si vous maîtrisiez bien JavaScript, concentrez-vous sur les aspects interactifs/ergonomiques/pédagogiques de l'application : il ne suffit pas de savoir coder pour créer un bon dispositif !
En général, si vous maîtrisiez bien JavaScript, concentrez-vous sur les aspects interactifs/ergonomiques/pédagogiques de l'application : il ne suffit pas de savoir coder pour créer un bon dispositif !
;Niveau intermédiaire
* Vous pouvez essayer l'une des [[Bibliothèques JavaScript]] listés ou en proposer une autre.
* Vous pouvez utiliser [[jQuery]] (mais pas jQuery UI qu'on verra en P3) à condition que vous ayez compris les principes du "vanilla" JavaScript.
;Niveau avancé
Si vous avez enfin un background informatique avec des bonnes connaissances d'un langage style C++, C#, Java, à la limite PHP, vous pouvez utiliser [https://www.typescriptlang.org/ TypeScript].
Dans ce cas, pensez à utiliser un éditeur de texte qui supporte cette syntaxe, à ma connaissance il n'y a pas de plugin Brackets satisfaisants pour l'instant. Je vous conseille [[Visual studio code]], dont la page sur ce Wiki pourrait être améliorée d'ailleurs - [[Utilisateur:Mattia A. Fritz|Mattia A. Fritz]] ([[Discussion utilisateur:Mattia A. Fritz|discussion]]) 1 novembre 2016 à 16:49 (CET)


=== Critères d'évaluation ===
=== Critères d'évaluation ===
Ligne 354 : Ligne 340 :
* Indications pertinentes sur les interactions disponibles (e.g. guidage, texte descriptif, ...)
* Indications pertinentes sur les interactions disponibles (e.g. guidage, texte descriptif, ...)
* Design graphique soigné (e.g. bonne utilisation CSS)
* Design graphique soigné (e.g. bonne utilisation CSS)
* Organisation du contenu
* '''Pour une très bonne note''' : l'application peut être "réutilisable" (e.g. génération aléatoire, bouton "start again", etc.)
** Essayez d'aller au-delà de "poser une seule question et donner un feedback juste/faux"
** Dans l'idéale, cherchez d'exploiter la capacité de l'ordinateur à faire des choses automatiques


=== Rapport ===
=== Rapport ===
Ligne 370 : Ligne 358 :
Contribution libre comme d'habitude :
Contribution libre comme d'habitude :


* [[STIC:Rapport STIC I et II#Contribution_Wiki]]
* [[STIC:Contribution Wiki]]


Quelques suggestions :
Quelques suggestions :
Ligne 378 : Ligne 366 :
* Cherchez des pages liées à JavaScript mais qui ne sont pas dans la [[:Category:JavaScript]]
* Cherchez des pages liées à JavaScript mais qui ne sont pas dans la [[:Category:JavaScript]]
* Corrections/améliorations des pages [[JavaScript]], [[Tutoriel JavaScript de base]], [[Tutoriel JavaScript côté client]]
* Corrections/améliorations des pages [[JavaScript]], [[Tutoriel JavaScript de base]], [[Tutoriel JavaScript côté client]]
* Passer en [[SVG]] les schémas des pages de l'[[Initiation à la pensée computationnelle avec JavaScript]] qui sont en png


=== Délai ===
=== Délai ===


Dimanche 20:00 avant la semaine des cours présentiels P3
{{Bloc important | Dimanche 18 novembre, 21:00 }}
 
==== Feedback intermédiaire ====
 
Vous pouvez demander un feedback intermédiaire sur votre travail à travers la page discussion de cet exercice (voir Aide plus bas) '''au plus tard''' 2 semaines avant le délai.


== Ressources ==
== Ressources ==
Ligne 392 : Ligne 377 :


* [[Introduction à la programmation]]
* [[Introduction à la programmation]]
* [[Enseignement de l'informatique à l'école]]
* [[Pensée computationnelle]]
** [http://www.rts.ch/play/radio/forum/audio/faut-il-obliger-les-enfants-a-suivre-des-cours-de-programmation-informatique-a-lecole?id=7638246 Débat RTS]
* [[JavaScript]]
* [[Computation avec JavaScript]]
* [[Interactivité avec JavaScript]]


=== Techniques ===
=== Techniques ===
==== Exemples ====
* [https://codepen.io/collection/XgkejK/ Collection de simples exemples sur Codepen.io]


==== Références de base ====
==== Références de base ====


* [[JavaScript]]
* [[Tutoriel JavaScript de base]]
* [[Tutoriel JavaScript de base]]
* [[Tutoriel JavaScript côté client]]
* [[Tutoriel JavaScript côté client]]
* [[SVG avec JavaScript]]
* [[Review de ressources pour débuter JavaScript]]
* [[Review de ressources pour débuter JavaScript]]
* [https://developer.mozilla.org/fr/docs/Web/JavaScript JavaScript sur Mozilla Developer Network] (ressources pour plusieurs niveaux)
* [http://www.w3schools.com/js/ Tutoriel JavaScript sur W3schools]
* [http://www.w3schools.com/js/ Tutoriel JavaScript sur W3schools]
* [https://www.w3schools.com/jsref/default.asp JavaScript and HTML DOM reference on W3Schools]
* [https://www.w3schools.com/jsref/default.asp JavaScript and HTML DOM reference on W3Schools]
Ligne 409 : Ligne 401 :
==== Références plus avancées ====  
==== Références plus avancées ====  


* [[Animation avec JavaScript]]
* [[Canvas (HTML5)]] - API pour déssiner
* [[Canvas (HTML5)]] - API pour déssiner
* Géolocalisation sur [https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/Using_geolocation MDN] ou [https://www.w3schools.com/html/html5_geolocation.asp W3Schools]
* Géolocalisation sur [https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/Using_geolocation MDN] ou [https://www.w3schools.com/html/html5_geolocation.asp W3Schools]
Ligne 415 : Ligne 408 :


=== Bibliographie ===
=== Bibliographie ===
; Livre recommandé pour débutants:
* [http://shop.oreilly.com/product/9781593274085.do JavaScript for Kids] (Pas forcément pour enfants, pas super drôle, mais bien écrit). La version e-ebook ne coûte pas très cher et elle est partageable.


; Livres pour débutants/intermédiares avec aussi de la théorie (free on the web/pay printable version)  :
; Livres pour débutants/intermédiares avec aussi de la théorie (free on the web/pay printable version)  :


* Haverbeke, M. (2015). Eloquent JavaScript. A modern Introduction to Programming. Second Edition. San Francisco, CA: No Starch Press. Accès libre depuis internet: http://eloquentjavascript.net/
* Haverbeke, M. (2018). Eloquent JavaScript. A modern Introduction to Programming. Third Edition. San Francisco, CA: No Starch Press. Accès libre depuis internet: http://eloquentjavascript.net/
* Simpson, K. (2015). You Don’t Know JS: Up & Going. O’Reilly Media. Accès libre à la version non editée de toute la série de livres https://github.com/getify/You-Dont-Know-JS
* Simpson, K. (2015). You Don’t Know JS: Up & Going. O’Reilly Media. Accès libre à la version non editée de toute la série de livres https://github.com/getify/You-Dont-Know-JS


Ligne 441 : Ligne 430 :
'''Important''': Si vous cliquez sur l'étoile ("Ajouter cette page à votre liste de suivi"), le wiki vous enverra un mail après chaque modification de la page.
'''Important''': Si vous cliquez sur l'étoile ("Ajouter cette page à votre liste de suivi"), le wiki vous enverra un mail après chaque modification de la page.


=== Séminaire de codage ===
=== Journée de Support Libre ===
 
{{Bloc important | Exceptionnellement pour cette période, la Journée de Support libre est déplacée d'une semaine. Elle sera donc jeudi 15 novembre. }}


Le lundi après la semaine des cours en présence (i.e. le lundi suivant le cours STIC du vendredi), un séminaire de codage est organisé par TECFA.  
'''La présence d'au moins un assistant/moniteur spécifiquement pour STIC est garantie de 10h à 12h s'il y a assez d'étudiants qui ont manifesté leur présence.'''


* voir [http://tecfalms.unige.ch/moodle/course/view.php?id=291 Séminaire de codage sur Moodle TECFA]
* voir [http://tecfalms.unige.ch/moodle/course/view.php?id=291 Journée de Support Libre] pour plus d'informations et pour annoncer votre présence à la journée


=== Quelques conseils ===
=== Quelques conseils ===
Ligne 453 : Ligne 444 :
* Ne vous lancez pas tout de suite dans votre projet d'application. Essayez d'abord des exemples, donnez-vous un petit objectif atteignable (e.g. faire marcher un bouton) et gagnez confiance dans la compréhension du code.
* Ne vous lancez pas tout de suite dans votre projet d'application. Essayez d'abord des exemples, donnez-vous un petit objectif atteignable (e.g. faire marcher un bouton) et gagnez confiance dans la compréhension du code.
* Commentez votre code, pas seulement/forcément en fonction de ce que le code fait, mais surtout pour la raison (quelle est l'intention du code?)
* Commentez votre code, pas seulement/forcément en fonction de ce que le code fait, mais surtout pour la raison (quelle est l'intention du code?)
* Référez vous aux concepts constitutifs de la pensée computationnelle (voir [http://tecfa.unige.ch/perso/mafritz/teaching/slides/stic-1-introduction.html#/6 Slide pour l'ex2])
* Référez vous aux concepts constitutifs de la pensée computationnelle
* Par exemple, utilisez <code>console.log("...")</code> pour décomposer votre code et identifier la source du problème. Imaginez d'avoir un bouton qui déclenche une fonction quelconque. Vous cliquez sur le bouton et ça ne marche pas. Votre problème peut-être :
* Par exemple, utilisez <code>console.log("...")</code> pour décomposer votre code et identifier la source du problème. Imaginez d'avoir un bouton qui déclenche une fonction quelconque. Vous cliquez sur le bouton et ça ne marche pas. Votre problème peut-être :
*# Le gestionnaire d'événement associé au bouton ne marche pas
*# Le gestionnaire d'événement associé au bouton ne marche pas
Ligne 461 : Ligne 452 :
var myBtn = document.getElementById("clickMe");
var myBtn = document.getElementById("clickMe");
//Gestionnaire d'événement
//Gestionnaire d'événement
myBtn.onclick = function () {
myBtn.addEventListener(function () {
   //Mettez ici un console.log pour être sûr que votre événement est déclenché
   //Mettez ici un console.log pour être sûr que votre événement est déclenché
   console.log("Le bouton clickMe marche!");
   console.log("Le bouton clickMe marche!");
   //Puis votre fonction quelconque
   //Puis votre fonction quelconque
   doSomething();
   doSomething();
}
});


//Définissez votre fonction
//Définissez votre fonction
Ligne 486 : Ligne 477 :


À ce propos voir : [[Brackets#Debug_JavaScript_.28aide_.C3.A0_la_programmation.29|Débug JavaScript sur la page de Brackets]]
À ce propos voir : [[Brackets#Debug_JavaScript_.28aide_.C3.A0_la_programmation.29|Débug JavaScript sur la page de Brackets]]
Si vous souhaitez un éditeur plus puissant, cette période est la plus indiquée pour faire le switch vers [[Visual studio code]].

Dernière version du 22 octobre 2019 à 17:12

Cette page fait partie des archives des cours Cours STIC (STIC I, STIC II,STIC III,STIC IV)

Introduction

Cet exercice introduit le développement de page/application web interactives avec JavaScript.

Connaissances/compétences envisagées

À l'issue de cet exercice vous devez avoir acquis les connaissances/compétences suivantes :

  • Consolider les bases de la programmation et ses composantes principales (variables, types de données, structure de contrôle, etc.)
  • Avoir des notions de base sur la computation et l'intérêt de l'automatisation
  • Connaître les principes fondamentaux de l'interaction d'un point de vue "bottom-up"
  • Comprendre l'implémentation de JavaScript dans un navigateur web et sur des pages web dynamiques (i.e. modification programmée du DOM) grâce à l'accès à l'objet window et window.document en particulier
  • Identifier des mécanismes de Input/Output et les rapporter à des actions de l'utilisateur, du système, etc.
  • Reconnaître un gestionnaire d'événements et le type d'événement déclencheur
  • Créer des interactions simples à travers la combinaison gestionnaire d'événement + manipulation du DOM

Prérequis

Contenu à maîtriser
Lectures conseillées pour se préparer au cours en présence

La lecture complète et la maîtrise des contenus est prévue pour la période à distance.

Logiciels utilisés pendant l'activité en salle de classe :

Activité en salle de classe

Programme

  • 09:00 - 09:30 : Présentation/Démo JavaScript (fonctionnement du langage)
  • 09:30 - 10:10 : Activité/Workshop JavaScript de base
  • 10:10 - 10:30 : Synthèse sur les principes de base de computation et automatisation des processus
  • -- pause --
  • 11:00 - 11:30 : Démo JavaScript côté-client (interactivité)
  • 11:30 - 12:10 : Activité/Workshop JavaScript côté-client
  • 12:10 - 12:30 : Synthèse sur les principes de base de l'interactivité avec JavaScript

Présentation/Démo JavaScript

  • Retour sur Introduction à la programmation : questions ? remarques ?
  • Brève introduction à JavaScript en tant que langage (histoire, cadre d'utilisation, ...)
    Les trois niveaux du code JavaScript.
  • Live-coding session
    • Le concept de donnée et type de donnée
    • Présentation des caractéristiques du langage (syntaxe)
    • Illustration des composantes principales (cf. Introduction à la programmation)
    • Les Objets natifs
  • Introduction à la console JavaScript (voir plus bas dans le workshop)

Workshop JavaScript de base

Fichiers à télécharger :

Utilisation de la Console JavaScript

Pour tester le code, faites du copier/coller dans la console du navigateur

Pour utiliser la Console :

  • Internet Explorer : Menu Outils > Outils de développement (ou F12)
  • Firefox : le scratchpad (SHIFT F4), sinon la console (F12) qui permet d'entrer une ligne.
  • Chrome : Menu Outils > Console JavaScript (ou F12)
  • Safari : D'abord dans les Options > Avancées cocher la case "Afficher le menu Développement dans la barre des menus", puis CTRL+Alt+I ou CTRL+Alt+C
  • Opera: Menu Page > Outils de Développement > Opera Dragonfly (ou CTRL+Shift+I)
Console des erreurs en Google Chrome

La console JavaScript est un endroit très utile pour tester du code JavaScript pour deux raisons :

  1. On peut saisir directement du code dans la console et l'évaluer. Dans l'image suivante, les lignes précédées par > sont des lignes avec du code, et les lignes précédées par <- proposent le résultat de l'évaluation du code.
    La console du navigateur évalue directement du code.
  2. On peut communiquer avec la Console JavaScript. Par exemple la notation console.log() permet d'écrire un message dans la Console. Pour ceux qui ont utilisé Flash, cette instruction est similaire à la fonction trace() de Flash. Voici un exemple :
    for(var i = 0; i < 5; i++) {
        console.log("Cycle actuel : " + i);
    }
    
    Le résultat de ce script dans la console JavaScript est le suivant :
    La méthode log() de l'objet Console permet d'afficher des messages dans la console JavaScript.

Synthèse des principes de base de computation et automatisation des processus

Programmer signifie traduire les intentions du développeur de manière que la machine les exécutes conformément aux attentes. Adaptation de Denning & Martell (2015, p. 90, Fig. 5-3)
  • Faire le trait d'union entre l'Introduction à la programmation et Computation avec JavaScript
  • Pensée symbolique et processus de traitement de l'information
  • Programme = Algorithme + Données
  • Fonctionnement technique de l'interprète JavaScript
    Lecture du code source du point de vue de l'interprète qui décompose le code source à la recherche de pattern qu'il reconnaît.
  • Avantages de l'automatisation :
    • Rendre les processus plus vite (sur le moyen terme !)
    • Rendre les processus plus fiables (si le code est bon !)
    • Répliquer les processus par d'autres personnes (e.g. problème de réplicabilité des Sciences Sociales)

À retenir, programmer en JavaScript correspond à :

  1. Réduire la complexité d'un problème ou d'un besoin à une suite d'instructions automatisées.
  2. Traduire ces instructions en code JavaScript, afin que l'interprète puisse les computer de manière correspondante aux attentes.

Démo JavaScript côté-client

Fonctionnement de JavaScript côté-client :

Analyse techniques des deux applications pour la lecture présentées en P1 :

  •  : entraînement de la voie d'assemblage (construction des mots à travers le déchiffrage des lettres)
    • L'algorithme permet d'afficher les lettres qui composent un mot à l'inverse, de cette manière on ne peut pas utiliser la forme du mot.
       1 /**
       2  * Code pour construire une simple application interactive qui affiche aléatoirement un mot à l'envers depuis une liste
       3  */
       4 
       5 //Liste de mots
       6 var wordList = [
       7   "maison",
       8   "chien",
       9   "chat",
      10   "avion",
      11   "lettre",
      12   "marionette",
      13   "chaise",
      14   "école",
      15   "mathématique",
      16   "livre",
      17   "français",
      18   "géographie",
      19   "cahier",
      20   "stylo"
      21 ];
      22 
      23 //Fonction pour enverser le mot
      24 function reverseWord(init) {
      25   //Renvoyer le mot inversée en utilisant l'aglorithme que nous avons créé
      26   return init
      27     .split("")
      28     .reverse()
      29     .join("");
      30 }
      31 
      32 //Fonction pour récupérer un mot aléatoire
      33 function getRandomWord() {
      34   var randomIndex = Math.floor(Math.random() * wordList.length);
      35   return wordList[randomIndex];
      36 }
      37 
      38 //Ajouter le gestionnaire d'événement au bouton
      39 document.querySelector("#randomWordBtn").addEventListener("click", function() {
      40   var randomWord = getRandomWord();
      41   var reverse = reverseWord(randomWord);
      42   document.querySelector("#targetWord").textContent = reverse;
      43 });
      
  •  : entraînement de la voie d'adressage (reconnaissance des mots par leur "forme")
    • L'algorithme affiche le mot seulement pour 200ms, de cette manière on n'a pas le temps de construire le mot lettre par lettre.
       1 /**
       2  * Code pour construire une simple application interactive qui affiche aléatoirement un mot à l'envers depuis une liste
       3  */
       4 
       5 //Liste de mots
       6 var wordList = [
       7   "maison",
       8   "chien",
       9   "chat",
      10   "avion",
      11   "lettre",
      12   "marionette",
      13   "chaise",
      14   "école",
      15   "mathématique",
      16   "livre",
      17   "français",
      18   "géographie",
      19   "cahier",
      20   "stylo"
      21 ];
      22 
      23 //Fonction pour récupérer un mot aléatoire
      24 function getRandomWord() {
      25   var randomIndex = Math.floor(Math.random() * wordList.length);
      26   return wordList[randomIndex];
      27 }
      28 
      29 //Ajouter le gestionnaire d'événement au bouton
      30 document.querySelector("#randomWordBtn").addEventListener("click", function () {
      31   //Sélectionner un mot aléatoire
      32   var randomWord = getRandomWord();
      33 
      34   //Associr le mot aléatoire au placeholder
      35   var targetWord = document.querySelector("#targetWord");
      36   targetWord.textContent = randomWord;
      37 
      38   //Afficher le mot s'il est caché
      39   var wordContainer = document.querySelector(".showWord");
      40   wordContainer.style.display = "block";
      41 
      42 
      43   //Démarrer un timer qui cache le mot après 200ms
      44   setTimeout(function () {
      45     wordContainer.style.display = "none";
      46   }, 200)
      47 });
      

Liens vers le repository avec les fichiers des exemples : MALTT-STIC/stic-1-app-examples

Workshop JavaScript côté-client

Fichiers à télécharger :

Utilisation de la Console JavaScript

Utilisez encore une fois la console pour repérer des erreurs. Cela doit devenir une habitude : contrôlez toujours la console lorsque vous testez vos dispositifs !

Synthèse des principes de base de l'interactivité avec JavaScript

Trois caractéristiques d'une application interactive qui utilise une interface utilisateur.
  • Faire le trait d'union entre l'Introduction à la programmation et Interactivité avec JavaScript
  • Interactivité = inputs générés par les utilisateurs
  • Fonctionnement de JavaScript côté-client : l'utilisateur télécharge les instructions avec le contenu de la page
    • JavaScript a accès à la page grâce à l'objet global window et au DOM grâce à l'objet window.document
    • Tout élément d'une page peut être rendu interactif avec la même démarche :
      1. Identifier l'élément parmi tous les éléments
      2. Lui appliquer un gestionnaire d'événements
      3. Appliquer à l'intérieur du gestionnaire une règle qui génère une modification
      Structure d'une interaction, adaptation de What is a microinteraction de Saffer (2014)
  • Possibilité d'animer le DOM (Animation avec JavaScript)
  • Accès à travers le navigateur à d'autres API (e.g. Canvas (HTML5), Géolocalisation, Webcam, ...)
  • Importance du guidage pour suggérer les interactions attendues par l'application et orienter l'attention au(x) bon(s) endroit(s)
    • « Tout le monde sait ce qu’est l’attention. C’est la prise de possession par l’esprit, sous forme claire et vive, de l’un parmi ce qui semble plusieurs objets ou trains de pensée simultanément possibles. La focalisation, la concentration de la conscience, participent de son essence. Elle implique un retrait de certaines choses afin de traiter efficacement les autres (…) » (William James, Principes de psychologie, 1890, p.404).

À retenir :

L'interactivité avec JavaScript consiste dans le changement programmé du DOM à travers les instructions contenues dans un ou plusieurs scripts. Ces changements se reflètent dans la mise à jour de l'interface utilisateur affichée par le navigateur.

Projet 3 / Tâche

Voici de suite la description détaillée de la tâche et le matériel de support à votre disposition pour compléter l'exercice pendant la période à distance.

Lectures et matériel de support

Ces articles proposent les contenus utiles aux finalités pédagogiques du cours. Pour compléter l'exercice ou atteindre les objectifs spécifiques à votre dispositif (voir plus bas), d'autres ressources peuvent être nécessaires.

  •  : aspects théoriques et pratiques, lecture commune avec exercice 4, niveau des exemples à calibrer en fonction de vos besoins et intérêts
  •  : aspects théoriques et pratiques, niveau des exemples à calibrer en fonction de vos besoins et intérêts.

Dispositif

Imaginez un design pédagogique interactif dans lequel l'utilisateur puisse déterminer des modifications par rapport au contenu initial.

  • Créez une page HTML5/CSS qui contient des éléments interactifs (e.g. click, mouseover, etc.)
  • Ajoutez une ou plusieurs manipulations du DOM suite à un événement (e.g. afficher un feedback, remplacer une image, etc.)
  • Le tout doit servir à un objectif déclaré dans votre rapport (pas juste votre objectif d'apprentissage !)

Vous pouvez adapter/revisiter tous les exemples disponibles dans le matériel de support, voir également :

si vous voulez rendre un dessin SVG interactif en continuité avec l'exercice 2. Mais ne répétez pas simplement le principe de la Flash card !

Contraintes

  • Contenu de la page selon vos envies, mais en rapport avec une thématique MALTT
  • Vous devez inclure un fichier JavaScript externe
  • Vous devez créer au moins une action interactive déclenchée par l'utilisateur qui modifie le contenu de la page en modifiant le DOM
    • C'est-à-dire gestionnaire d'événement + règle de comportement + feedback à l'interface
    • Pas de drag&drop (on le verra en P3)
  • Votre code doit contenir au moins l'une de ces caractéristiques (à choix) :
    • Une structure de contrôle de type if... else...
    • La génération d'un élément aléatoire
    • L'utilisation d'une boucle for... ou while
  • Vous pouvez utiliser du clipart (SVG ou autre) fait par d'autres, mais citez la source dans le rapport et dans la page de votre dispositif
  • Vous pouvez vous appuyer sur des exemples vus en cours ou disponibles dans le matériel pédagogique, mais il faudra au moins adapter le code JavaScript (pas simplement changer/adapter le contenu HTML)
  • Vous ne pouvez pas combiner sur la même page les exercices 3 et 4
    • Mais vous pouvez utiliser le même sujet (e.g. mini-site avec deux pages)

Pour les plus ambitieux

En général, si vous maîtrisiez bien JavaScript, concentrez-vous sur les aspects interactifs/ergonomiques/pédagogiques de l'application : il ne suffit pas de savoir coder pour créer un bon dispositif !

Critères d'évaluation

Malus
  • Mauvais liens (fichier JavaScript, CSS)
  • Copier/coller d'un snippet de code présenté au cours ou tiré d'internet sans aucune modification
  • Agencement de la page approximatif
  • Interaction pas claires/pas bien indiquées
Bonus
  • Code bien organisé et "élégant"
  • Documentation du code (raisonnable : pas plus de commentaires que de code...)
  • Utilisation de techniques de programmation (cycles, structure de contrôle, etc.)
  • Indications pertinentes sur les interactions disponibles (e.g. guidage, texte descriptif, ...)
  • Design graphique soigné (e.g. bonne utilisation CSS)
  • Pour une très bonne note : l'application peut être "réutilisable" (e.g. génération aléatoire, bouton "start again", etc.)
    • Essayez d'aller au-delà de "poser une seule question et donner un feedback juste/faux"
    • Dans l'idéale, cherchez d'exploiter la capacité de l'ordinateur à faire des choses automatiques

Rapport

Faites un rapport selon les guidelines habituelles :

En particulier pour cet exercice, essayez d'expliquer :

  • En quoi les interactions que vous avez créées soutiennent vos objectifs d'apprentissage/d'utilisation

Contribution Wiki

Contribution libre comme d'habitude :

Quelques suggestions :

Délai

Dimanche 18 novembre, 21:00

Ressources

Théoriques

Techniques

Exemples

Références de base

Références plus avancées

Bibliographie

Livres pour débutants/intermédiares avec aussi de la théorie (free on the web/pay printable version)
  • Haverbeke, M. (2018). Eloquent JavaScript. A modern Introduction to Programming. Third Edition. San Francisco, CA: No Starch Press. Accès libre depuis internet: http://eloquentjavascript.net/
  • Simpson, K. (2015). You Don’t Know JS: Up & Going. O’Reilly Media. Accès libre à la version non editée de toute la série de livres https://github.com/getify/You-Dont-Know-JS
Livre sur les microinteractions (pas de code)
  • Saffer, D. (2014). Microinteractions. Designing with details. Sebastopol, CA: O’Reilly Media.
Livres sur informatique/codage (pas de code)
  • Denning, P. J., & Martell, C. H. (2015). Great Principles of Computing. Cambridge, MA: MIT press.
  • Petzold, C. (2000). Code. The Hidden Language of Computer Hardware and Software. Redmond, WA: Microsoft Press.

Aide

Discussion de cette page

Utilisez la page discussion de cette page pour poser des questions. Pour insérer un nouveau titre, utilisez simplement le "+".

Important: Si vous cliquez sur l'étoile ("Ajouter cette page à votre liste de suivi"), le wiki vous enverra un mail après chaque modification de la page.

Journée de Support Libre

Exceptionnellement pour cette période, la Journée de Support libre est déplacée d'une semaine. Elle sera donc jeudi 15 novembre.

La présence d'au moins un assistant/moniteur spécifiquement pour STIC est garantie de 10h à 12h s'il y a assez d'étudiants qui ont manifesté leur présence.

Quelques conseils

Voici quelques conseils pour cet exercice :

  • Ne vous lancez pas tout de suite dans votre projet d'application. Essayez d'abord des exemples, donnez-vous un petit objectif atteignable (e.g. faire marcher un bouton) et gagnez confiance dans la compréhension du code.
  • Commentez votre code, pas seulement/forcément en fonction de ce que le code fait, mais surtout pour la raison (quelle est l'intention du code?)
  • Référez vous aux concepts constitutifs de la pensée computationnelle
  • Par exemple, utilisez console.log("...") pour décomposer votre code et identifier la source du problème. Imaginez d'avoir un bouton qui déclenche une fonction quelconque. Vous cliquez sur le bouton et ça ne marche pas. Votre problème peut-être :
    1. Le gestionnaire d'événement associé au bouton ne marche pas
    2. La fonction déclenchée ne marche pas
var myBtn = document.getElementById("clickMe");
//Gestionnaire d'événement
myBtn.addEventListener(function () {
  //Mettez ici un console.log pour être sûr que votre événement est déclenché
  console.log("Le bouton clickMe marche!");
  //Puis votre fonction quelconque
  doSomething();
});

//Définissez votre fonction
function doSomething() {
  //Mettez ici un console.log pour être sûr que la fonction est invoquée
  console.log("doSomething a été invoquée!");
  //suite de votre code...
}

Avec ce type de décomposition vous pouvez savoir si le problème est dans le gestionnaire d'événement ou dans la fonction. Quand tout marche correctement, pensez à enlever les console.log().

Erreurs dans Brackets

À partir de la version 1.11 de Brackets, vous pouvez obtenir des alerts ou des erreurs du type :

  • ERROR: 'document' is not defined. [no-undef]
  • ERROR: 'console' is not defined. [no-undef]

À ce propos voir : Débug JavaScript sur la page de Brackets

Si vous souhaitez un éditeur plus puissant, cette période est la plus indiquée pour faire le switch vers Visual studio code.