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

Preview:

Citation preview

 

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

  

1. Interfaces dynamiquesInterfaces dynamiques

2

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

3

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

« HTML dynamique »

4

</principes>

5

  

2. JavaScriptJavaScript

6

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

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

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

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

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

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

Utilisation

13

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

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

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

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

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

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

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

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

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

Objets prédé�nis 2/2

Les objets du navigateur :

fenêtre,document,formulaires…

23

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

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

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

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

</JavaScript>

28

  

3. Manipulation du DOMManipulation du DOM

29

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

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

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

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

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

</manipulation_DOM>

35

  

4. FrameworkFramework JavaScript JavaScript JQueryJQuery

36

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

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

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

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

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

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

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

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

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

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

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

47

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

</JQuery>

49

  

5. AJAXAJAX

50

AJAX ?

51

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

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

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

Sous-requêtes HTTP

55

Utilisation d’AJAX avec jQuery

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

$.ajax()

56

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

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

58

Exemple d’application

Construction de formulaires dynamiques avec Symfony

59

</AJAX>

60

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

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

61

Ensuite…Ensuite…

62

TP n°10

Formulaires dynamiques

63

Formulaire CRUD des projets

64

Formulaire « tout-en-un » :Nouveau Projet

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

65

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

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

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

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

<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

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

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

PostfacePostface

73

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

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

Recommended