75
Architecture(s) et application(s) Web CSC4101 - Interface dynamique côté CSC4101 - Interface dynamique côté navigateur en Javascript navigateur en Javascript 11/10/2021 1

a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

 

Architecture(s) et

application(s) Web

CSC4101 - Interface dynamique côtéCSC4101 - Interface dynamique côté

navigateur en Javascriptnavigateur en Javascript

11/10/2021

1

Page 2: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

  

1. Interfaces dynamiquesInterfaces dynamiques

2

Page 3: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Vues générées côté serveur

3

Page 4: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Vues générées côté client

« HTML dynamique »

4

Page 5: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

</principes>

5

Page 6: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

  

2. JavaScriptJavaScript

6

Page 7: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

JavaScript pour applications Web

JS

Langage de script orienté objet non typéPilier dans la création d’applications Web

Principalement utilisé côté client : interprétépar les navigateurs WebMais peut aussi être utilisé côté serveur(exemple NodeJS)

7

Page 8: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Intérêt d’un script côté navigateur

Améliorer les temps de réponse (exécution côtéclient, pas de latence d’envoi vers le serveur)Contrôler les données des formulaires avant envoivers le serveur (éviter les envois erronés)Réaliser des pages animéesModi�er le contenu, le style de la page courante enfonction des actions de l’utilisateur sur la page

8

Page 9: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Historique

Développé en 1995 par Brendan Eich pourNetscape (nom d’origine LiveScript)Grand succès au début du Web (mais nombreusesincompatibilités entre navigateurs)Nombreuses étapes de standardisationnécessaires

ECMA (European Computer ManufacturersAssociation) a dé�ni le standard ECMAScript

L’arrivée d’AJAX avec le Web 2.0 replaceJavaScript au premier plan

9

Page 10: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Principes de base

Un noyau (le cœur du langage)des opérateurs, des structures, des objetsprédé�nis (Date, Array…)

Un ensemble d’objets associés au navigateurfenêtre (window), document (document),formulaire (form), image (image)…

Gestion des événementsCapter les évènements : clics, déplacement dela souris, chargement de la page …Associer des fonctions aux événements

10

Page 11: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Plate-forme

L’interface DOM (Document Object Model)standardise les méthodes pour accéder par objetsaux documents

Nombreuses bibliothèques (frameworks) aident àprogrammer.

Ex: Dojo, Rialto, Angular, JQuery, Yui…

« bytecode » pour programmer à un plus hautniveau, dans un langage compilé en JS : TypeScript,…

11

Page 12: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

JSON (JavaScript Object Notation) utilise la notationdes objets JavaScript pour transmettre del’information structurée{ "nationalTeam":"Norway", "achievements":[ "12 Olympic Medals", "9 World Championships", "Winningest Winter Olympian", "Greatest Nordic Skier" ], "name":"Bjoern Daehlie", "age":41, "gender":"Male" }

12

Page 13: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Utilisation

13

Page 14: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Intégration dans pages HTML

Code JS contenu ou référencé dans balises<script> et </script>

Soit directement :

Soit dans un �chier séparé (ou URL externe) :

<head> <script> code javascript (fonctions, variables...) </script> </head>

<head> <script src="monprog.js"></script> </head>

14

Page 15: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Appel des fonctions JavaScript

à partir d’évènements dans les balises

à partir d’un lien

par d’autres fonctions

<input type="button" onClick="alert('clic sur bouton');">

<a href="javascript:affiche(menu);">

function hello() { alert("hello"); }

15

Page 16: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Gestion d’événements

Chaque événement a un traitement par défautOn peut associer une fonction à un évènement,pour l’exécuter avant traitement par défaut

Si retourne faux (false), alors traitement pardéfaut pas exécutéSi retourne vrai (true), alors traitement pardéfaut exécuté ensuite

Association fonction à évènement utilise un mot-clef de type « onEvent » (onClick, onLoad,

onChange, onMouseOver, onMouseOut,

onKeyDown…)16

Page 17: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemples de ré�exes

clic sur bouton :

déplacement souris au-dessus :

�n de chargement du document :

<input type="button" name="surface" value="Surface" onClick="Test(all);">

<a href="menu.html" onMouseOver="affiche();">

<body onLoad="init(1);">

17

Page 18: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemples évènements / balises

Evénements Balises Fonctions

onBlur * désélection

onChange idem modi�cation

onFocus idem sélection

onSelect password, text, textarea sélection devaleur

onClick a href, button, checkbox, radio, reset,submit

clic

onMouseover a href, area souris pointe

onLoad body chargementpage

onSubmit form soumission

18

Page 19: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemple de gestion d’événements<html> <head> <script language="JavaScript"> function maFonction() { alert('Vous avez cliqué sur le bouton GO'); } function autreFonction() { alert('Cliqué sur le lien "Cliquer ici"'); } </script> </head> <body> <ol> <li>Appel sur évènement : <input type="button" value="GO" onClick="maFonction();"> </li> <li>Appel sur un lien : <a href="javascript:autreFonction();">Cliquer ici</a> </li> </ol> <a href="javascript:history.go(-1);">Retour</a> </body> </html>

19

Page 20: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Objets JavaScript

JavaScript a des types primitifs et des objetsTypes primitifs créés par affectation directeUtilisation d’objets

Instanciation par un constructeurSyntaxe à la java :

Accès aux attributs :monObjet.attributs

Accès aux méthodes :monObjet.méthode()

Modèle objet beaucoup moins strict que Java

20

Page 21: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemple// Création d'une variablevar etienne = { nom : "etienne"; branche : "marketing"; } // Création d'un objet par constructeurfunction Employe (nom,branche) { this.nom = nom; this.branche = branche; this.fullDescription = function () { return this.nom + " " + this.branche; }; } var marc=new Employe("marc","informatique"); marc.fullDescription(); // appel de méthodes

21

Page 22: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Objets prédé�nis 1/2

Les objets du noyau

Object : création d’un objet

Function : création d’une fonction

Array : création d’un tableau

String : création d’une chaîne de caractères

Number : création d’un nombre

Date : création d’une date

Math : création d’un objet mathématique

etc.

22

Page 23: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Objets prédé�nis 2/2

Les objets du navigateur :

fenêtre,document,formulaires…

23

Page 24: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Hiérarchie des objets du navigateur

Un navigateur (objet navigator),Contient une fenêtre (window),

Qui contient son document HTML(document),

ses formulaires (form[]), ses images(image[]), ses liens (link[])…

Un formulaire contientdes boutons (button[]),des listes déroulantes (select[])

qui contiennent des options (option[])etc.

24

Page 25: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Attributs et méthodes

Les attributs d’un objet correspondent auxattributs des balises HTML (par exemple height,width, name, src … pour l’objet image)Les méthodes correspondent aux fonctionnalitésdu navigateur (par exemple back, forward, go pourl’historique (history))Certains attributs et méthodes sont communs à unensemble d’éléments

25

Page 26: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Mise au point

Délicate avec les langages interprétés car :

Les erreurs n’apparaissent qu’à l’éxécutionPar défaut, les erreurs ne sont pas af�chées

26

Page 27: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Outil : console JS

console de développement du navigateurPossibilités variables selon les navigateursIndication des erreurs de syntaxeInspection du contenu des variablesDébogueur, points d’arrêt, af�chage desvariables

Af�chage d’informations sur la console :Af�chage des erreurs de syntaxe éventuellesPar programme avec la fonctionconsoleLog(« message  »+variable)

27

Page 28: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

</JavaScript>

28

Page 29: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

  

3. Manipulation du DOMManipulation du DOM

29

Page 30: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

DOM

Document Object Model (Modèle Objet du Document)

Modèle de la structure des documents HTMLInterface de programmation standardisée par leW3C (API DOM)Implémentée par les navigateurs avec plus oumoins d’extensionsRéférences :

spéci�cations du ,le DOM Gecko ( )

W3CMozilla

30

Page 31: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemple d’arbre DOM

<html> <head> ... </head> <body> <h1>DOM</h1> <div id='main'> <p name="p1">Le DOM trop top</p> <p class="p2">DOM API</p> </div> <h2>Exemples</h2> </body> </html>

31

Page 32: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Manipulation

Le DOM offre un ensemble de méthodes deparcours de l’arbre pour accéder et/ou modi�erson contenu

ajouter des élémentssupprimer des élémentsajouter et/ou modi�er des attributsetc.

32

Page 33: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemple d’utilisation du DOM

Le DOM comporte de nombreuses méthodes pouraccéder à un élément, de différentes façons :

par son identi�ant : <div id="intro">par sa position dans l’arbre : (�ls, parent…)par son type : ensemble des paragraphes, desniveaux h2, …

33

Page 34: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Utilité

Modi�er l’apparencePar exemple, changer dynamiquement le lien(attribut class) avec des dé�nitions de feuilles de

style : interfaces réactivesExemple : masquage, démasquage des slides dans

, utilisé pour les diapos projetées en CMreveal.js

34

Page 35: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

</manipulation_DOM>

35

Page 36: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

  

4. FrameworkFramework JavaScript JavaScript JQueryJQuery

36

Page 37: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Avantages d’un FrameWork

Faciliter la tâche des développeurs.

Il existe un grand nombre de frameworksLequel choisir ? éviter d’en utiliser plusieurs dansune même aplicationCritères de choix : les performances, lesfonctionnalités, le poids, la commmunauté, etc.Il existe une page de comparaison sur Wikipédia :http://en.wikipedia.org/wiki/Comparison_of_JavaScr

37

Page 38: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

jQuery

Bibliothèque des plus populaires et des plusutiliséesUtilisable avec tous les navigateurs pour unrésultat identique (avant la standardisation)

https://jquery.com/

38

Page 39: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Caractéristiques

Slogan : « write less, do more » : écrire moins pourfaire plusFacilité d’apprentissageSimpli�cation de la programmation JavaScriptEncapsulation des actions courantes dans desméthodes, ce qui réduit le code à écrireSimpli�cation de certaines tâches comme lamanipulation du DOM ou la programmation AJAX

39

Page 40: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Fonctionnalités

Accéder aux objets HTML/DOMManipuler les styles CSSGérer les évènementsRéaliser des effets et des animationsProgrammer avec AJAXetc

jQuery dispose aussi d’extensions sous forme de plugins

40

Page 41: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Utiliser JQuery dans les pages HTML

télécharger depuis jQuery.com et inclure en local

ou référencer sur serveur de contenu externe, p. ex. CDN (Content Delivery Network) Google

Attention : traçage des utilisateurs

<head> <script src="jquery-1.9.1.min.js"></script> </head>

<head> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.m </script> </head>

41

Page 42: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Programmation « événementielle »

1. Le navigateur (lui-même), ou les interactions del’utilisateur déclenchent des événements

2. les événement déclenchent l’exécution d’actionssur les objets du programme (dont le DOM).

42

Page 43: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Structure générale des programmes

1. Sélectionner des éléments du DOM HTML :générer des objets javascript qui les représentent

2. Installer des gestionaires d’événements / actionssur ces éléments : ces gestionnaires sont desfonctions

43

Page 44: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Syntaxe de base

Syntaxe de base jQuery :

Le caractère $ précise une « référence » à

jQueryLe sélecteur (selector) permet de

sélectionner un (ou plusieurs) élément(s)HTMLL’action (action) est exécutée sur chaque

élément sélectionné

$(selector).action(...)

44

Page 45: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Actions

Actions immédiates : changer l’état d’un élémentdu DOM. Exemple :

Mise en place de ré�exes (callbacks) sur desévénements (actions différées) :

$(this).hide() // cacher l'élément courant

$('#bouton1').click(function() { // actions à faire lors d'un clic sur le bouton //... });

45

Page 46: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Point d’entrée du code

Pour éviter que nos actions jQuery s’exécutent surdes objets non encore chargés, jQuery permet dene démarrer le tout qu’une fois reçu l’évènement« document ready » :$(document).ready(function(){ // code jQuery... });

46

Page 47: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

il existe aussi une écriture simpli�ée équivalentemais un peu moins « lisible » :$(function(){ // code jQuery... });

47

Page 48: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemples sélecteurs JQuery

l’élément courant$(this)

le nom de la balise$("p"), pour tous éléments <p>

l’identi�ant$("#id1") : l’élément ayant l’identi�ant id1

la classe$(".test") tous éléments ayant attribut class

test

Même syntaxe que les sélecteurs CSS48

Page 49: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

</JQuery>

49

Page 50: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

  

5. AJAXAJAX

50

Page 51: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

AJAX ?

51

Page 52: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

AJAX

Asynchronous JavaScript And XML

Ne plus lire l’acronyme littéralement (XML)AJAX signi�e qu’on intègre différentestechnologies

centrées sur Javascriptrequêtes HTTP asynchrones vers serveurs

Traitement de données supplémentairesrécupérées sur serveur(s)Exemple : construction progressive d’unformulaire en fonction des réponses del’utilisateur.

52

Page 53: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Classe XMLHttpRequest (XHR) de

JavaScript

Élément clef de la technologie AJAXCréé en 1999 par Microsoft comme objet ActiveXIntégré comme objet JavaScript par Mozilla.Création : new XMLHttpRequest();

Ensuite, utilisation comme tout objet via sespropriétéset/ou ses méthodes

Alternative avec jQuery (voir plus loin)

53

Page 54: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Principe de fonctionnement

Un évènement (clic, saisie de texte…) provoquel’exécution d’une fonction JavaScriptCette fonction

1. instancie un objet XMLHttpRequest

2. transmet sa requête HTTP à un serveur (GET

d’un document ou POST de données, ou …)

3. récupère la réponse lorsque celle-ci estdisponible (asynchrone)

4. met à jour la partie concernée de la pagecourante (un champ de saisie, une division…)

54

Page 55: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Sous-requêtes HTTP

55

Page 56: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Utilisation d’AJAX avec jQuery

L’utilisation de jQuery permet de faciliter l’écriturede programmes AJAX avec la fonction :

$.ajax()

56

Page 57: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

En paramètres la description de la requête (objetau format JSON) :

url : dé�nit l’URL de la requête

type : précise la méthode (GET ou POST)

data : précise les données à envoyer si POST

success : dé�nit traitement à effectuer si

requête réussit (fonction)error : dé�nit traitement à effectuer si

requête échoue (fonction)

57

Page 58: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemple//... $.ajax( { url: "test.php", error: function(resultat, statut, erreur) { // ... } success: function(resultat, statut) { // ... } } );

58

Page 59: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Exemple d’application

Construction de formulaires dynamiques avec Symfony

59

Page 60: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

</AJAX>

60

Page 61: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Take awayTake awayJavaScript (programmation événementielle)manipulation du DOMJQuery

Sélecteurs similaires à ceux de CSSAJAX : requêtes asynchrones

61

Page 62: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Ensuite…Ensuite…

62

Page 63: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

TP n°10

Formulaires dynamiques

63

Page 64: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Formulaire CRUD des projets

64

Page 65: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Formulaire « tout-en-un » :Nouveau Projet

Liste de tâchesCréation / modi�cation en une seule foisNombre de tâches quelconque

65

Page 66: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Principe

Gestionnaire de formulaire (ProjectType)

Modèle de formulaire prêt-à-l’emploi« embarqué » dans le HTML

Code JS pour ajout/suppression sous-formulairedes tâches (TodoType)

66

Page 67: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

ProjectType<?php //... class ProjectType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $optio { $builder ->add('title') ->add('description') ->add('todos', CollectionType::class, array( 'entry_type' => TodoType::class, 'entry_options' => array('label' => false), 'allow_add' => true, 'by_reference' => false, 'allow_delete' => true, ))

67

Page 68: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Twig

templates/project/_form.html.twig

{{ form_start(form) }} {{ form_row(form.title) }} {{ form_row(form.description) }} <h3>Tasks</h3> <ul class="todos" data-prototype="{{ form_widget(form.todos.vars.prototype)|e('html {# passer en revue chaque todo existante pour afficher ses champs {% for todo in form.todos %} <li>{{ form_row(todo.title) }}<br/> {{ form_row(todo.completed) }}</li> {% endfor %} </ul> <button class="btn">{{ button_label|default('Save') }}</button> {{ form_end(form) }}

68

Page 69: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

HTML

<ul data-prototype=" vaut

form_widget(form.todos.vars.prototype)

encodé

<form name="project" method="post"> ... <h3>Tasks</h3> <ul class="todos" data-prototype="&lt;div&#x20;id&#x3D;&quot;project_to <!-- rien ici --> </ul> <button class="btn">Save</button> ...

69

Page 70: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

<ul data-prototype=" /

form_widget(form.todos.vars.prototype)

en clair :<div id="project_todos___name__"> <div class="form-group"> <label for="project_todos___name___title">Title</label> <textarea id="project_todos___name___title" name="project[todos][__name__][title]" class="form-control"></textarea> </div> <div class="form-group"> <div class="form-check"> <input type="checkbox" id="project_todos___name___completed" name="project[todos][__name__][completed]" class="form-check-input" value="1" /> <label class="form-check-label" for="project_todos___name___completed">Completed</label> </div> </div> </div> 70

Page 71: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

JS (JQuery)var $collectionHolder; //setup an "add a todo" linkvar $addTodoButton = $('<button type="button" class="add_todo_link"> Add a task</button>'); var $newLinkLi = $('<li></li>').append($addTodoButton); jQuery(document).ready(function() { // Get the ul that holds the collection of todos $collectionHolder = $('ul.todos'); // add the "add a todo" anchor and li to the todos ul $collectionHolder.append($newLinkLi); $addTodoButton.on('click', function(e) { // add a new todo form (see next code block) addTodoForm($collectionHolder, $newLinkLi); }); });

71

Page 72: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

function addTodoForm($collectionHolder, $newLinkLi) { // Get the data-prototype explained earlier var prototype = $collectionHolder.data('prototype'); var newForm = prototype; // You need this only if you didn't set 'label' => false in your tags // Replace '__name__label__' in the prototype's HTML to // instead be a number based on how many items we have // newForm = newForm.replace(/__name__label__/g, index); // Replace '__name__' in the prototype's HTML to // instead be a number based on how many items we have newForm = newForm.replace(/__name__/g, index); // Display the form in the page in an li, before the "Add a task" lin var $newFormLi = $('<li></li>').append(newForm); $newLinkLi.before($newFormLi); }

72

Page 73: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

PostfacePostface

73

Page 74: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

Crédits illustrations et vidéos

Logo JQueryIllustration « When you say AJAX » (auteur inconnu)- source : https://9gag.com/gag/6304578/when-you-say-ajax

74

Page 75: a p p l i c at i on(s) We b A rc h i t e c t u re (s) et

CopyrightCopyrightDocument propriété de ses auteurs et de TélécomSudParis (sauf exceptions explicitementmentionnées).Réservé à l’utilisation pour la formation initiale àTélécom SudParis.

75