Leçon Javascript
Leçon Javascript
Leçon Javascript
ET D’INFORMATIQUE APPLIQUEE
(ESMIA)
--------------------------
MENTION : INFORMATIQUE, RISQUES ET DECISIONS
GRADE : LICENCE 2
--------------------------
Cours :
JAVASCRIPT
alert() est une instruction simple, appelée fonction, qui permet d'afficher une
boîte de dialogue contenant un message. Ce message est placé entre apostrophes,
elles-mêmes placées entre les parenthèses de la fonction alert().
La syntaxe d'une fonction se compose de deux choses : son nom, suivi d'un couple
de parenthèses (une ouvrante et une fermante). Entre les parenthèses se trouvent les
arguments, que l'on appelle aussi paramètres.
< script >
myFunction();
< /script>
Parexemple :
< script >
alert('Bonjour');
// la fonction affiche une boîte de dialogue avec "Bonjour"
< /script >
Pour éviter des problèmes de chargement sur les pages, il est conseillé de placer
les éléments <script> juste avant la fermeture de l’élément <body>.
Pour tester le code Javascript sans créer systématiquement des pages web :
http://jsfiddle.net/
2. Les variables
; elle ne peut pas commencer par un chiffre ni prendre le nom d'une fonction existante
de Javascript. On crée la variable et on lui affecte (ou attribue) une valeur :
<script>
var myVariable;
myVariable = 2
< /script >
OU
<script>
var myVariable = 2;
< /script >
Une variable peut être de type numérique, mais aussi une chaîne de caractères :
< script >
var text = 'J\'écris mon texte ici'; /* Avec des apostrophes, le \ sert à
échapper une apostrophe intégrée dans le texte, pour ne pas que Javascript
pense que le texte s'arrête là.*/
< /script >
Une variable peut enfin être de type booléen (boolean), avec deux états possibles
:
vrai ou faux (true ou false).
2.4. La concaténation
Une concaténation consiste à ajouter une chaîne de caractères à la fin d'une autre,
comme dans cet exemple :
<script>
Var hi = 'Bonjour ', name = 'toi', result;
result= hi + name;
alert(result);
// Affiche : « Bonjour toi »
</script>
OU
<script>
var text = 'Bonjour ';
text += 'toi';
alert(text); // Affiche « Bonjour toi ».
</script>
Une condition (true ou false) est un test qui permet de vérifier qu'une variable
contient bien une certaine valeur.
Il y en a 8 :
=== : contenu et type de
== : égal à variable égal à > supérieur à < : inférieur à
!= : différent de !== : contenu ou type >= supérieur ou égal à <= : inférieur ou égal à
de variable différent de
Il suffit d'écrire deux valeurs avec l'opérateur de comparaison souhaité entre les
deux et un booléen est retourné. Si celui-ci est true alors la condition est vérifiée, si
c'est false alors elle ne l'est pas :
<script>
var number1 = 2, number2 = 2, number3 = 4, result;
result = number1 == number2; // Au lieu d'une seule valeur, on en écrit
deux avec l'opérateur de comparaison entre elles
alert(result); // la condition est donc vérifiée car les deux variables
contiennent bien la même valeur
result = number1 == number3;
alert(result); // la condition n'est pas vérifiée car 2 est différent de 4
result = number1 < number3;
alert(result); // la condition est vérifiée car 2 est bien inférieur à 4
</script>
Il y en a 3 :
&& qui signifie ET avec par exemple : valeur1 && valeur2
Cet opérateur vérifie la condition lorsque toutes les valeurs qui lui sont passées valent
true.
|| qui signifie OU avec par exemple : valeur1 || valeur2
Cet opérateur est plus souple car il renvoie true si une des valeurs qui lui est soumise
contient true, qu'importent les autres valeurs.
! qui signifie NON avec par exemple : ! valeur
Cet opérateur se différencie des deux autres car il ne prend qu'une seule valeur à la fois.
S'il se nomme « NON » c'est parce que sa fonction est d'inverser la valeur qui lui est passée,
ainsi true deviendra false et inversement.
</script>
5. Les boucles
Une boucle sert à répéter une série d'instructions. La répétition (ou itération) se
fait jusqu'à ce qu'on dise à la boucle de s'arrêter. Pour une boucle, on pose une
condition, et la boucle se répète tant que la condition est vérifiée (true) , selon la
structure suivante :
< script >
while (condition) {
instruction_1;
instruction_2;
instruction_3;
}
</script >
Quand la boucle s'arrête, les instructions qui suivent la boucle sont executées :
< script >
var number = 1;
while (number < 10) {
number++; // Tant que le nombre est inférieur à 10, on l'incrémente de
1
}
alert(number); // Affiche : « 10 »
< /script >
while (true) {
prenom = prompt('Entrez un prénom :'); // L'utilisateur entre chaque prenom
if (prenom) {
prenoms += prenom + ' '; // Ajoute le nouveau prénom ainsi qu'une espace
} else {
break; // On quitte la boucle
}
} alert(prenoms); // Affiche les prénoms à la suite
</script>
Dans ce cas, la boucle est executée au moins une fois, après quoi on teste la
condition, selon la structure suivante :
< script >
do {
instruction_1;
instruction_2;
instruction_3;
}while (condition);
< /script >
Par exemple :
<script>
for (var iter = 1; iter<=5; iter++) { // On initialise une variable, et tant
qu'elle est inférieure ou égale à 5 on l'incrémente de 1.
alert('Itération n°' + iter); // A chaque fois on affiche une boîte de
dialogue (5
fois)
}
</script>
Et avec les
prénoms:
< script >
for (var prenoms = '', prenom; true;) { // ici sans incrémentation
nécessaire, mais avec un point-virgule obligatoire après la condition true
prenom = prompt('Entrez un prénom :');
if (prenom) {
prenoms += prenom + ' ';
} else {
break;
} }
alert(prenoms);
< /script >
6. Les fonctions
Par xemple :
< script >
function byTwo() {
var result = parseInt(prompt('Donnez le nombre à multiplier par 2
:')); alert(result * 2);
}
Attention : toute variable déclarée dans une fonction n'est utilisable que dans cette
même fonction. Ces variables spécifiques à une seule fonction ont un nom : les
variables locales. Déclarées en dehors des fonctions, on parle de variables globales.
< script >
var message = 'Ici la variable globale !';
function showMsg() {
var message = 'Ici la variable locale !';
alert(message);
}
showMsg(); // On affiche la variable locale
alert(message); // Puis la variable globale
< /script >
Mais on évite de créer des variables locales et globales qui portent le même nom.
En règle générale, on préfère utiliser des variables locales (pour éviter les confusions).
</script >
Une fonction peut retourner une seule valeur, stockée dans une variable :
< script >
function sayHello() {
return 'Bonjour !'; // L'instruction « return » suivie d'une valeur,
cette dernière est donc renvoyée par la fonction (il ne peut pas y en
avoir d'autres)
}
alert(sayHello());
Une fonction anonyme peut être utilisée, entre autres, par le biais d'une variable :
< script >
var sayHello =
function() {
alert('Bonjour !'); } ;
sayHello();
</script>
Les variables contiennent des objets, qui peuvent être des nombres, des chaînes
de caractères ou des booléens. Mais le Javascript n'est pas un langage orienté objet
(C++, C# ou Java), mais un langage orienté objet par prototype. Les objets
contiennent trois choses :
- un constructeur
- des
propriétés
- des
méthodes.
Par exemple :
< script >
var myString = 'Ceci est une chaîne de caractères'; // On crée un objet
String alert(myString.length); // On affiche le nombre de caractères, au moyen
de la propriété « length »
alert(myString.toUpperCase()); // On récupère la chaîne en majuscules, avec la
méthode toUpperCase(), l'inverse étant la méthode toLowerCase()
< /script >
La méthode unshift() fonctionne comme push(), excepté que les items sont
ajoutés au début du tableau. Les méthodes shift() et pop() retirent respectivement
le premier et le dernier élément du tableau.
< script >
var myArray = ['Rafael', 'Mathilde', 'Ahmed', 'Jérôme',
'Guillaume']; myArray.shift(); // Retire « Rafael »
myArray.pop(); // Retire « Guillaume »
alert(myArray); // Affiche « Mathilde,Ahmed,Jérôme
< /script >
On peut remplacer l'indice par un identifiant. Dans ce cas on crée un objet (dans
l'exemple family). Les identifiants créés (self, sister...) sont des propriétés, avec
plusieurs possibilités d'affichage (ce qui convient à toutes les propriétés, également
pour length par exemple). On peut ajouter des données (avec une méthode
différente que pour un tableau).
< script >
var family = { self: 'Rafael', sister: 'Mathilde', brother: 'Ahmed',
cousin_1: 'Jérôme', cousin_2: 'Guillaume' } ;
var id = 'sister';
alert(family[id]); // Affiche : « Mathilde »
alert(family.brother); // Affiche : « Ahmed »
alert(family['self']); // Affiche : « Rafael »
family['uncle'] = 'Pauline'; // On ajoute une donnée, avec un
identifiant.
family.aunt = 'Karim'; // On peut ajouter aussi de cette manière.
alert(family.uncle);
</script>
On ne peut pas parcourir l'objet avec for, parce for s'occupe d'incrémenter des
variables numériques. Là on fournit une variable-clé pour le parcours
< script >
var family = { self: 'Rafael', sister: 'Mathilde', brother: 'Ahmed',
cousin_1: 'Jérôme', cousin_2: 'Guillaume' } ;
for (var id in family) { // On stocke l'identifiant dans « id » pour
parcourir l'objet « family »
alert(family[id]);
}
</script >
8.3 . Exercice
Le DOM (Document Object Model) est une interface de programmation (ou API,
Application Programming Interface) pour les documents XML et HTML. Via le Javascript, le
DOM permet d'accéder au code du document ; on va alors pouvoir modifier des éléments du
code HTML.
Contrairement à ce qui a été vu avant, alert() n'est pas vraiment une fonction, mais
une méthode qui appartient à l'objet window, qui est implicite (il y a en fait très peu de
variables globales). Les deux lignes suivantes signifient la même chose :
< script >
alert('Hello world ! ');
window.alert('Hello world !
');
< /script >
L'objet document est un sous-objet de window. L'objet document possède trois méthodes
principales : getElementById(), getElementsByTagName() et getElementsByName().
Avec getElementById() :
On nous dit alors que div est un objet de type HTMLDivElement. Cela fonctionne.
On peut jouer sur les attributs d'une balise HTML avec l'objet Element et getAttribute()
et setAttribute(), permettant par exemple de modifier un lien :
<a id="myLink" href="http://www.un_lien_quelconque.com">Un lien modifié
dynamiquement< /a >
< script >
var link = document.getElementById('myLink');
var href = link.getAttribute('href'); // On récupère l'attribut « href »
alert(href);
link.setAttribute('href', 'http://blog.crdp-versailles.fr/rimbaud/'); // on édite
< /script >
Par contre on ne peut pas utiliser class, à remplacer par className en Javascript.
Comme for, à remplacer par htmlFor (le for du Javascript servant aux boucles utiles aux
fonctions).
Dans Internet Explorer (sauf IE9), innerText récupère le texte, pas les balises, et
textContent est sa version standardisée pour tous les autres navigateurs.
nœud :
ou :
Attention ! Les espaces et retours à la ligne effectués dans le code HTML sont
généralement considérés comme des nœuds textuels par les navigateurs. On utilise
alors firstElementChild, lastElementChild, nextElementSibling
et previousElementSibling, non supportés par IE8 et inférieur.
Avec le DOM, l'ajout d'un élément se fait en trois temps : on crée l'élément, on lui
affecte des attributs, on l'insère dans le document.
newLink.href = 'http://blog.crdp-versailles.fr/rimbaud/';
newLink.title = 'Découvrez le blog de la Classe Actu !';
newLink.setAttribute('tabindex', '10');
newLink.id = 'sdz_link';
newLink.href = 'http://blog.crdp-versailles.fr/rimbaud/';
newLink.title = 'Découvrez le blog de la Classe Actu !';
newLink.setAttribute('tabindex', '10');
document.getElementById('myP').appendChild(newLink); // le nouvel élément
est le dernier enfant dans le paragraphe avec id 'myP'
var newLinkText = document.createTextNode("Le Tonnerre de Rimbaud");
newLink.appendChild(newLinkText); // ces deux lignes pour ajouter le texte
< /script >
Exercice 1.
Passez ce code HTML en script :
<div id="divTP1">
Exercice 2.
Passez le code HTML en script, en utilisant une boucle for :
<div id="divTP2">
<p>Langages basés sur ECMAScript :< /p >
<ul>
<li>JavaScript< /li >
<li>JScript< /li >
<li>ActionScript< /li >
<li>EX4</li>
</ul>
< /div >
Exercice 3.
Passez le code HTML en script :
<div id="divTP4">
<form enctype="multipart/form-data" method="post" action="upload.php">
< fieldset >
<legend>Uploader une image< /legend >
<div style="text-align: center">
<label for="inputUpload">Image à uploader :< /label >
<input type="file" name="inputUpload" id="inputUpload" />
< br /><br / >
<input type="submit" value="Envoyer" />
< /div >
< /fieldset>
</form></div >
Quelques exemples :
>
ou :
ou :
cliqué !');
Les méthodes focus() et blur() pour donner ou retirer le focus sur un événement.
<input id="text" type="text" value="Entrez un texte" /><br /><br />
Ou :
function Person(nick, age, sex, parent, work, friends) {
this.nick = nick;
this.age = age;
this.sex = sex;
this.parent = parent;
this.work = work;
this.friends = friends;
this.addFriend = function( nick, age, sex, parent, work, friends
){
this.friends.push(new Person(nick, age, sex, parent, work,
friends));
};
}
'test2'].concat(['test3', 'test4']);
'test3', 'test4']
});
alert(myArray.indexOf(element2)); // Affiche : 1
myArray.reverse();
myArray.sort();
myArray.sort(function (a, b) {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
});
La méthode slice()pour extraire une partie d'un tableau (avec deux arguments, le premier,
inclus, auquel on commence l'extrait, le deuxième, facultatif, non inclus, auquel on termine
l'extrait) :
var myArray = [1, 2, 3, 4, 5];
ou :
Et aussi :
push() : ajoute un ou plusieurs éléments à la fin du tableau (un argument par élément
ajouté) et retourne la nouvelle taille de ce dernier.
pop() : retire et retourne le dernier élément d'un tableau.
unshift() : ajoute un ou plusieurs éléments au début du tableau (un argument par
élément ajouté) et retourne la nouvelle taille de ce dernier.
shift() : retire et retourne le premier élément d'un tableau.
Pour passer d'une chaîne de caractères primitive ou d'un tableau primitif à un objet :
var myString = "Chaîne de caractères primitive";
var myRealString = new String("Chaîne");
var myArray = []; // Tableau primitif
var myRealArray = new Array();
var myObject = {}; // Objet primitif
var myRealObject = new Object();
var myBoolean = true; // Booléen primitif
var myRealBoolean = new Boolean("true");
var myNumber = 42; // Nombre primitif
var myRealNumber = new Number("42");
Le regex :
var myRegex = /contenu_à_rechercher/;
On peut convenir d'un intervalle de lettre (de a à j : [a-j]), ou encore [a-zA-Z] pour ne
pas tenir compte de la casse, ou [0-9] pour tous les chiffres, ou encore [a-z0-9]. On peut
ignorer des lettres avec [^aeiou] ou [^b-f]. Mais il faut préciser les caractères accentuées,
et utiliser i pour la casse (qui fonctionne aussi pour les caractères accentués) : [^a-
zâäàéèùêëîïôöçñ]/i. Le point désigne un caractère quelconque /gr.s/ On peut utiliser des
symboles quantificateurs :
? : ce symbole indique que le caractère qui le précède peut apparaître 0 ou 1
fois ; + : ce symbole indique que le caractère qui le précède peut apparaître 1
ou x fois ; * : ce symbole indique que le caractère qui le précède peut
apparaître 0, 1 ou x fois. On peut préciser plutôt le nombre de fois :
Ou encore :
var total = 'J\'ai 25 euros en liquide.';
total = total.replace(/euros?/, '€');
alert(total);// J'ai 25 € en liquide
Objet Math
alert(Math.PI); // Affiche la valeur du nombre pi
alert(Math.E); // Affiche la valeur du nombre d'Euler
Math.ceil(33.15); // Retourne : 34
Math.ceil(33.95); // Retourne : 34
Math.ceil(34); // Retourne : 34
Math.round(33.15); // Retourne : 33
Math.round(33.95); // Retourne : 34
Math.round(34); // Retourne : 34
Convertir :
var myString = '08';
alert(parseInt(myString)); // Affiche : 0
alert(parseInt(myString, 10)); // Affiche : 8
Huit méthodes :
getFullYear() : renvoie l'année sur 4
chiffres ; getMonth() : renvoie le mois (0 à
11) ;
getDate() : renvoie le jour du mois (1 à
31) ;
getDay() : renvoie le jour de la semaine (0 à 6, la semaine commence le
dimanche) ;
getHours() : renvoie l'heure (0 à 23) ;
getMinutes() : renvoie les minutes (0 à 59) ;
getSeconds() : renvoie les secondes (0 à 59) ;
getMilliseconds() : renvoie les millisecondes (0 à 999).
getTime() renvoie le timestamp de la date de votre objet ;
setTime() vous permet de modifier la date de votre objet en passant en unique
paramètre un timestamp.
Ou encore :
< button id="myButton">Annuler le compte à rebours (5s)</button >
< script >
( function() { var button = document.getElementById('myButton'), timeLeft
= 5; var timerID = setTimeout(function() { // On crée notre compte à rebours
clearInterval(intervalID);
button.innerHTML = "Annuler le compte à rebours (0s)";
alert("Vous n'êtes pas très réactif vous !"); } , 5000);
var intervalID = setInterval(function() { // On met en place l'intervalle
pour afficher la progression du temps button.innerHTML = "Annuler le
compte à rebours (" + - -timeLeft + "s)";
} , 1000);
button.onclick = function() { clearTimeout(timerID);
// On annule le compte à rebours clearInterval(intervalID);
// Et l'intervalle alert("Le compte à rebours a bien été
annulé."); } ;
})() ;
< /script >
Body :
< body >
<a href="images/circuit_html.jpg" title="Afficher l'image
originale"><img src="images/circuit_html_min.jpg" alt="Miniature" /></a> <!--
on pourrait avoir plusieurs images en portfolio -->
< div id="overlay"></div >
Script :
< script > var links = document.getElementsByTagName('a'), linksLen =
links.length; for (var i = 0 ; i < linksLen ; i++) { links[i].onclick =
function() { // Vous pouvez très bien utiliser le DOM-2 displayImg(this); // On appelle
notre fonction pour afficher les images et
on lui passe le lien concerné return false; // Et on bloque la redirection } ; }
function displayImg(link) { var img = new Image(), overlay =
document.getElementById('overlay');
overlay.appendChild(img);
AJAX est l'acronyme d'Asynchronous Javascript and XML, ce qui, transcrit en français,
signifie « Javascript et XML asynchrones ». Derrière ce nom se cache un ensemble de
technologies destinées à réaliser de rapides mises à jour du contenu d'une page Web, sans
qu'elles nécessitent le moindre rechargement visible par l'utilisateur de la page Web. Cela
permet par exemple l'autocomplétion (mots possibles lors d'une recherche) ou encore la
sauvegarde automatique.
Plusieurs formats existent pour le transfert de données : un fichier texte, HTML, XML pour
de nombreuses données (eXtensible Markup Language), JSON pour de petits transferts
(JavaScript Object Notation). Pour le texte et le HTML, il n'y a pas de traitement, alors que
c'est différent avec XML et JSON.
XML :
< ?xml version="1.0" encoding="utf-8"? >
< table >
< line >
JSON :
{
Membre1: { posts: 6230, inscription: '22/08/2003'
} ,
Membre2 { posts: 200, inscription: '04/06/2011'
}
}
Avec JSON, on peut utiliser la méthode parse(), qui prend en paramètre la chaîne de
caractères à analyser et retourne le résultat sous forme d'objet JSON, la méthode
stringify(), qui permet de faire l'inverse (elle prend en paramètre un objet JSON et retourne
son équivalent sous forme de chaîne de caractères). Le JSON permet aussi d'envoyer des
données (json_encode() et json_decode() depuis PHP 5.2).
20.2 . XMLHttpRequest
Avec :
xhr.open('GET', 'http://mon_site_web.com/ajax.php'); xhr.send(null) ;
Avec GET :
xhr.open('GET', 'http://mon_site_web.com/ajax.php?param1=' +
value1 + '¶m2=' + value2);
Avec POST :
xhr.open('POST', 'http://mon_site_web.com/ajax.php');
xhr.setRequestHeader("Content-Type", "application/x-www-formurlencoded");
xhr.send('param1=' + value1 + '¶m2=' + value2);
var frame =
document.getElementById('myFrame'); frame =
frame.contentDocument || frame.document;
<iframe src="file.html"
name="myFrame"
id="myFrame"></iframe>
<script>
function trigger() {
var frame =
document.getElementById('myFrame');
frame = frame.contentDocument ||
frame.document;
alert('Page chargée !');
}
</script>
et dans l'iframe :
<script>
window.top.window.trigger(); // On appelle ici notre fonction de callback
</script>
<p>Lorem ipsum dolor sit amet,
consectetuer adipiscing elit.<br />
Suspendisse molestie suscipit
arcu.</p>
action="request.php" target="myFrame">
<div>
name="nick" />
onclick="sendForm();" />
</div>
</form>
id="myFrame"></iframe>
<script>
function sendForm() {
var nick =
document.getElementById("nick").value;
if (nick) { // Si c'est OK
document.getElementById("myForm").submit(
); // On envoie le formulaire
} }
function receiveData(data) {
} </script>
</script>
Par exemple :
dans HTML :
< script >
function sendDSL() {
var scriptElement = document.createElement('script');
scriptElement.src = 'dsl_script.js';
document.body.appendChild(scriptElement);
}
function receiveMessage(message) {
alert(message);
}
< /script >
et le fichier dsl_script.js :
receiveMessage('Ce message est envoyé par le serveur !');
Ou avec du PHP :
le fichier HTML :
} function receiveMessage(message) {
alert(message);
}
< /script >
le fichier dsl_script.php :
< ?php header("Content-type: text/javascript");
? >
var string = 'Bonjour
<?php echo $_GET['nick'] ?> !';
receiveMessage(string);
dans dsl_script_json.php :
< ?php header("Content-type:
text/javascript"); echo 'var softwares = {
"Adobe": [
"Acrobat",
"Dreamweaver",
"Photoshop",
"Flash"
] ,
"Mozilla": [
"Firefox",
"Thunderbird",
"Lightning"
] ,
"Microsoft": [
"Office",
"Visual C# Express",
"Azure"
]
} ;'; ?>
receiveMessage(softwares);
( nécessite un serveur )
l'ordre alphabétique
$results = array(); // Le tableau où
seront stockés les résultats de la recherche
// La boucle ci-dessous parcourt tout le
tableau $data, jusqu'à un maximum de 10
résultats
for ($i = 0 ; $i < $dataLen &&
( avec towns.txt )
Le fichier HTML :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
On peut créer des rectangles, des arcs, context.moveTo(20, 20); // 1 er point mais aussi des
chemins et courbes de Béziers : context.lineTo(130, 20); // 2e point
context.lineTo(130, 50); // 3e
< script > context.lineTo(75, 130); // 4e var canvas =
document.querySelector('#canvas'); context.lineTo(20, 50); // 5e
var context = context.closePath(); // On relie le
5 e au 1er
canvas.getContext('2d');
context.stroke();
context.strokeStyle = "rgb(23, 145,
167)"; < /script >
context.beginPath();
180) * 220, (Math.PI / 180) *
320); context.stroke(); <
/script >
Les extrémités des chemins peuvent être butt (par défaut, droites), round
(arrondies) ou square (avec un carré qui dépasse de chaque côté).
lineJoin permet de gérer les intersections, avec round, bevel ou mitter.
Avec un exemple :
< script > var canvas = document.querySelector('#canvas');
var context = canvas.getContext('2d');
var linear = context.createLinearGradient(0, 0, 0, 150);
linear.addColorStop(0, 'white');
linear.addColorStop(0.5, '#1791a7');
linear.addColorStop(0.5, 'orange');
linear.addColorStop(1, 'white');
context.fillStyle = linear;
context.fillRect(10, 10, 130, 130);
</script>
Ou :
var radial = context.createRadialGradient(75,
75, 0, 130, 130, 150);
radial.addColorStop(0, '#1791a7');
radial.addColorStop(1, 'white');
context.fillStyle = radial;
L'API File permet de récupérer le nom d'un fichier sur l'ordinateur de l'usager :
< input id="file" type="file" multiple / >
< script > document.querySelector('#file').onchange =
function() { alert(this.files[0].name);
} ;
< /script >
.draggable {
display: inline-block;
margin: 20px 10px 10px 20px;
padding-top: 20px;
width: 80px;
height: 60px;
color: #3D110F;
background-color: #822520;
border: 4px solid #3D110F;
text-align: center;
font-size: 2em;
cursor: move;
-moz-transition: all 200ms linear;
-webkit-transition: all 200ms linear;
-o-transition: all 200ms linear;
transition: all 200ms linear;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
user-select: none;
}
</style>
var dndHandler = this; // Cette variable est nécessaire pour que l'événement "dragstart" ci-
dessous accède facilement au namespace "dndHandler" element.addEventListener('dragstart',
function(e) { dndHandler.draggedElement = e.target; // On sauvegarde l'élément en
déplacement e.dataTransfer.setData('text/plain', ''); // Nécessaire pour
Firefox }, false); } ,
applyDropEvents: function(dropper) {
dropper.addEventListener('dragover', function(e) {
e.preventDefault(); // On autorise le drop d'éléments
this.className = 'dropper drop_hover'; // Et on applique le design
adéquat à notre zone de drop quand un élément la survole
} , false); dropper.addEventListener('dragleave', function() {
this.className = 'dropper'; // On revient au design de base lorsque l'élément quitte la zone de drop
}); var dndHandler = this; // Cette variable est nécessaire pour que l'événement
"drop"
ci-dessous accède facilement au namespace "dndHandler"
dropper.addEventListener('drop', function(e) {
var target = e.target,
draggedElement = dndHandler.draggedElement, // Récupération de l'élément concerné
clonedElement = draggedElement.cloneNode(true); // On créé immédiatement le clone de cet élément
while(target.className.indexOf('dropper') == -1) { // Cette boucle permet de
remonter jusqu'à la zone de drop parente target =
target.parentNode;
}
target.className = 'dropper'; // Application du design par défaut
clonedElement = target.appendChild(clonedElement); // Ajout de l'élément cloné
à la zone de drop actuelle dndHandler.applyDragEvents(clonedElement); //
Nouvelle application des
événements qui ont été perdus lors du cloneNode()
draggedElement.parentNode.removeChild(draggedElement); // Suppression de l'élément d'origine
});
}
} ;
var elements = document.querySelectorAll('.draggable'),
elementsLen = elements.length; for(var i = 0 ; i < elementsLen ; i++) {
dndHandler.applyDragEvents(elements[i]); // Application des paramètres
nécessaires aux élément déplaçables
}
var droppers = document.querySelectorAll('.dropper'), droppersLen =
droppers.length; for(var i = 0 ; i < droppersLen ; i++) {
dndHandler.applyDropEvents(droppers[i]); // Application des événements
nécessaires aux zones de drop
}
})() ;
< /script >
< /body >
< /html >