Affichage des articles dont le libellé est Evt. Afficher tous les articles
Affichage des articles dont le libellé est Evt. Afficher tous les articles
event
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Show Event properties</title>
<style>
table { border-collapse: collapse; }
thead { font-weight: bold; }
td { padding: 2px 10px 2px 10px; }
.odd { background-color: #efdfef; }
.even { background-color: #ffffff; }
</style>
<script>
function showEventProperties(e) {
console.log("entre");
function addCell(row, text) {
var cell = row.insertCell(-1);
cell.appendChild(document.createTextNode(text));
}
var e = e || window.event;
document.getElementById('eventType').innerHTML = e.type;
var table = document.getElementById('tab');
table.innerHTML=""; //reset
var thead = table.createTHead();
var row = thead.insertRow(-1);
var lableList = ['#', 'Property', 'Value'];
var len = lableList.length;
for (var i=0; i<len; i++) {
addCell(row, lableList[i]);
}
var tbody = document.createElement('tbody');
table.appendChild(tbody);
for (var p in e) {
row = tbody.insertRow(-1);
row.className = (row.rowIndex % 2)? 'odd':'even';
addCell(row, row.rowIndex);
addCell(row, p);
addCell(row, e[p]);
}
document.body.appendChild(table);
}
window.onload = function(event){
//showEventProperties(event);
}
</script>
</head>
<body>
<h1>Properties of the DOM <span id="eventType"></span> Event Object</h1>
<table id="tab"></table>
<script>
var elem = document.getElementById('eventType').parentElement;
//elem.addEventListener("mouseenter", showEventProperties, false);
elem.addEventListener("mouseleave", showEventProperties, false);
//elem.addEventListener("mousemove", showEventProperties, false);
elem.addEventListener("click", showEventProperties, false);
</script>
</body>
</html>
event : onload
Il est classique de lancer une fonction lorsque la page est chargée (on garantie que la structure du dom est en mémoire).
window.onload = function() {
corps de la fonction
};
ici la fonction est anonyme, elle ne sera pas réutilisée.
Par exemple :
window.onload = function() {
test("Compris ?", function() {
assert("oui", "oui");
});
};
Remarquer la syntaxe classique de la fonction test. Elle dispose d'un argument qui est elle même une fonction. Cette fonction est souvent une fonction de callBack. Ici la fonction de callBack est anonyme est contient un appel à une fonction assert.
Exemple complet :
(function() {
var results;
this.assert = function assert(value, desc) {
var li = document.createElement("li");
li.className = value ? "pass" : "fail";
li.appendChild(document.createTextNode(desc));
results.appendChild(li);
if (!value) {
li.parentNode.parentNode.className = "fail";
// si un faux le test est faux
}
return li;
};
this.test = function test(name, fn) {
results = document.getElementById("results");
results = assert(true, name).appendChild(
document.createElement("ul"));
fn();
};
})();
window.onload = function() {
test(" test ", function() {
assert(2==2, "2==2");
assert(1=='1', "1=='1'");
assert(1==='1', "1==='1'");
});
test("Compris ?", function() {
assert("oui", "oui");
assert(true,"oui oui oui");
});
test("(function(){})()", function() {
assert(null, "dur dur");
assert(5, " du courage");
});
};
window.onload = function() {
corps de la fonction
};
ici la fonction est anonyme, elle ne sera pas réutilisée.
Par exemple :
window.onload = function() {
test("Compris ?", function() {
assert("oui", "oui");
});
};
Remarquer la syntaxe classique de la fonction test. Elle dispose d'un argument qui est elle même une fonction. Cette fonction est souvent une fonction de callBack. Ici la fonction de callBack est anonyme est contient un appel à une fonction assert.
Exemple complet :
(function() {
var results;
this.assert = function assert(value, desc) {
var li = document.createElement("li");
li.className = value ? "pass" : "fail";
li.appendChild(document.createTextNode(desc));
results.appendChild(li);
if (!value) {
li.parentNode.parentNode.className = "fail";
// si un faux le test est faux
}
return li;
};
this.test = function test(name, fn) {
results = document.getElementById("results");
results = assert(true, name).appendChild(
document.createElement("ul"));
fn();
};
})();
window.onload = function() {
test(" test ", function() {
assert(2==2, "2==2");
assert(1=='1', "1=='1'");
assert(1==='1', "1==='1'");
});
test("Compris ?", function() {
assert("oui", "oui");
assert(true,"oui oui oui");
});
test("(function(){})()", function() {
assert(null, "dur dur");
assert(5, " du courage");
});
};
Paramêtres des fonctions
Un argument passé par valeur est copié, et c'est la copie qui est manipulée par la fonction. Ainsi toute modification de cette copie n'entraîne donc aucun changement dans la donnée d'origine. Ce qui n'est pas le cas pour un passage par référence.
Comment sont passés les arguments en JS ?
les variables ou objets sont toujours passés par valeur
Mais la valeur dépend du type de l'argument.
Pour les types natifs (number, string ....), c'est par valeur et pour les tableaux et autres objets se sera la valeur de la référence.
Passage valeur
let age = 50;function changeAgeNatif(age) {
age++;
}
function changeAgeObject(person) {
person.age++;
}
changeAgeNatif(age);
console.log(age);
Passage référence
function Person(age) {this.age = age;
}
let denis = new Person(50);
function changeAgeObject(person) {
person.age++;
}
changeAgeObject(denis);
console.log(denis.age);
fichier⏩
JS Bin on jsbin.com
Des fonctions peuvent être passées en arguments
exemple :
var values = [0,3,2,1];
console.log(values);
values.sort(function(value1,value2){ return value2 - value1; });
console.log(values);
fichier2⟴
Cas des fonctions en argument : perte du contexte.
function Person(age) {this.age = age;
}
Person.prototype.changeAgeObject = function(){
this.age++;
};
let denis = new Person(50);
denis.changeAgeObject();
console.log(denis.age);
// passage fonction en argument et perte du this
function test(methode) {
methode();
}
test(denis.changeAgeObject);
console.log(denis.age);
En Javascript, quand on passe une méthode en argument, on perd le contexte.
Voici la correction, il faut explicitement lier la fonction au contexte !
test(denis.changeAgeObject.bind(denis));
console.log(denis.age);
On s'accroche voici le code de bind :
Function.prototype.bind = function(obj) {
var method = this;
temp = function() {
return method.apply(obj, arguments);
};
return temp;
};
Comprendre ce code est l'objectif de J. rezig dans son livre Javascript Ninja
Paramètres sur les events
Passage de paramètres
Nous voulons écrire un code qui affiche le numéro du div !
Explication :
Lire l’article pour comprendre que la valeur des variables peut être modifiée (portée par copie d’adresse et non de valeur)
JS Bin on jsbin.com
JS Bin on jsbin.com
Regarder un autre exemple de closure !
JS Bin on jsbin.com
"this particular topic can be very powerful and very complex" J. Resig.
Je vous laisse tester les codes suivant : bonne chance
Code !
JS Bin on jsbin.comExplication :
Lire l’article pour comprendre que la valeur des variables peut être modifiée (portée par copie d’adresse et non de valeur)
Code !
Code !
Code !
JS Bin on jsbin.comCode final
JS Bin on jsbin.comRegarder un autre exemple de closure !
JS Bin on jsbin.com
Passage de paramêtres Event
Prenons l'exemple de mozilla pour illustrer le passage de paramètre à un événement
JS Bin on jsbin.com
JS Bin on jsbin.com
JS Bin on jsbin.com
Cette solution n'est pas applicables dans le cas de boucles !
Les closures sont très utiles pour le passages de paramètre lors d'un événement
JS Bin on jsbin.com
JS Bin on jsbin.com
JS Bin on jsbin.com
JS Bin on jsbin.com
Cette solution n'est pas applicables dans le cas de boucles !
Les closures sont très utiles pour le passages de paramètre lors d'un événement
JS Bin on jsbin.com
Evénements la propagation
Nous allons utiliser le débogeur pour mieux comprendre la propagation des événements dans le DOM.
Il va de soit que body contient les balises. Supposons que Body contienne un p. Si vous cliquer à l'endroit où se trouve le paragraphe, vous avez cliqué sur le body et sur le paragraphe ?
Mais dans quel ordre !
La réponse est la suivante : c'est vous qui choisissez.
Examinons le cas, où l'on considère que vous avez cliqué d'abord sur le Body puis sur le paragraphe ; autrement dit il y a propagation de l'événement par le bas (voir figure précédente)
Remarquez le troisième paramètre de EventListener à true.
Utiliser le débogueur pour observer les priorités en mettant deux points d'arrêts (lig. 30, 37) et relancer le débogueur.
Lancer l'exécution et cliquer sur le paragraphe
Avancer le débogueur : on voit que body a réagi.
Avancer le débogueur : on voit que le paragraphe à réagi.
Remarquez le troisième paramètre à false.
Comme précédemment, mettre deux points d'arrêts et lancer l'exécution puis cliquer sur le paragraphe
Avancer le débogueur : c'est maintenant le paragraphe qui réagi en premier.
Avancer le débogueur : c'est au tour du body.
Il va de soit que body contient les balises. Supposons que Body contienne un p. Si vous cliquer à l'endroit où se trouve le paragraphe, vous avez cliqué sur le body et sur le paragraphe ?
Mais dans quel ordre !
"Qui de la poule ou de l’œuf était avant ?"
un p dans un body : sens de propagation des événement |
La réponse est la suivante : c'est vous qui choisissez.
Examinons le cas, où l'on considère que vous avez cliqué d'abord sur le Body puis sur le paragraphe ; autrement dit il y a propagation de l'événement par le bas (voir figure précédente)
Cas Body->paragraphe
Remarquez le troisième paramètre de EventListener à true.
addEventListener(event, callback , true);
Utiliser le débogueur pour observer les priorités en mettant deux points d'arrêts (lig. 30, 37) et relancer le débogueur.
Lancer l'exécution et cliquer sur le paragraphe
Avancer le débogueur : on voit que body a réagi.
Cas paragraphe->body
Remarquez le troisième paramètre à false.
addEventListener(event, callback , False);
Comme précédemment, mettre deux points d'arrêts et lancer l'exécution puis cliquer sur le paragraphe
Avancer le débogueur : c'est maintenant le paragraphe qui réagi en premier.
Comparaison : le troisième paragraphe permet de contrôle le sens de propagation.
Le style est d'abord appliqué au body (1 cas)
Le style est d'abord appliqué au paragraphe (2 cas)
Stop propagation
On peut empêcher la propagation de l'événement.
Les événements : quoi faire
Voici dans l'ordre le code à générer
Utilisation de PreventDefault
- // Step : Find the element we want the event on
- // Step : Define the event listener function
- // Step : Attach event listener to element
Utilisation de PreventDefault
Preventing default behavior of events
Made using: Khan Academy Computer Science.
Event : en action
Exemple d'utilisation de l'événement window.onscroll
JS BinHow to do
http://html5-demos.appspot.com/static/css/sticky.html