[PDF] M1IF03 Conception dApplications Web





Previous PDF Next PDF



Tout-sur-le-Javascript.pdf

17 juil. 2010 ... le tuto de M@teo sur les sites Web. Le JavaScript est en effet un langage qui dépend du (x)HTML. ... lien vers le site du zéro -->.



SupMTI

12 août 2011 Le Javascript "dans la page" . ... Zéro mais pas tous (il n'est pas possible de tout mettre en ligne il y a trop d'exemples).



Découvrez le langage JavaScript

Le JavaScript est donc devenu un acteur majeur dans la création de sites web. Il a vu le jour puisqu'il est le créateur du Site du Zéro OpenClassrooms.



Simplifiez vos développements JavaScript avec jQuery

10 oct. 2012 À l'image suivante par exemple le fichier est déplacé dans le dossier dataSite du ZérojQuerydev. Partie 1 : Introduction à jQuery.



M1IF03 Conception dApplications Web

asynchrone AJAX ? Page 10. Asynchronous Javascript And XML (AJAX). Exemple de code : création 



Le blog OpenClassrooms

Résumé. Ce Livre du Zéro présente la programmation en JavaScript l'un des langages du Web le plus utilisé au monde. Les auteurs détaillent comment 



Cours - TD - TP de SQL

Le code JS qui s'ajoute à la page HTML dans une balise <script>. trouve un pdf et des exemples JavaScript ES6 Python et Java. • Les grands framework JS ...



Un site dynamique avec PHP ! - Le Site du Zéro

28 oct. 2005 http://www.siteduzero.com/tuto-29-4-0-un-site-dynamique-avec-php.html ... code javascript qui affiche une boîte de dialogue (très gênant) ou ...



RECOMMANDATIONS POUR LA MISE EN ŒUVRE DUN SITE

28 avr. 2021 le style (CSS) et la logique (JavaScript) d'une page web afin de réduire ... audio et vidéo des contenus embarqués type PDF et des fontes;.

CONCEPTION ET DÉVELOPPEMENT

CLIENT

LIONEL MÉDINI

NOVEMBRE 2021

M1IF03

Plan du cours

yAsynchronousJavascriptAnd XML (AJAX) {Mécanismes de requêtes asynchrones {Quelques patterns de conception en AJAX {Considérations de sécurité yFetchAPI yOutils de conception et de développement {jQuery {jQuery UI ySingle-Page Application yConclusion

Introduction

yObjectif : concevoir des applications Web "riches» {Web-based

ÙParadigme client-serveur, HTTP

ÎProgrammation côté serveur et côté client {Expérience utilisateur proche des applications natives ÙInterface utilisateur fluide, ergonomique, dynamique

ÎÉchanges client-serveur asynchrones (AJAX)

{Logique métier complexe ÙOutils "évolués» de modélisation, conception, développement ÎHG( 322 80I GHVLJQ SMPPHUQV PpPORGHV MJLOHV ;3" ÎOù placer la logique métier ? La couche données ?

AsynchronousJavascriptAnd XML (AJAX)

{Côté serveur

ÙRessources statiques

|Modèle de document, bibliothèques de scripts, feuilles de style ÙTraitements dynamiques des données (couche métier) {Côté client

ÙGestion des événements utilisateur

HTTP, (X)HTML

AsynchronousJavascriptAnd XML (AJAX)

{Côté serveur

ÙRessources statiques

|Modèle de document, bibliothèques de scripts, feuilles de style ÙTraitements dynamiques des données (couche métier) {Côté client ÙContrôleurs délégués relatifs à un type de vue

ÙGestion des événements utilisateur

ÙTraitement des données reçues (couche métier)

HTTP, XML, JSON

AsynchronousJavascriptAnd XML (AJAX)

yGénéralités sur AJAX {Applications web avec interface utilisateur {Déporter un maximum de code sur le client ÙRéduction des ressources consommées côté serveur

ÙRéduction de la bande passante réseau

{Applications Web AJAX les plus connues

ÙGoogle (Mail, Map, Earth"

ÙSuggestions automatiques

ÙTraitement de texte

{Exemple

AsynchronousJavascriptAnd XML (AJAX)

yFonctionnement {Requête asynchrone au serveur dans une fonction JavaScript (déclenchée par un événement quelconque) {Transfert asynchrone de données en XML {Traitement dynamique côté client Ù$IILŃOMJH LQŃOXVLRQ MX GRŃXPHQP +70I PUMQVIRUPMPLRQ ;6I7" ÙLogique applicative (fonctions JavaScript dédiées) ySpécificité de la technologie AJAX {Requête asynchrone sur un document XML viaun

ÙObjet XMLHttpRequest(Mozilla)

ÙContrôle ActiveX XMLHTTP (IE)

AsynchronousJavascriptAnd XML (AJAX)

yFonctionnement

ÙEnvoi de la requête

|Créer un objet requête |Spécifier les éléments de la requête

‡URL, méthode , headers HTTP, paramètres

ÙRéception de la réponse

"ready» |Traiter les données reçues

AsynchronousJavascriptAnd XML (AJAX)

yFonctionnement asynchrone AJAX ?

AsynchronousJavascriptAnd XML (AJAX)

var req= null; functiongetRequest() if (window.XMLHttpRequest) req= new XMLHttpRequest(); elseif (typeofActiveXObject!= "undefined") req=new ActiveXObject("Microsoft.XMLHTTP"); return req;

Safari / Mozilla

Internet Explorer

AsynchronousJavascriptAnd XML (AJAX)

yExemple de code : chargement asynchrone functionGetDataUsingAJAX(HttpMethod, url, params, elt) if(req!= null) // méthode avec paramètres req.onreadystatechange= function() {stateChange(elt)}; // méthode sans paramètre // req.onreadystatechange= stateChange; req.open(HttpMethod, url,true); req.setRequestHeader("Accept", "application/xml"); req.send(params);

Association

de callback aux changements réponse

AsynchronousJavascriptAnd XML (AJAX)

functionstateChange(elt) if(req.readyState== 4){ if (req.responseXML!= null) { var docXML= req.responseXML; } else{ var docXML= req.responseText; docXML=parseFromString(docXML); var docXMLresult= traiteXML(docXML); var str= (new XMLSerializer()).serializeToString(docXMLresult); document.getElementById(elt).innerHTML+= str;

READY_STATE_COMPLETE

AsynchronousJavascriptAnd XML (AJAX)

yExemple de code : transformation XSLT //Après chargement asynchrone des documents XML et XSLT functiontransformXSLT (XMLDoc, XSLDoc, id) if(XMLDoc== null|| XSLDoc== null) {return;} try{ if (window.ActiveXObject) var target= document.getElementById(id); target.innerHTML= xml.transformNode(xsl);

Internet Explorer

AsynchronousJavascriptAnd XML (AJAX)

yExemple de code : transformation XSLT } elseif (window.XSLTProcessor) { var fragment; var xsltProcessor= new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); fragment = xsltProcessor.transformToFragment(xml, document); var target= document.getElementById(id); target.appendChild(fragment); } catch (e) { return e;

Safari / Mozilla

AsynchronousJavascriptAnd XML (AJAX)

yImplémentation de la logique applicative ÙRéécriture de fonctionnalités existantes ÙMélange de la logique métier et des fonctionnalités techniques

ÙRéutilisabilité moyenne

ÙCode parfois un peu "fouillis»

ÙLangages / IDE spécifiques (ou plugins de votre IDE préféré)

ÙLirairies/ frameworksopen source

AsynchronousJavascriptAnd XML (AJAX)

yImplémentation de la logique applicative {Standardisation de la communication avec les langages de programmation côté serveur : JSON ÙSpécification liée à ECMAScript±RFC 4627

ÙImplémentée par tous les navigateurs

ÙPermet de sérialiser des types de données (alternative à XML) ÙDéfinit des types de données de façon simple ÙIndépendant du langage de programmation utilisé ÎPermet les échanges de données entre serveur et client

ÙSyntaxe : des inclusions

S QRPPHPNUH1 YMOPHPNUH1 QRPPHPNUH2 YMOPHPNUH2 " `

L YMOHXU1 YMOHXU2 YMOHXU3 "@

AsynchronousJavascriptAnd XML (AJAX)

yImplémentation de la logique applicative {Standardisation de la communication avec les langages de programmation côté serveur : JSON

ÙExemple de fichier

au format JSON :

ÙEquivalence en XML :

{Source : http://www.xul.fr/ajax-format-json.html { "menu": "Fichier", "commandes": [ { "title": "Nouveau", "action":"CreateDoc" }, { "title": "Ouvrir", "action": "OpenDoc" }, { "title": "Fermer", "action": "CloseDoc" } ] } Fichier Nouveau</value> <action>CreateDoc</action> </item> <item> <title>Ouvrir</value> <action>OpenDoc</action> </item> <item> <title>Fermer</value> <action>CloseDoc</action> </item> </commands> </root>² <h3>AsynchronousJavascriptAnd XML (AJAX)</h3> yImplémentation de la logique applicative {Standardisation de la communication avec les langages de programmation côté serveur : JSON <h3>ÙUtilisation côté client :</h3> ÙUtilisation côté serveur : librairies ad hoc req.open("GET", "fichier.json", true); // requête i var doc = JSON.parse(req.responseText); // récupération i var nomMenu= document.getElementById('jsmenu'); // recherche nomMenu.value= doc.menu.value; // assignation i doc.commands[0].title// lire la valeur "title" dans le tableau doc.commands[0].action // lire la valeur "action" dans le tableau <h3>AsynchronousJavascriptAnd XML (AJAX)</h3> yQuelques règles de conception en AJAX {Utiliser des design patterns <h3>ÙAdaptateur</h3> |Le plus utilisé |7HVPH] OM IRQŃPLRQQMOLPp j XPLOLVHU SMV OH QMYLJMPHXU" <h3>ÙMVC</h3> |De préférence type 2 (avec contrôleurs délégués) |Isoler les parties du modèle |Répartir les traitements de chaque partie entre serveur et client |Indiquer à la vue comment restituer les objets du modèle <h3>ÙObservateur</h3> |Permet de définir un modèle événementiel |Si celui de JavaScript est insuffisant |Il en existe plusieurs dans des librairies open source (W3C) <h3>AsynchronousJavascriptAnd XML (AJAX)</h3> yAJAX a aussi ses inconvénients {Toute une application dans la même page <h3>ÙBouton "Back» inutilisable</h3> ÙDéfinition de bookmarks sur une vue particulière impossible {Génération dynamique des contenus ÙIndexation par des moteurs de recherche impossible {Téléchargement du code applicatif sur le client {Complexité des développements ÙAppropriation et utilisation des différentes technos parfois coûteuse Source : http://dico.developpez.com/html/1710-Internet-Ajax-Javascript-Asynchrone-et-XML.php <h3>AsynchronousJavascriptAnd XML (AJAX)</h3> ySécurité {Déporter de la logique applicative sur le client présente des risques {Remarque ayant délivré le script est impossible (en principe) |la partie applicative tournant sur le client est-elle réellement celle envoyée par le serveur ? <h3>ÎDouble validation (mots de passe)</h3> <h3>AsynchronousJavascriptAnd XML (AJAX)</h3> ySécurité <p>ÙCross-site scripting(XSS)http://cwe.mitre.org/top25/index.html#CWE-79https://www.owasp.org/index.php/XSS</p> |violation de la same-originpolicy |exemple: injection de scripts dans les commentaires des forums ÎRevenir au HTML de base pour les données sensibles ÎVérifier le contenu saisi par les utilisateurs <p>ÙCross-site requestforgery(CSRF)http://cwe.mitre.org/top25/index.html#CWE-352https://www.owasp.org/index.php/CSRF</p> <h3>FetchAPI</h3> yPrincipe {Fournir des primitives de plus haut niveau que <h3>XmlHttpRequest</h3> {Accepter les réponses streamées("chunked») {Récupérer du texte ou du JSON (pas de XML) ÎEncapsuler les requêtes asynchrones dans des promesses yExemple (simple) fetch('./monUrl/quiRenvoie/du.json') .then(res=> res.json()) .then(json=> console.log(json)); <h3>FetchAPI</h3> yLa méthode fetch() {Seul paramètre obligatoire : URL {Remarque : il faut explicitement autoriser fetch()à envoyer des credentialsŃRRNLHV" fetch(url, { method: "POST", // *GET, POST, PUT, DELETE, etc. mode: "cors", // no-cors, cors, *same-origin cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached credentials: "same-origin", // include, *same-origin, omit headers: { "Content-Type": "application/json; charset=utf-8", redirect: "follow", // manual, *follow, error referrer: "no-referrer", // no-referrer, *client body: JSON.stringify(data), // body data type must match "Content-Type" header <h3>FetchAPI</h3> yLa méthode fetch() {Renvoie une réponse ÙQui peut être wrappéedans différents formats (en fonction du Content-Type) <h3>ÎIl faut tester le code de retour HTTP</h3> {La valeur de retour est une promesse <h3>FetchAPI</h3> yExemple de réponse <h3>FetchAPI</h3> yGestion des erreurs {fetch()lève une erreur en cas de : <h3>ÙProblème réseau</h3> ÙRéponse non conforme au résultat attendu (parsingJSON) fetch(https://maRessourceCORS/', {mode: 'cors'}) .then(response=> { if(response.ok) { return response.text(); } throw new Error('ErreurHTTP : ' + response.status); .then(text=> { console.log('Corps de la réponse :', text); }) .catch(error=> { console.log('Erreur dans la réception de la requête : ', error); <h3>FetchAPI</h3> yRéférences {Spec <h3>Ùhttps://fetch.spec.whatwg.org/</h3> {Tutos <h3>Ùhttps://developer.mozilla.org/en-</h3> <h3>US/docs/Web/API/Fetch_API/Using_Fetch</h3> n-to-fetch Outils d'aide à la programmation côté clientquotesdbs_dbs1.pdfusesText_1</div> <style> .ahover:hover{ background:#efefef; } </style> <div style="padding:5px; font-size:22px;"> <a href="https://pdfprof.com/PDFV2/Documents1/29971/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] jazz improvisation pdf</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29972/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] jb say</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29975/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je fabrique mes cosmétiques de sylvie hampikian pdf</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29976/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je m'exerce ce2 pdf</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29977/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je m'exerce cm1 pdf</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29979/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je m'exerce cp pdf</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29982/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je m'exprime 4am page 16</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29984/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je me prépare au brevet 4am page 187</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29986/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je mémorise et je sais écrire des mots ce2 progression</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29987/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je monte mon label pdf</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29988/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je n'ai pas de numéro de sécurité sociale</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29989/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je précise les dates de mon séjour en france</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29990/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je prends bonne note de votre mail</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29992/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je prends bonne note synonyme</a><br/><br/> <a href="https://pdfprof.com/PDFV2/Documents1/29994/25" style="font-size:27px;padding:0.5%;border:1px solid #aaa;width:99%;display:block;" class="ahover">[PDF] je soussigné docteur atteste que l'état de santé de</a><br/><br/> </div> </div> </div> <div class="left"> <br/> <div style="width:100%;padding:2px;"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1570187411384203" crossorigin="anonymous"></script> <!-- Responsive1 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1570187411384203" data-ad-slot="2836242943" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <br/> <br/> <br/> <br/> <div style="background:#efefef;"><br/></div> </div> <div> <style> .exit-intent-popup { position: fixed; top: 0; left: 0; bottom: 0; right: 0; z-index: 1; background: rgba(33, 33, 33, 0.8); transform: translateY(60%) scale(0); transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1); } .exit-intent-popup.visible { transform: translateY(0) scale(1); } .newsletter { position: absolute; top: 20%; left: 20%; transform: translate(-20%, -20%); } /* Popup-specific styles */ .newsletter { background: #FFF; padding: 10px; border-radius: 3px; } .close { position: absolute; top: 10px; right: 10px; cursor: pointer; width: 20px; height: 20px; font-size:18px; } </style> <link rel="stylesheet" href="popup.css" /> <div class="exit-intent-popup"> <div class="newsletter"> <span>Nous vous remercions chaleureusement pour votre soutien et votre générosité.</span><br/> <br/> <img src="https://pdfprof.com/PDFV2/6oB.gif" style="max-width:100%;"/> <div style="width:100%;"> <a href="https://www.facebook.com/sharer/sharer.php?u=https://pdfprof.com/PDFV2/Documents1/29970/25/6" rel="nofollow" target="_blank" style="margin-right: 5px; background: #03A9F4; color: white; padding: 1%; font-size:15px; width:46%; ">Share on Facebook</a> <a href="https://api.whatsapp.com/send?text=je+soussign%C3%A9+docteur+atteste+que+l%27%C3%A9tat+de+sant%C3%A9+de+Download+From++-+https%3A%2F%2Fpdfprof.com%2FPDFV2%2FDocuments1%2F29970%2F25%2F6" rel="nofollow" target="_blank" style="background: #4CAF50; color: white; padding: 1%; width:48%; font-size:15px;">Share on Whatsapp</a> </div> <br/> <span class="close">x</span> </div> </div> <script> /* const CookieService = { setCookie(name, value, days) { let expires = ''; if (days) { const date = new Date(); date.setTime(date.getTime() + (days * 12 * 60 * 60 * 1000)); expires = '; expires=' + date.toUTCString(); } document.cookie = name + '=' + (value || '') + expires + ';'; }, getCookie(name) { const cookies = document.cookie.split(';'); for (const cookie of cookies) { if (cookie.indexOf(name + '=') > -1) { return cookie.split('=')[1]; } } return null; } }; const exit = e => { const shouldExit = [...e.target.classList].includes('exit-intent-popup') || // user clicks on mask e.target.className === 'close' || // user clicks on the close icon e.keyCode === 27; // user hits escape if (shouldExit) { document.querySelector('.exit-intent-popup').classList.remove('visible'); } }; const mouseEvent = e => { const shouldShowExitIntent = !e.toElement && !e.relatedTarget && e.clientY < 10; if (shouldShowExitIntent) { document.removeEventListener('mouseout', mouseEvent); document.querySelector('.exit-intent-popup').classList.add('visible'); CookieService.setCookie('exitIntentShown', true, 30); } }; if (!CookieService.getCookie('exitIntentShown')) { setTimeout(() => { document.addEventListener('mouseout', mouseEvent); document.addEventListener('keydown', exit); document.querySelector('.exit-intent-popup').addEventListener('click', exit); }, 0); } */ </script> <!-- Trigger/Open The Modal --> <!-- The Modal --> <div> <div id="myModal" class="modal"> <!-- Modal content --> <div class="modal-content"> <span class="closeA">×</span> <style> .downlink{ border:1px solid #aaa;color:white;padding:8px;width:98%;color:white;background:green;display:block; } .downlink:hover{ background:blue; cursor:pointer; } </style> <table style="width:80%;"> <tr style="width:100%;"> <td style="width:50%;"><a href="https://pdfprof.com/PDFV2/ShowLink_1.php?vidt=29970&vt=25&links=https%3A%2F%2Fperso.liris.cnrs.fr%2Flionel.medini%2Fenseignement%2FM1IF03%2FCM%2F4_1_AJAX.pdf" class="downlink" target="_blank">PDF Download</a> </td> <td style="width:45%;"><a href="https://pdfprof.com/PDFV2/Documents1/29970/25/8" class="bblinkss"> Next PDF </a> </td></tr> </table> <iframe id="ppifa" frameBorder="0" width="100%" src="https://pdfprof.com/PDFV2/getFrameTestV3.php?links=https://perso.liris.cnrs.fr/lionel.medini/enseignement/M1IF03/CM/4_1_AJAX.pdf&idt=29970&t=25&view=6&url=https://pdfprof.com/PDFV2/Documents1/29970/25/6" style="width:100%;height:90vh;" ></iframe> <script> /* var iframe = document.getElementById("ppifa"); var srcv=iframe.src; var loadingStatus = false; function abc(){ iframe.onload = function () { loadingStatus = true; console.log('ok is loaded iframe'); } if(loadingStatus==false) { iframe.src=srcv; } } abc(); */ </script> </div> </div> </div> <style> body {font-family: Arial, Helvetica, sans-serif;} /* The Modal (background) */ .modal { display: none; /* Hidden by default */ position: fixed; /* Stay in place */ z-index: 1; /* Sit on top */ padding-top: 10px; /* Location of the box */ left: 0; top: 0; width: 100%; /* Full width */ height: 100%; /* Full height */ overflow: auto; /* Enable scroll if needed */ background-color: rgb(0,0,0); /* Fallback color */ background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ } /* Modal Content */ .modal-content { background-color: #fefefe; margin: auto; padding: 5px; border: 1px solid #888; width: 90%; } /* The Close Button */ .closeA { color: #aaaaaa; float: right; font-size: 28px; font-weight: bold; background:red; padding:5px; } .closeA:hover, .closeA:focus { color: #000; text-decoration: none; cursor: pointer; } </style> <script> // Get the modal var modal = document.getElementById("myModal"); // Get the button that opens the modal var btn = document.getElementById("myBtn"); // Get the <span> element that closes the modal var span = document.getElementsByClassName("closeA")[0]; // When the user clicks the button, open the modal btn.onclick = function() { modal.style.display = "block"; } // When the user clicks on <span> (x), close the modal span.onclick = function() { modal.style.display = "none"; } // When the user clicks anywhere outside of the modal, close it window.onclick = function(event) { if (event.target == modal) { modal.style.display = "none"; } } </script> </body> </html>