JavaScript Table des matières Ajax Exemple : Google

Transcription

JavaScript Table des matières Ajax Exemple : Google
Table des matières
JavaScript
M4103C - Programmation Web – client riche
●
AJAX
●
JSON
●
DOM
2ème année - S4, cours - 3/5
2014-2015
Marcel Bosc
Département informatique
IUT de Villetaneuse
Université Paris-13
Exemple : Google
1ère partie
page non rechargée !
Ajax
suggestions
suggestions
internet
client
navigateur
google.fr
« javas »
serveur web
« javascript »
« javascript array»
« javascript subs...»
BDD
Exemple : commentaires
Exemple : commentaires
page non rechargée !
page non rechargée !
affichage
affichage // tri
tri commentaires
commentaires
j'aime
j'aime
internet
client
navigateur
j'aime com. n°1234
youtube.com
serveur web
ok.
BDD
Ajax
internet
client
navigateur
com. triés
youtube.com
serveur web
<div>...</div>
BDD
Exemple jQuery .get()
Asynchronous JavaScript and XML
JavaScript Asynchrone
Requête non bloquante à partir du JavaScript,
au serveur, sans recharger la page.
$.get("http://exemple.org/commentaire",
{ id: 5678 },
appelée
appelée àà la
la réception
réception
function(reponse)
de
de la
la réponse
réponse du
du serveur
serveur
{
// afficher com.
});
Chronologie client / serveur
google.fr
client
navigateur
4 affichage page
5 « javas » tapé
9 mise à jour
affichage
sans recharger
Exemple : suggestion
serveur web
1 https://google.fr
3 <html>...</html>
6 « javas »
générer page web 2
chercher « javas » 7
8 liste suggestions
BDD
<div>
<input id="recherche" type="text" />
<button>chercher</button>
</div>
<ul id="suggestions">
<li></li>
</ul>
div
ul
id="suggestions"
input
internet
button
li
li
li
id="recherche"
Suggestion : JS
Suggestion : GET
$_GET['mot']
http://exemple.org/suggestion.php?mot=a
JS
JS
0 $('#recherche').keyup(function(e)
0 $('#recherche').keyup(function(e)
1 {
1 {
$.get('http://exemple.org/suggestion.php',
$.get('http://exemple.org/suggestion.php',
2
2
serveur
{mot: $('#recherche').val()},
{mot: $('#recherche').val()},
3
3
<li>abricot</li> 4
function(reponse)
function(reponse)
4
<li>arbre </li> 5
{
{
5
<li>amis
</li>
$('#suggestions').html(reponse);
$('#suggestions').html(reponse);
6
6
$('#suggestions').show();
$('#suggestions').show();
7
7
});
});
8
8
9 });
9 });
Suggestion : chronologie JS
0
9
A
attente
keyup !
2
3
8
B
attente
serveur
JS
Suggestion : PHP
réponse
reçue !
6
7
serveur
0 $('#recherche').keyup(function(e)
A
1 {
$.get('http://exemple.org/suggestion.php',
2
{mot: $('#recherche').val()},
3
function(reponse)
4
{ B
5
$('#suggestions').html(reponse);
6
$('#suggestions').show();
7
});
8
9 });
http://exemple.org/suggestion.php?mot=a
0
1
2
3
4
5
6
7
8
$mot=$_GET['mot'];
$sql="SELECT mot FROM mots WHERE mot LIKE '?%'";
$suggestions=database_list($sql,$mot);
$resultat='';
BDD
foreach($suggestions as $suggestion)
{
$resultat.='<li>'.htmlentities($suggestion).'</li>';
}
echo $resultat;
<li>abricot</li>
<li>arbre </li>
<li>amis
</li>
Méthode GET
Méthode POST
GET: peut-être répétée sans conséquences
(ne modifie pas l'état sur le serveur)
POST: répétition potentiellement gênante
( change l'état du serveur )
"Lire infos sur le serveur"
"Écrire des infos sur le serveur"
http://exemple.org/recherche.php?mot=jeudi
http://exemple.org/payer.php
Entêtes http
Exemples:
modifier l'affichage
faire une recherche
Contre-exemples:
payer en ligne
ajouter un commentaire
sur un forum
Contre-exemples:
modifier l'affichage
faire une recherche
Exemples:
payer en ligne
ajouter un commentaire
sur un forum
Exemple : .post()
2ème partie
JSON
JS
0 $('.jaime').click(function(e)
1 {
$.post('http://exemple.org/jaime.php',
2
{nbCom: $(this).parent().attr('id')},
3
function(reponse)
4
{
5
...
6
});
7
8 });
9
HTML / Données
JSON
JavaScript Object Notation
exemple.org
client
navigateur
texte
serveur web
Format de fichier texte, utilisant la syntaxe
JavaScript pour représenter des données
(objets, tableaux ...)
<li>Jean </li>
<li>Akima </li>
<li>Driss </li>
exemple.org
client
navigateur
texte
serveur web
{
nom: "Saidi",
prenom: "Driss",
id: 1234,
age: 25
}
JSON
très utilisé !
beaucoup de langages
PHP
JSON : exemples
Objet simple
PHP: json_encode()
Objet complexe
{
nom: "Saidi",
prenom: "Driss",
id: 1234,
age: 25
PHP
{
$user=[
nom: "Collège Grange du Bois"
ville:
{
nom: "Savigny-le-Temple",
"nom-court": "Savigny",
code : 77176
},
adresse: "2 av. Victor..."
}
'nom'
=>'Saidi',
'prenom'=>'Driss',
'id'
=>1234,
];
$user['age']=25;
header('Content-Type: application/json');
echo json_encode($user);
}
Tableau simple
JSON
Tableau d'objets
{
[
[
"Fraise",
"Chocolat",
"vanille"
]
nom: "Saidi",
prenom: "Driss",
id: 1234,
age: 25
{ nom: "Wang",
id : 4321
},
{ nom: "Amara",
id : 5612
}
}
]
JS : réponse JSON
Application vs page + JS
exemple.org
user.php 2
$id=$_GET['id'];
$u=db('SELECT * FROM
user WHERE id=?',$id);
echo json_encode($u);
1
P
P
P
P
A
Navigateur
A
Serveur
JSON
client
{
JS
$.get('http://exemple.org/user.php',
{id: 1234},
function(reponse)
{ 4
console.log(reponse.nom);
console.log(reponse.age);
});
});
Pages web + JS
3
}
Application JS
nom: "Saidi",
prenom: "Driss",
P
id: 1234,
age: 25
A A
Navigateur
A A A
A
A A
A
A A
A
Serveur
Application JS
3ème partie
DOM
Frameworks
jQuery vs DOM
jQuery
DOM
Simplicité
Performance chargement
Comptabilité navigateurs
Performance exécution
Propriétés
Text Node
Cookies
Env. particuliers
Navigateurs
Chrome
48%
Internet Explorer
18%
v.6, ... v.11
Mozilla Firefox
17%
safari
5%
Mobile
Statistiques: 12/2014
35%
http://en.wikipedia.org/wiki/Usage_share_of_web_browsers
Compatibilité
Principaux objets DOM
caniuse.com
window
Un titre
un paragraphe
HTMLElement
document
MDN : developer.mozilla.org
Window & Document
window
window.document
window.location
window.alert()
window.console()
...
document.getElementById()
DOM
d = un élément DOM
document
var d=document.getElementById('photo');
html
head
jQuery
j=« liste » d'un seul élément jQuery
body
var j=$('#photo');
document
document.body
document.getElementById()
document.createElement()
document.cookie
...
title
h1
p
p
<body>
<h1>Ceci est un titre</h1>
<p id="p1">Un paragraphe</p>
<p>2e paragraphe
<img id="photo" src="ex.png"...
</p>
</body>
body
h1
p
p
id="p1"
img
id="photo"
document.createElement()
node.appendChild()
DOM
var d=document.createElement('p');
pas encore dans arbre DOM !
jQuery
var j=$('<p></p>');
pas encore dans arbre DOM !
DOM
var d=document.createElement('p');
document.body.appendChild(d);
jQuery
var j=$('<p></p>');
$('body').append(j);
body
body
p
h1
p
p
h1
id="p1"
p
p
p
id="p1"
img
img
id="photo"
id="photo"
DOM & jQuery
Node / HTMLElement
j=« liste » d'un seul élément jQuery
Document
var j=$('#photo');
d = un élément DOM
Node
CharacterData
var d=document.getElementById('photo');
jQuery
DOM
jQuery
Comment
HTMLHeadElement
HTMLBodyElement
Element
DOM
Text
DOM
jQuery
$(d)
$('#photo')[0]
jQuery
DOM
HTMLElement
HTMLParagraphElement
...
Simplifié
Node & HTMLElement
Text
<body>
<h1>Ceci est un titre</h1>
<p>
Un paragraphe de texte avec un
<a href="page2.html">lien</a> vers une autre
page. Les mots suivants
<strong>sont importants</strong>
</p>
</body>
« Propriétés »
Arbre DOM
element.className
element.parentNode
element.innerHTML
element.children
element.textContent
element.childNodes
element.nodeName
element.insertBefore()
element.nodeType
element.removeChild()
element.style
body
element.addEventListener()
h1
Chercher éléments
element.getElementsByClassName()
p
Text
Text
Ceci est un titre
Un para... avec un
a
Text
vers une... suivants
Text
lien
strong
element.querySelector()
Text
sont importants
element.className
d.className
element.getElementsByTagName()
"intro important"
node.parentNode
j.hasClass("intro")
DOM
DOM
var d=document.getElementById('photo').parentNode;
d.className="conclusion secondaire"
j.attr('class')
element.querySelectorAll()
jQuery
jQuery
var j=$('#photo').parent();
j.addClass("xyz")
j.removeClass("intro")
<p class="intro important">Un paragraphe</p>
body
h1
p
p
id="p1"
img
id="photo"
node.children
element.addEventListener()
DOM
var liste=document.body.children;
for(var i=0;i<liste.length;i++)
{
// ... liste[i] ...
}
var d=document.getElementById('photo');
d.addEventListener('click',function(){ ... });
jQuery
var liste=$('body').children();
liste.each(function()
{
// ... this ...
});
body
h1
p
p
id="p1"
h1
Ce document est distribué librement.
Sous licence GNU FDL :
http://www.gnu.org/copyleft/fdl.html
Les originaux sont disponibles au format LibreOffice
http://www-info.iutv.univ-paris13.fr/~bosc
jQuery
$('#photo').click(function(){ ... });
body
children / childNodes
Text
DOM
p
p
img
id="photo"
click