Programmation Web JavaScript - CRIL

Transcription

Programmation Web JavaScript - CRIL
Programmation Web
JavaScript
Christophe Lecoutre
[email protected]
IUT de Lens - CRIL CNRS UMR 8188
Université d’Artois
France
Septembre 2015
1
Outline
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
2
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
3
Bibliographie
I
Nicholas Zakas
Professional JavaScript for Web developpers, 3rd Edition, Wrox,
2011.
I
Stoyan Stefanov
JavaScript Patterns, O’Reilly, 2010.
Sites :
I
Javascriptfr http://www.javascriptfr.com
I
w3school-Javascript sur
http://www.w3schools.com/js/default.asp
4
Description Générale
JavaScript est un langage de programmation de plus en plus utilisé pour
le développement Web.
Il est formé de trois composants:
I ECMAScript, qui est défini dans l’édition ECMA-262, et qui fournit
les fonctionnalités centrales
I
DOM (Document Object Model) qui fournit les fonctionnalités pour
interagir avec le contenu d’une page web
I
BOM (Browser Object Model) qui fournit les fonctionnalités pour
interagir avec le navigateur
Remarque
Il y a de grandes disparités de support des trois composants de Javascript
par les navigateurs principaux (Firefox, IE, Chrome, Safari, Opera).
5
Javascript couplé à HTML
L’élément HTML <script> permet d’utiliser du code Javascript avec
une page HTML. Les attributs possibles pour cet élément sont :
I
type : indique le type de contenu (appelé aussi type MIME). La
valeur par défaut est "text/javascript"
I
charset : indique le jeu de caractères utilisé
I
defer : indique si l’exécution du script doit être différée
I
src : indique que le code se situe dans un fichier externe
Attention
Même en utilisant defer, certains navigateurs ne retarderont pas
l’exécution du code.
6
Inline Code
Il suffit d’utiliser l’élément <script>.
<script>
function sayHi() {
console.log("Hi!");
}
</script>
Attention
Un erreur se produit si </script> apparaı̂t dans le code.
<script>
function sayScript() {
console.log("</script>"); // Provoque une erreur
}
</script>
7
Fichiers externes
Il suffit d’utiliser l’élément <script> avec l’attribut src.
<head>
<title> Example </title>
<script src="example1.js"> </script>
<script src="example2.js"> </script>
...
Attention
Pour exécuter le code après le chargement de la page, on utilisera :
<body>
<!-- content here -->
<script src="example1.js"> </script>
<script src="example2.js"> </script>
</body>
8
Inline code et symboles spéciaux
Le code suivant n’est pas correct en HTML :
<script>
function test(a,b) {
if (a < b) console.log("1er parametre plus petit");
}
</script>
Première solution : remplacer < par &lt;
Deuxième solution : utiliser CDATA
<script>
// <![CDATA
function test(a,b) {
if (a < b) console.log("1er parametre plus petit");
}
// ]]>
</script>
9
Inline code ou External Files ?
Il est préférable d’utiliser des fichiers externes pour des raisons de :
I
maintenabilité : le code javascript peut être rassemblé dans un
unique répertoire
I
caching : un fichier js partagé par deux pages ne sera téléchargé
qu’une seule fois
I
lisibilité : pas besoin d’astuces telles que // ... [CDATA qui polluent
la page
Remarque
L’élément <noscript> permet d’afficher un contenu lorsque le
navigateur ne supporte pas JS. Par exemple :
<body>
<noscript>
<p> Cette page nécessite JavaScript </p>
</noscript>
10
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
11
Identificateurs et commentaires
Les identificateurs :
I
sont sensibles à la casse: test n’est pas Test
I
sont formés par convention en utilisant le style camel case comme
dans sommeNotes
Les commentaires :
// single line comment
/*
* multi-line
* comment
*/
12
Identificateurs et commentaires
Les instructions :
I
se terminent par un point-virgule
I
nécessitent des accolades lorsqu’elles forment un bloc
Example
...
var sum = a + b;
...
if (sum > 0) console.log("positif");
...
if (a < b) {
var tmp = a;
a = b;
b = tmp;
}
13
Variables
Déclarer une variable nécessite l’utilisation du mot-clé var.
Example
var
...
var
...
v =
...
var
sum;
v = 100;
"coucou";
// autorise mais deconseille
x = 10, y = 20, z = false;
Portée locale
function test() {
var message = "hi";
}
test();
alert(message); // undefined
// multiple declaration
Portée globale
function test() {
message = "hi";
}
test();
alert(message); // "hi"
14
Types
Il y a principalement trois types classiques de données Boolean, Number
and String et un type complexe Object (liste de couples nom-valeurs). Il
est possible de déterminer le type (courant) d’une variable avec
l’opérateur typeof qui retourne l’une des valeurs suivantes:
I
undefined si la valeur est indéfinie (variable déclarée mais pas
initialisée ou variable non déclarée)
I
boolean
I
number
I
string
I
object si la valeur est un objet ou null
I
function si la valeur est une fonction
Remarque
Les fonctions sont considérées comme des objets qui ont des propriétés
spéciales.
15
Valeurs undefined et null
La valeur undefined fait référence à une variable non déclarée ou déclarée
mais pas initialisée, null fait référence à une variable censée référencer un
objet mais non encore disponible.
Example
var message = "coucou";
console.log(typeof message); // "string"
var m1;
console.log(m1); // "undefined"
console.log(m2); // erreur
console.log(typeof m1); // "undefined"
console.log(typeof m2); // undefined
...
var car = null;
console.log(typeof car); // "object"
16
Boolean et Number
Le type Boolean a deux valeurs true et false. Le type Number sert à
représenter des valeurs entières et des valeurs flottantes (réelles).
Example
var
var
var
var
var
var
x = 55;
y = 070; //octal pour 56 (en base 10)
z = 0xA, //hexadecimal pour 10
f1 = 10.2;
f2 = 3.12e7; // represente 31 200 000
f3 = 3e-10; // represente 0,0000000003
Remarque
Les valeurs particulières du type Number sont :
I
Number.MIN VALUE, Number.MAX VALUE
I
Number.NEGATIVE INFINITY, Number.POSITIVE INFINITY
I
NaN (Not a Number)
17
Conversions numériques
Relatifs aux valeurs et conversions des nombres, on trouve 4 fonctions :
I
isNaN détermine si un paramètre donné n’est pas un nombre
I
Number effectue une conversion
I
parseInt effectue une conversion en valeur entière
I
parseFloat effectue une conversion en valeur réelle
Example
console.log(isNaN(10)); // false
console.log(isNaN("10")); // false - peut etre convertie
console.log(isNaN("blue")); // true - pas convertible
var num1 = Number("hello world"); // NaN
var num2 = Number("00001"); // 1
var num3 = Number(true); // 1
var num3 = parseInt(""); // NaN
var num4 = parseInt(22.5); // 22
var num5 = parseInt("70",10); // 70 - base 10 specifiee
var num6 = parseFloat("22.5"); // 22.5
18
String
On utilise les quotes simples (apostrophes) ou doubles (guillemets) pour
définir des valeurs chaı̂nes de caractères. L’attribut length permet de
déterminer la longueur d’une chaı̂ne.
Example
var nom = "Wilde";
var prenom = ’Oscar’;
console.log(prenom.length); // 6
var message = "toto a dit \"je suis malade\".";
Il est possible de transtyper une valeur en chaı̂ne avec String().
Example
var
var
var
var
v1 = 10;
v2 = true;
v3 = null;
v4;
console.log(String(v1)); // "10"
console.log(String(v2)); // "true"
console.log(String(v3)); // "null"
console.log(String(v4)); // "undefined"
19
String
Il existe de nombreuses fonctions sur les chaı̂nes de caractères.
Example
var s = "hello world";
console.log(s.length); // 11
console.log(s.charAt(1)); // "e"
console.log(s.charCodeAt(1)); // 101
console.log(s.slice(3)); // "lo world"
console.log(s.slice(-3)); // "rld"
console.log(s.substring(3,7)); // "lo w"
console.log(s.indexOf("o")); // 4
console.log(s.lastIndexOf("o")); // 7
console.log(s.toUpperCase()); // HELLO WORLD
console.log(s + " !"); // hellow world !
20
Math
Il s’agit d’un objet définissant de nombreuses constantes et fonctions
mathématiques.
Example
console.log(Math.E); // la valeur de e
console.log(Math.PI); // la valeur de pi
console.log(Math.min(5,12)); // 5
console.log(Math.max(23,5,7,130,12)); // 130
console.log(Math.ceil(25.3)); // 26
console.log(Math.floor(25.8)); //25
console.log(Math.random()); // valeur aleatoire entre 0 et
1
var n = Math.floor(Math.random()*nb + min);
console.log(n); // valeur aleatoire entre min et min+nb
(exclus)
D’autres fonctions :
Math.abs(x)
Math.pow(x,y)
Math.sin(x)
Math.exp(x)
Math.sqrt(x)
Math.cos(x)
Math.log(x)
Math.tan(x)
21
Opérateurs
Typiquement, ceux de C, C++ et java:
I
incrémentation/décrémentation (++, −−)
I
arithmétiques (+,−,∗,/,%)
I
relationnels (>,<,>=,<=,==,! =) et (===,! ==)
I
logique (!,&&,||)
I
affectation (=,+=,−=,*=,/=,%=)
I
bit à bit (&,|,<<,>>, ...)
Example
var age = 10;
age++;
console.log(age); //
console.log(age > 10
console.log(26 % 5);
age*=2;
console.log(age); //
11
&& age < 20); // true
// 1
22
22
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
23
Structures de contrôle
Elles sont très proches de celles de langages tels que C, C++ et Java.
Pour rappel, les structures de contrôles sont de trois types :
I Séquence : exécution séquentielle d’une suite d’instructions
séparées par un point-virgule
I Alternative : structure permettant un choix entre divers blocs
d’instructions suivant le résultat d’un test logique
I Boucle : structure itérative permettant de répéter plusieurs fois la
même bloc d’instructions tant qu’une condition de sortie n’est pas
avérée
Remarque
Toute condition utilisée pour une alternative ou boucle sera toujours
placée entre parenthèses.
Attention
Il ne faut pas confondre x == y (test d’égalité) avec x = y (affectation).
24
Alternative
L’instruction if sans partie else :
if (condition) instruction;
if (condition) {
instruction;
}
if (condition) {
instruction1;
instruction2;
...
}
Example
if (x >= 0) console.log("valeur positive ou nulle");
...
if (note > 12 && note <= 14) {
console.log("bravo");
mention="bien";
}
25
Alternative
L’instruction if...else :
if (condition) instruction1;
else instruction2;
if (condition) {
instructions1;
} else {
instructions2;
}
if (condition1) {
instructions1;
} else if (condition2) {
instructions2;
} else {
instructions3;
}
Example
if (rank == 1)
medaille="or";
else if (rank == 2)
medaille="argent";
else if (rank == 3)
medaille="bronze";
26
Alternative
L’instruction switch :
switch (expression) {
case valeur1 :
instructions1;
break;
case valeur2 :
instructions2;
break;
...
case valeurN :
instructionsN;
break;
default:
instructionsDefault;
}
Remarque
Le branchement par défaut n’est pas obligatoire.
27
Alternative
L’opérateur ternaire ?: permet de remplacer une instruction if...else
simple. Sa syntaxe (lorsqu’utilisée pour donner une valeur à une variable)
est :
variable = condition ? expressionIf : expressionElse;
Elle est équivalente à :
if (condition) variable=expressionIf;
else variable=expressionElse;
Example
var civilite = (sexe == "F") ? "Madame" : "Monsieur";
var medaille = rank == 1 ? "or" : rank == 2 ? "argent" : "
bronze";
Remarque
Cet opérateur est utile pour les expressions courtes.
28
Boucle
L’instruction while :
while (condition) instruction;
while (condition) {
instruction1;
instruction2;
...
}
Example
var num = 1;
while (num <= 5) {
console.log(num);
num++;
}
29
Boucle
L’instruction for :
for (instructionInit; condition; instructionIter)
instruction;
for (instructionInit; condition; instructionIter) {
instruction1;
instruction2;
...
}
Example
for (var num = 1; num <= 5; num++)
console.log(num);
Remarque
Il n’est pas nécessaire de placer des parenthèses autour de la condition
pour le for.
30
Boucle
L’instruction do...while :
do {
instruction1;
instruction2;
...
}
while (condition);
L’instruction for-in pour les objets :
for (var prop in window)
document.writeln(prop);
31
Boucle
Certaines instructions permettent un contrôle supplémentaire sur les
boucles :
I
break permet de quitter la boucle courante
I
continue permet de terminer l’itération en cours de la boucle
courante
Example
for (var i=0; i<5; i++) {
for (var j=0; j<5; j++) {
if ((i+j)%3 == 0)
continue;
for (var k=0; k<5; k++) {
if ((i+j+k)%3 == 0)
break;
console.log(i + " " + j + " " + k);
}
}
}
32
Exercice
Écrire le code Javascript qui détermine si un nombre entier x est parfait.
Definition
Un nombre est parfait ssi il est égal à la somme de ses diviseurs stricts.
6 est parfait car 6 = 1 + 2 + 3.
33
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
34
Object
Peut être utilisé notamment pour stocker des données. Création d’une
variable (de type Object) de manière littérale (énumération entre
accolades).
Example
var person = {
name : "Julien",
age : 23,
gender : "M"
}
Remarque
Il est possible d’utiliser les crochets pour accéder à un champ.
console.log(person.name);
console.log(person["name"]);
var field="name";
console.log(person[field]);
35
Array
Les tableaux peuvent contenir des données de nature différente.
Example
var t1 = []; // tableau vide
var t2 = new Array(20); // tableau avec 20 cases
var colors = ["red","blue","green"]; // notation litterale
Remarque
Le champ length indique la taille d’un tableau.
Example
var colors = ["red","blue","green"];
console.log(colors.length); // 3
colors[colors.length]="black"; // nouvelle couleur
colors[99]="pink";
console.log(colors.length); // 100
console.log(colors[50]): // undefined
colors.length=10; // plus que 10 cases
36
Array
De nombreuses méthodes existent sur les tableaux.
Example
var colors = ["red","blue","green"];
console.log(colors); // red,blue,green
console.log(colors.join(";")); // red;blue;green
colors.push("black");
console.log(colors); // red,blue,green,black
var item = colors.pop();
console.log(item + " " + colors); // black red,blue,green
var item2= colors.shift();
console.log(item2 + " " + colors); // red blue,green
Remarque
Il existe d’autres méthodes telles que concat, slice et splice.
37
Réordonner les tableaux
On peut utiliser reverse et sort.
Example
var values = [0, 1, 2, 3, 4];
console.log(values.reverse()); // 4,3,2,1,0
values = [0, 1, 5, 10, 15];
console.log(values.sort()); // 0,1,10,15,5
function compare(value1, value2) {
...
}
values = [0, 1, 5, 10, 15];
console.log(values.sort(compare)); // 0,1,5,10,15
Exercice. Écrire le corps de la fonction compare ci-dessus qui retourne
-1 lorsque le premier argument est inférieur au second, +1 lorsque le
premier argument est supérieur au second, et 0 sinon.
38
Fonctions
La syntaxe pour définir une fonction est :
function name(arg0, arg1, ..., argN) {
statements
}
Example
Example
function sayHi(name) {
console.log("Hello " +
name);
}
function sum(num1, num2) {
return num1+num2;
}
sayHi("Nicolas");
console.log(sum(5,10)); //
15
Remarque
Une fonction peut retourner un résultat avec l’instruction return même
si rien ne l’indique au niveau de la signature (en-tête) de la fonction.
39
Arguments
Il existe toujours un tableau arguments implicite lors de l’appel à une
fonction.
Example
function f() {
console.log(arguments.length);
for (var i=0; i<arguments.length; i++)
console.log(arguments[i]);
}
f("Nicolas"); // affiche 1 Nicolas
f("Nicolas",25); // affiche 2 Nicolas 25
Remarque
La possibilité de faire appel à une fonction avec un nombre variable de
paramètres pallie l’impossibilité de surcharge (overloading).
40
Fonctions comme objets
Il y a deux manières (sensiblement équivalentes) de définir une fonction.
Example
function sum(n1, n2) {
return n1+n2;
}
console.log(sum(5,10));
//15
Example
var sum = function (n1, n2) {
return n1+n2;
};
console.log(sum(5,10)); //15
Remarque
Il est possible de référencer une fonction par deux variables différentes ou
de passer une fonction comme paramètre à une autre fonction.
41
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
42
Window
L’objet window représente la fenêtre du navigateur.
Example
window.moveTo(0,0);
window.resizeTo(800,800);
var wrWindow = window.open("http://www.wrox.com","wrox");
if (wrWindow == null)
console.log("fenetre bloquee");
else {
...
wrWindow.close();
}
Remarque
Le navigateur peut être configuré de manière à empêcher de modifier son
emplacement, de modifier sa taille ou encore d’afficher une fenêtre
pop-up.
43
Timer
Il est possible de programmer l’exécution d’une méthode à un instant
donné ou à des temps réguliers grâce à setTimeout et setInterval.
Example
function helloWorld() {
console.log("hello world");
}
var id = setTimeout(helloWorld, 1000);
var num=0, max=4;
var intervalId = setInterval(incrementNumber,500);
function incrementNumber() {
if (++num == max) clearInterval(intervalId);
else console.log(num);
}
Remarque
Il est possible d’annuler avec clearTimeout et clearInterval.
44
Boites de dialogues
Des boites de dialogues peuvent être ouvertes en utilisant les méthodes
alert, confirm et prompt.
Example
if (confirm("Are you sure?"))
alert("I am glad");
else
alert("I am sorry");
var name = prompt("What is your name?","Toto");
if (name != null)
alert("Welcome " + name);
Remarque
Il existe deux autres méthodes asynchrones print et find.
45
Objets du BOM
En plus de window, il est possible d’utiliser les objets location,
navigator, screen et history.
Example
location.href="http://www.wrox.com";
location.reload();
location.port=8080; // change le port
console.log(navigator.appName); // nom du navigateur
console.log(navigator.javaEnabled);
console.log(screen.colorDepth);
console.log(screen.width);
window.resizeTo(screen.availWidth,screen.availHeight);
history.go(2); // go forward 2 pages
history.back(); // go back one page
if (history.length == 0) console.log("this is the first
page");
46
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
47
DOM
DOM (Document Object Model) est une API pour manipuler les
documents HTML et XML. L’objet document représente la page HTML
chargée par le navigateur.
Example
var html = document.documentElement;
alert (html == document.firstChild); // true
var body = document.body;
document.title="nouveau titre";
var url = document.URL;
var domain = document.domain;
console.log(url + " " + domain);
48
Méthode getElementById()
Cette méthode prend comme argument l’id d’un élement.
Example
// dom.html
<head>
...
</head>
<body>
<p id="p1"> An ordered list: </p>
...
<script src="dom.js"> </script>
</body>
// dom.js
var p = document.getElementById("p1");
p.style.color="blue";
49
Méthode getElementsByTagName()
Cette méthode prend comme argument le nom de balise des éléments à
récupérer.
Example
// dom.html
<body>
<ol>
<li>XHTML</li>
<li>CSS</li>
...
</ol>
<script src="dom.js"> </script>
</body>
// dom.js
var list = document.getElementsByTagName("li");
for (var i=0; i< list.length; i++)
list[i].style.color="green";
50
Propriété innerHTML
En utilisant cette propriété, il est possible de modifier le contenu d’un
élément.
Example
var div1 = document.getElementById("d1");
var div2 = document.getElementById("d2");
var div3 = document.getElementById("d3");
div2.innerHTML=div1.innerHTML;
div3.innerHTML="je suis <strong> content </strong>";
Remarque
La propriété innerText (textContent pour Firefox) est similaire à
innerHTML, mais ne traite que du texte simple.
Attention
Éviter d’utiliser outerText et outerHTML.
51
Créer des éléments HTML
Il existe de nombreuses méthodes DOM pour créer dynamiquement des
éléments.
Example
var table = document.createElement("table");
for (var i=1; i<=10; i++) {
var row = document.createElement("tr");
for (var j=1; j<=10; j++) {
var cell = document.createElement("td");
cell.appendChild(document.createTextNode(i*j));
row.appendChild(cell);
}
table.appendChild(row);
}
document.getElementById("d1").appendChild(table);
52
Modifier le style dynamiquement
Tout élément HTML dispose d’un attribut style en JS. Les noms des
propriétés CSS doivent être convertis en camel case. Par exemple :
Propriété CSS
Propriété JavaScript
background-image
color
font-family
style.backgroundImage
style.color
style.fontFamily
Example
var div = document.createElement("myDiv");
myDiv.style.backgroundColor="red";
myDiv.style.width="100px";
myDiv.style.border="1px solid border";
Attention
La propriété float correspond à un mot réservé de Javascript. Il faut
alors utiliser cssFloat (ou styleFloat pour IE).
53
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
54
Événements
Un événement est provoqué par une action de l’utilisateur ou du
navigateur lui-même. Les événements ont des noms tels que click,
load et mouseover. Une fonction appelée en réponse à un événement
se nomme un écouteur (event handler ou event listener). Souvent, leur
nom commence par on comme par exemple onclik ou onload.
Associer des écouteurs aux évènements possibles peut se faire de trois
manières différentes:
I
HTML
I
DOM Level 0
I
DOM Level 2 (pas présenté ici)
55
HTML Event Handlers
On utilise des attributs HTML pour déclarer les écouteurs. La valeur de
ces attributs est le code JavaScript à exécuter lorsque l’événement est
produit.
Example
<input type="button" onclick="console.log(’clicked’)" />
<script>
function showMessage() {
console.log("hello world");
}
</script>
<input type="button" onclick="showMessage()" />
Remarque
Il faut parfois échapper des caractères. Par exemple :
onclick="console.log(&quot;clicked&quot;)"
56
Dom Level 0 Event Handlers
On utilise les propriétés des éléments pour leur associer des écouteurs.
Example
// dom0.html
<input type="button" id="but1" value="bouton 1" />
// dom0.js
function but1Listener() {
console.log("but1 cliqued");
}
var but1 = document.getElementById("but1");
but1.onclick=but1Listener;
Remarque
Pour éliminer l’écouteur, on place la valeur null. Par exemple :
but1.onclick=null;
57
L’objet event
Quand un événement se produit, toutes les informations le concernant
sont enregistrées dans un objet appelé event. Il est possible de
récupérer cet objet sous forme de paramètre d’une fonction écouteur.
Example
function but3Listener(event) {
switch(event.type) {
case "click" :
console.log("clicked at " + event.clientX + " " +
event.clientY);
break;
case "mouseover" :
this.style.backgroundColor="red"; break;
case "mouseout" :
this.style.backgroundColor=""; break;
}
}
but3.onclick=but3Listener;
but3.onmouseover=but3Listener;
but3.onmouseout=but3Listener;
58
Événements souris
Ce sont :
click
mousedown
mouseover
mousemove
dblclick
mouseup
mouseout
Les propriétés utiles et accessibles à partir de l’objet event sont :
clientX
screenX
shiftkey
altKey
clientY
screenY
ctrlKey
metaKey
59
Événements clavier
Ce sont :
keydown
keypress
keyup
Les propriétés utiles et accessibles à partir de l’objet event sont :
shiftkey
altKey
keyCode
ctrlKey
metaKey
Exemples de valeurs pour keyCode:
I
40 pour Down Arrow
I
65 pour A
I
112 pour F1
60
Événements HTML
Ce sont :
load
abort
select
submit
resize
focus
unload
error
change
reset
scroll
blur
Remarque
La plupart de ces évènements sont liés aux formulaires ou l’objet
window.
61
Événements load et unload
Pour l’objet window, l’événement load se produit lorsque la page
complète est chargée, incluant les ressources externes telles que les
images, les fichiers JavaScript et CSS.
Example
function loadListener() {
console.log("loaded");
}
window.onload=loadListener;
Remarque
Il est possible d’associer cet événement à des éléments img.
Remarque
L’évènement unload se produit typiquement lorsqu’on change de page.
Cela permet par exemple de libérer proprement certaines ressources.
62
Événements submit et reset
Ils sont associés à un formulaire. Pour valider la soumission ou la
ré-initialisation, la fonction écouteur doit retourner true.
Example
function submitListener() {
if (this.name1.value.length == 0) return false;
// autres controles a effectuer
return true;
}
function resetListener() {
return confirm("Are you sure?");
}
var form = document.getElementById("form1");
form.onsubmit=submitListener; form.onreset=resetListener;
Remarque
this.name1.value représente la valeur du champ name1 de l’objet
this qui est le formulaire auquel est associé l’écouteur.
63
Événements focus et blur
Utiles par exemple pour contrôler les champs de saisie.
Example
function focusListener() {
if (this.style.backgroundColor != "red")
this.style.backgroundColor="yellow";
}
function blurListener() {
if (this.value.match(/\d/g))
this.style.backgroundColor = "red";
else
this.style.backgroundColor = "";
}
var field = document.getElementById("name1");
field.onfocus=focusListener;
field.onblur=blurListener;
64
Expressions régulières
La syntaxe est /pattern/modifiers
Modifiers are used to perform case-insensitive and global searches:
I
i : perform case-insensitive matching
I
g : perform a global match (find all matches rather than stopping
after the first match)
I
m : perform multiline matching
Le motif (pattern) est la séquence de caractères à rechercher. Il est
possible d’utiliser des méta-caractères, crochets, etc.
Voir
http://www.w3schools.com/jsref/jsref_obj_regexp.asp
65
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
66
Bibliothèque jQuery
Librairie Javascript développée depuis 2006
Avantages :
I
interface simple et puissante pour écrire du code
I
aplanit les différences entre navigateurs
I
beaucoup de ressources disponibles
Utiliser jQuery :
I
download à www.jquery.com
I
ou utiliser un CDN (Content Delivery Network). Par exemple :
<script src="http://ajax.googleapis.com/ajax/libs/jquery
/1.11.1/jquery.min.js">
</script>
67
Sélectionner avec jQuery
L’instruction $(selecteur), ou jquery(selecteur), retourne le ou les
éléments sélectionnés.
Example
<h1 id="test"></h1>
$("#test").text("premier essai");
L’instruction $(document).ready() permet d’executer du code (en
argument de ready) lorsque le document DOM est totalement chargé
Example
$(document).ready(function() {
$("#test").text("premier essai");
});
Attention
Utiliser une fonction anonyme dans ready()
68
Sélectionner avec jQuery
Example
<body>
<ul id="menu">
<li class="item"><p>This is a paragraph</p></li>
<li class="item">No paragraph here</li>
<li class="item">No paragraph here</li>
</ul>
<p>Email: <input type="email" id="email"/></p>
<p>Plain Text: <input type="text" id="text"/></p>
<script src="//ajax.googleapis.com/.../jquery.min.js">
</script>
<script src="my.js"></script>
</body>
$(document).ready(function(){
$(".item").css("color", "blue");
$("#menu .item p").css("color", "red");
$("input[type=email]").css("border", "10px solid blue");
});
69
Sélectionner des éléments avec jQuery
Sélecteurs spécifiques à jQuery ( voir http://api.jquery.com/
category/selectors/jquery-selector-extensions/) :
Sélecteur
:eq()
:gt()
:lt()
:first
:last
:even
:odd
:animated
:selected
:visible
:hidden
:has()
:parent
Sens
élement à la position donnée
élements aux positions supérieures
éléments aux positions inférieures
premier élément matché
dernier élément matché
élements aux positions paires
éléments aux positions impaires
éléments en cours d’animation
éléments sélectionnés
éléments visibles
élements cachés
éléments contenant
éléments parents
Exemple
$(”li:eq(2)”)
$(”li:gt(2)”)
$(”li:lt(2)”)
$(”tr:first”)
$(”tr:last”)
$(”tr:even”)
$(”tr:odd”)
$(”p:animated”)
$(”option:selected”)
$(”p:visible”)
$(”p:hidden”)
$(”div:has(p)”)
$(”p:parent”)
70
Créer des éléments avec jQuery
L’instruction $(element) crée un nouvel élément.
Example
<div id="container"></div>
$(document).ready(function(){
var time = new Date().getHours();
var elem = $("<h1>").attr("id","greeting").hide();
if (time < 12) elem.text("Good Morning");
else elem.text("Good Afternoon");
$("#container").append(elem);
$("#greeting").show("slow");
});
Remarque
Il est possible d’écrire :
if (time < 12)
elem = $("<h1 id=’greeting’>Good Morning</h1>").hide();
71
Quelques méthodes
Les méthodes suivantes sont couramment utilisées :
I
text() : get/set le contenu textuel de l’élément
I
html() : get/set le contenu html d’ l’élément
I
css() : get/set les propriétés CSS
I
attr() : get/set les attributs de l’élement
I
hide(), show() et toggle() : cache ou rend visible l’élément
I
fadeIn(), fadeOut() et fadeToggle() : pour jouer avec l’opacité
I
slideUp(), slideDown() et slideToggle() : pour un effet glissant
I
addClass(), removeClass(), hasClass() et toggleClass() permettent
de modifier dynamiquement la valeur de l’attribut class
Remarque
La plupart permettent d’effectuer du method chaining
72
Exemple avec attr()
Example
<ul>
<li id="contact"><a>Toto</a></li>
</ul>
$(document).ready(function(){
$("#contact a").attr({
"href" : "http://www.toto.com/",
"title" : "Visit Toto website",
"id" : "atoto"
});
var li = $("<li>").text($("#contact a").attr("title"));
$("ul").append(li);
});
73
Exemple avec css()
Example
<h1>Beginning HTML and CSS</h1>
<p>
<strong>The border property is:</strong>
<span id="result"></span>
</p>
$(document).ready(function(){
$("h1").css({
"font-size" : "200%",
"color" : "#ffffff",
"height" : "100px",
"width" : "500px",
"background-color" : "#61b7ff",
"border" : "10px solid #003366"
});
$("#result").text($("h1").css("border"));
});
74
Exemple avec html()
Example
$(document).ready(function(){
var methods = ["attr()", "css()", "html()", "addClass()"
, "removeClass()", "hasClass()", "toggleClass()"];
var list="";
for (var i=0, len=methods.length; i < len; i++)
list += "<li>" + methods[ i ] +"</li>";
$("#methods").html(list);
});
75
Exemple avec toggleClass()
Example
.selected {
background : #666;
color : #fff;
}
<ul>
<li id="home" class="item">Home</li>
<li id="about" class="item">About</li>
<li id="contact" class="item">Contact</li>
</ul>
$(document).ready(function(){
$("#home").on("click", function(){
$("#home").toggleClass("selected");
});
});
76
Exemple avec show() et toggle()
Example
$(document).ready(function(){
$("#slow").show("slow");
$("#fast").show("fast");
$("#ms").show(1500);
$("#toggle").on("click", function(){
$("#toggled").toggle();
});
});
77
Exemple avec slideToggle()
Example
<dl>
<dt>Term </dt>
<dd>
<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
</ul>
</dd>
...
</dl>
$(document).ready(function(){
$("dt").on("click", function(){
$(this).next().slideToggle();
})
});
78
Gestion des événements
Méthodes importantes :
I
I
I
on() pour enregistrer un écouteur
off() pour supprimerun écouteur
trigger() pour déclencher un évenement
en remplacement depuis jQuery 1.7 de click(), submit(), live(), die(),
delegate(), undelegate(), bind() and unbind()
Example
$(document).ready(function(){
function toggler(){
$(this).next().slideToggle();
}
$("dt").on("click", toggler;)
$("button").on("click", function(){
$("dt").trigger("click").off("click", toggler);
});
});
79
Méthode on() à trois arguments
Le second paramètre désigne le type d’éléments qui est concerné par
l’écouteur (même si un élément de ce type est créé plus tard).
“Listen to every click on the whole document, and if it happens on an
<a> element, fire this event.” :
Example
$(document).on( "click", "a", function(){
//code goes here
});
80
jQuery UI
jQuery UI:
I collection de GUI widgets
I download à www.jqueryui.com ou utiliser un CDN
Squelette :
<head>
<meta charset="utf-8">
<title>jQuery UI Draggable and Droppable</title>
<link rel="stylesheet" href="http://ajax.googleapis.com/
ajax/libs/jqueryui/1.11.1/themes/smoothness/jqueryui.css"/>
</head>
<body>
...
<script src="http://ajax.googleapis.com/ajax/libs/jquery
/1.11.1/jquery.min.js">
</script>
<script src="http://ajax.googleapis.com/ajax/libs/
jqueryui/1.11.1/jquery-ui.min.js">
</script>
</body>
81
Drag and Drop
Example
<div id="container">
<div id="draggable">
<p>Drag here</p>
</div>
<div id="droppable">
<p>Drop here</p>
</div>
</div>
$(document).ready(function(){
$("#draggable").draggable();
$("#droppable").droppable( {
drop: function(event, ui) {
$(this).css("border","4px solid").html("<p>Dropped
!</p>");
}
});
});
82
Resizable ans Selectable
Example
<div id="resizable"> <p>Resizable Element</p> </div>
$(document).ready( function(){
$("#resizable").resizable();
});
<ol id="selectable">
<li>These items are selectable </li>
<li>These items are selectable </li>
<li>These items are selectable </li>
</ol>
$(document).ready(function(){
$("#selectable").selectable();
});
83
Sortable
Example
<ol id="sortable">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
<li>Five</li>
</ol>
$(document).ready(function() {
$("#sortable").sortable().disableSelection();
});
Et tous les autres widgets sur http://jqueryui.com/. En
particulier :
I
accordion
I
tabs
84
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
85
Création d’un objet
Notation littérale à privilégier :
I
symboles ’{’ et ’}’ encadrant la définition de l’objet
I
introduction de champs (propriétés) et fonctions (méthodes),
constitués d’un nom suivi de ’:’ et de la valeur
I
symbole ’,’ comme séparateur entre les différents champs/fonctions
Example
var person = {
name: "Alice",
age: 20,
job: "singer",
introduction: function() {
console.log(this.name+ " " + this.age + " " + this.job
);
}
};
86
Accés aux membres d’un objet
On utilise :
I
I
this si on se trouve dans le code d’une fonction de l’objet
le nom de la variable (objet) si on se trouve dans du code par ailleurs
Example
var game = {
occupied: false,
...
cellAt: function (row, col) {
return $("[data-r=’"+row+"’][data-c=’"+col+"’] span");
},
getDigitAt: function (row, col) {
var val = this.cellAt(row, col).text();
return val == "" ? 0 : parseInt(val);
}
};
var v = game.getDigit(2,3);
87
Parcours des membres d’un objet
On utilisera :
I
for in pour itérer sur le nom des membres d’un objet
I
hasOwnProperty pour ne traiter que les membre non hérités
I
la notation [] pour accéder à la valeur des membres
Example
for (var memberName in object) {
console.log(memberName);
}
for (var memberName in object) {
console.log(memberName + " " + object[memberName]);
}
for (var memberName in object) {
if (object.hasOwnProperty(memberName))
console.log(memberName);
}
88
Héritage
L’héritage est basé sur le concept de prototype.
La gestion de ”classes” et de l’héritage est :
I
assez complexe en ECMAScript 5
I
plus facile en ECMAScript 6
Remarque
Orientez-vous vers les nouvelles facilités de ECMAScript 6
89
Functional Programming
Forme de programmation caractérisée par l’enchainement des appels de
fonctions (method chaining).
Fonctions caractéristiques : filter, map, reduce
Example
var t1 = [5, "poisson", 10, "zebre", true];
var t2 = t1.filter(
function (value) {
return (typeof value === ’string’);
}
);
console.log(t2); // poisson, zebre
90
Functional Programming
Example
var t1 = [1, 2, 3, 4];
var t2 = t1.map(function(number){
return number * 2;
}).map(function(number){
return number + 1;
});
console.log(t2); // [3, 5, 7, 9]
var total = t1.map(function(number){
return number * 2;
}).reduce(function(total, number){
return total + number;
}, 0);
console.log("The total number is", total); // 20
91
Functional Programming en Java 8
Nombre de langages intégrent aujoud’hui des mécanismes de
programmation fonctionelle. En Java 8, c’est par le biais de Stream.
Example
List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(s -> s.toUpperCase())
.sorted()
.forEach(s -> System.out.print(s));
// c1c2
92
Plan
Introduction
Bases du langage
Structures de contrôle
Types/Classes
Navigateur
DOM
Événements
jQuery
Objets
Meteor
93
Full-stack Framework of Meteor
Meteor is a full-stack solution that contains:
I
frontend libraries
I
a Node.js-based server
I
a command-line tool
Useful sites:
I
Meteor site: https://www.meteor.com
I
Meteor documents: http://docs.meteor.com
I
Atmosphere: for exploring Meteor packages
https://atmospherejs.com
I
StackOverflow http://stackoverflow.com/questions/tagged/meteor
Meteor implements Reactive Programming
94
Structure of Meteor Applications
Creating a Meteor Application with three main drectories :
meteor create test
cd test
rm test.*
mkdir client server both
meteor
Now, you have to put your files at the right place. Some must be used:
I
only on the client
I
or only the server
or both on the client and the server
I
Remarque
For ressources (images, icons,...) you can build two additional folders
called public (available on the client) and private (available on the
server).
95
Templates
Building templates is made as simple as writing something that looks like
(to be put in a file in folder client):
<template name="myTemplate">
<p> hello ! </p>
</template>
It can now be used.
<body>
<p> Paragraphe before the template </p>
{{> myTemplate}}
<p> Paragraphe after the template </p>
</body>
It is just like a ”query replace”
96
Helpers
In a js file, we can introduce helpers, that typically are functions that can
be called withing the template.
Template.myTemplate.helpers({
hi : function() {
return "hi !";
},
square : function(i) {
return i*i;
}
});
We can use these helpers as follows:
<template name="myTemplate">
<p> hello ! </p>
<p> {{hi}} </p>
<p> The square of 10 is {{square 10}} </p>
</template>
97
Helpers
Sometimes, a helper returns an array. We can then use #each.
Template.myTemplate.helpers({
medals : function() {
return [
{metal:"Gold", rank:1},
{metal:"Silver", rank:2},
{metal:"Bronze", rank:3}
];
}
});
We can use this helper as follows:
<template name="myTemplate">
<p> Medals ! </p>
{{#each medals}}
<p> Metal: {{metal}} Rank: {{rank}}
{{/each}}
</template>
98
Helpers
What about an array of simple values?
Template.myTemplate.helpers({
days : function() {
return ["Mon","Tue","Wed","Thi","Fri","Sat","Sun"];
}
});
We can use this helper as follows:
<template name="myTemplate">
<p> Days of the week: </p>
{{#each days}}
<p> {{this}} </p>
{{/each}}
</template>
99
Helpers
Sometimes, a helper returns a cursor allowing us to iterate over the
documents of a collection. Again, we can use #each.
Imagine that we have a Mongo collection called Movies, containing
documents that systematically have two fields called title and length.
Template.myTemplate.helpers({
movies : function() {
return Movies.find({});
}
});
We can use this helper as follows:
<template name="myTemplate">
<p> My movies with their lengths: </p>
{{#each movies}}
<p> Title: {{title}} Length: {{length}}
{{/each}}
</template>
100
Listeners
We can also associate listeners for events concerning a template.
Template.myTemplate.events({
’click button’ : function(e) {
console.log("I have clicked on a button");
console.log(e);
},
’dblclick #toto’ : function() {
console.log("I have double clicked on #toto");
},
’change select’ : function() {
console.log("I have selected another option");
}
});
101