Le JSON ( Javascript Object Notation) est un format d’échange de données très utilisé dans le domaine du web et pas forcément que dans du Javascript. En fait PHP aussi possède des fonction pour encoder un tableau associatif en tableau JSON.
Vous aurez besoin de JSON quand vous allez faire de l’AJAX. Où quand vous allez faire appel à une API chez n’importe quel fournisseur de service Saas possédant une API digne du nom.
Explication de la syntaxe JSON
Un objet JSON est écrit dans des accolades.
{action:edit,id:1956} cette chaîne JSON va inclure comme clé de tableau action et id. Par exemple vous avez une application web en AJAX qui permet d’éditer, d’effacer, un article ou un item identifié par son id. Quand vous cliquez sur le lien « Editer », une action AJAX va envoyer un tableau JSON contenant comme information le type d’action et l’id de l’objet à effacer.
Utiliser en PHP et AJAX
On utilise couramment JQuery pour des traitement AJAX, n’essyez pas de le coder vous même en Javascript pure (compliqué, sujet aux erreus)
Imaginons que vous avez une page html dynamique écrite avec PHP et que vous avez un bouton qui va rafraichir une partie de la page (cours de bourse de Michelin par exemple), en cliquant sur le lien « Rafraichir cours de bourse », un appel AJAX est fait à un script PHP « update_cours_de_bourse.php » (dans la réalité je le nommerais do.php tout simplement).
Ce fichier do.php va calculer le cours de bourse de Michelin et retourner un tableau JSON, on utilisera simplement la commande echo de PHP pour afficher les valeurs JSON :
echo {label:michelin,cours:26.5}
le résultat sera lu par JQuery de la page appelante, grâce à une fonction callback (une fonction qui lit la valeur retournée par la page do.php).
Dans javascript on connaissait jusqu’en ES6 deux façon de déclarer des fonctions, les fonctions nommées et les fonctions anonymes.
Déclaration de fonctions nommées :
function saluer(nom){
console.log('Bonjour ' + nom)
}
Les fonctions anonymes
function (nom){
console.log('Bonjour ' + nom)
}
Depuis ES6 vous pouvez déclarer les fonction flèches !
Attention les fonctions flèches ne sont pas équivalentes aux fonction nommées. Une fonction flèche n’a pas de this. Les fonctions flèches sont toujours anonymes. Elles ne peuvent être utilisé comme constructeur.
const add = (a) => return a + 5
add(5) //10
Les fonctions flèches ne sont pas à utiliser en tant que méthode
D’abord c’est quoi la différence entre une fonction et une méthode?
une méthode est une fonction définie en tant que propriété d’un objet, sinon pas de différence au niveau de la syntaxe. Dans le cas des fonctions flèches, il y a une différence de comportement vis à vis de this.
Alors qu’une fonction anonyme connait son propre this, une fonction flèche n’a pas son propre this, comme l’atteste l’affichage, le this de la fonction se réfère à l’objet Window.
Les fonctions flèches n’ont pas de constructeur
var Foo = function{}()
var f = new Foo()
var Bar = () => {}
var b = new Bar() //Uncaught TypeError : Foo is not a constructor
Si vous faites du Web, vous avez sans doute entendu abondamment parler de Ecmascript 6. C’est une norme qui décrit la syntaxe du langage Javascript (pour simplifier)
Voyons les innovations syntaxiques que vous devez absolument connaitre car tous les navigateurs les utilisent aujourd’hui.
Déclaration de variable avec var (méthode historique)
Jusqu’à présent vous ne déclariez les variables qu’avec var.
Or il cause beaucoup de poblèmes : son scope est global à l’objet window.
var prenom = "Yvon"
On dit que son scope (sa portée) est globale. Si vous venez du monde du php, vous avez dû voir qu’on peut déclarer une variable comme globale avec le mot clé global.
Pour des raisons de bonne pratique de sécurité, il faut éviter de déclarer des variables globales.
Revenons au Javascript, var déclare une variable de porté globale, c’est à dire qu’elle peut être utilisée partout.
Jusqu’à récemment avant ES6, nous ne pouvions déclarer de variable de porté de type bloc. Un bloc est tout ce qui est compris dans une parie d’accolade.
Une variable de type bloc, de portée bloc, n’existe que dans la paire d’accolade, en dehors on ne la connait pas.
Historiquement var a été introduit pou faciliter la programmation, afin que les programmeurs novices puissent utiliser rapidement Javascript. Mais au fil du temps cela s’est avéré être un mauvais choix. Aujourd’hui (seulement) les concepteur du langage on décidé d’introduire deux nouvelles façons de déclarer une variable. Ces deux nouvelles façons const et let déclarent des variables de porté de bloc.
Déclaration de variable avec const
A la différence de PHP par exemple, const ne déclare pas une constante ! La signification de const est que le binding est constant, invariable, vous ne pouvez pas réassigner la variable à un pointeur différent, mais vous pouvez modifier sa valeur. En Javascript, la notion de constante existe dans le cadre de la programmation fonctionnelle via des librairie comme immutable.js .
cont prenom = "Yvon"
Pour vous montrer que const a sa valeur qui peut changer :
On peut modifier une propriété d’un objet litéral. eleve est bindée par référence à cet objet. Mais si on essai de réaffecter par référence :
const eleve ={ prenom :'yvon', nom :'huynh'} eleve ={ prenom :'toto'} console.log(eleve.prenom)// Uncaught TypeError: Assignment to constant variable.
Une autre particularité de const est que vous devez initialiser dè sla déclaration de la variable, sinon vous avez une erreur.
const pays;//Uncaught SyntaxError: Missing initializer in const declaration
Block scope avec const
Enfin regardons l’aspect le plus important concernant const, il est block scoped, c’est à dire qu’en dehors (à l’extérieur) des accolades où la variable a été définie, elle n’existe pas.
functionsaluer(ami){const pays ='France'if(pays ==='France'){const greet =' Monsieur' console.log('Bienvenue en '+ pays + greet)} console.log('A une autre fois en '+ pays) console.log('Au revoir '+ greet)}saluer('Yvon')// imprime Bienvenue en France Monsieur,A une autre fois en France, mais affiche Uncaught ReferenceError: greet is not defined
Alors que pays reste en valable, greet n’est plus connue en dehors des accolades où greet a été définie.
Un exemple encore plus flagrant on va créer deux variables portant le même nom,mais avec des valeurs différentes :
const ville ='Paris'functionsaluer(nom){const ville ='Nantes' console.log('bienvenue à '+ ville)}saluer('Yvon')//bienvenue à Nantes console.log('Euh non on est à ' + ville) //Euh non on est à Paris
Nantes ne peut exister en dehors des accolades de la fonction.
Peut on rendre une variable const vraiment immuable?
Même si dans votre vie vous aurez probablement peu l’opportunitéde rendre un objet immuable, il existe une façon de rendre immuable une variable déclarée avec const.
const eleve = Object.freeze({prenom :'yvon', adresse :{ rue :' De gaulle', ville :'Nantes', codepostal :44000}}) eleve.prenom ='Julien' console.log(eleve.prenom)// yvon
Vous remarquez que la propriété prenom est inchangée. Si vous utilisez « use strict »; vous aurez une erreur Uncaught TypeError: Cannot assign to read only property ‘prenom’ of object ‘#
Object.freeze est ‘shallow’ comme on dit en anglais, cela veut dire que vous pouvez quand même altérer les propriétés des objets imbriquée.
"use strict";const eleve = Object.freeze({prenom :'yvon', adresse :{ rue :' De gaulle', ville :'Nantes', codepostal :44000}}) eleve.adresse.codepostal =44100 console.log(eleve.adresse.codepostal)// 44100
Le code ci-dessus est tout à fait valide.
A quoi ça sert const en Javascript?
On dit que les variables déclarées avec const sont « block scoped ». Un bloc c’est ce qui est entre accolade dans la définition d’une fonction. C’est pour pallier au défaut de var (qui est défini dans les accolades d’une fonction, on dit que var est function scoped), qu’on a introduit const afin de mieux structurer son code et d’éviter des collisions.
Qu’est ce que la Temporal Dead Zone?
Lorsqu’un code javascrip est exécuté, une variable ne peut être settée ou gettée tant que l’exécution n’a pas atteint la ligne de code où la variable a été définie.
functionsaluer(name){// début de la fonction if(name === 'yvon'){ //début du block var ville = 'Paris' console.log('Pays = ' + pays + ' Ville destination = ' + ville) var pays = 'France' } } saluer('yvon') // Pays = undefined Ville destination = Paris
On voit que la variable pays étant définie après le console.log, il est à undefined. Par contre que se passe-t-il si on a const à la place de var ?
functionsaluer(name){// début de la fonction if(name === 'yvon'){ //début du block var ville = 'Paris' console.log('Pays = ' + pays + ' Ville destination = ' + ville) const pays = 'France' } } saluer('yvon') //Uncaught ReferenceError: pays is not defined
Vous avez une erreur (un avertissement) comme quoi votre variable n’est pas définie. Au moment ou le console.log s’exécute, pays n’est pas encore définie, elle n’a pas de valeur attribuée. L’utilité de la Temporal Dead Zone (TDZ) est de vous permettre de coder plus proprement, en lançant des avertissements.
Quelle est la différence entre Window, Document, Screen?
Window est l’objet principal du DOM, le document object model, qui est la base de la page web et quand je dis la base ça comprend vraiment tout, les images, les scripts javascript, et autres objets, bref ce que vous voyez dans la fenêtre de votre navigateur.
Quand vous faite un script javascript, vous ne le savez peut être pas, mais vous utiliser une méthode ou un objet de l’objet Window, qui est le parent de tous les objets javascripts.
Document est un sous objet de Window. Document est en fait la vraie partie visible de la page qui est dans votre navigateur.
Pour savoir ce que l’objet Window contient, je vous invite à faire tourner le script suivant dans la console javascript (pour Chrome, faire F12,cliquer sur console) :
console.log(window);
cette ligne de javascript va afficher l’objet Widow dans la console de debug. Déplier le et vous allez être submergé, car il contient beaucoup d’objet, et vous allez vous rendre compte qu’il est facile de faire une radiographie de la page web et très facilement.
Ne sous estimez pas la puissance d’un simple console.log, il vous permet d’afficher n’importe quel objet, même les lus obscure. Par exemple, quend vous chargez un script Jquery, il est rattaché au DOM donc à window. Vous pourrez afficher tout l’objet Jquery et regarder ce qu’il contient ! De même si vous ne savez pas ce qu’il y a dans l’objet Angular, vous pouvez l’afficher de cette façon. Attention, c’est gros et vous allez peut etre vous y perdre.
Cas des iframes
Lorsqu’il y a des iframes dans votre page html, le code JS qu’il y a dans le ifrmae ne peut pas accéder directement à la fenêtre qui le contient. Si vous êtes dans l’iframe, pour accéder à un élément du DOM de la fenêtre parente, vous devez faire :
var topWindow = window.top
votre variable topWindow contiendra une référence vers l’objet window le pus haut dans la hiérachie des windows, oui il peut avoir plusieurs windows dans une page web.
Le parent immédiat :
Si vous êtes dans une iframe et que vous voulez le parent immédiat :
Pour manipuler les dates en Javascript, ce n’est pas forcément simple, en outre nativement Javascript possède peu de fonction de manipulation de date, d’ou l’intérêt de Moment.js.
Le problème c’est que moment.js sait faire tellement de chose et que la documentation est tellement touffue (voire pas bien foutue) que l’on peine même pour faire les opérations les plus élémentaires.
Ce post se veut comme un aide mémoire pour faire les opérations les plus simples avec les dates.
Instanciation d’une date
const t = moment()
génère un objet correspondant à la date et heure actuelle
const t = moment("12-05-1996","MM-DD-YYYY")
génère une date mais avec un format passé en second argument, pour être sûr de bien comprendre la date passée en premier argument.
calculer la différence entre deux dates
Pour calculer la différence entre deux objets moment, il faut utiliser la méthode diff (moment.diff() )
const start = moment('2016-11-13','YYYY-MM-DD')
const end = moment('2016-11-11','YYYY-MM-DD')
Calculer la différence en heures
const c = start.diff(end,’hours’)
Calculer la durée dans moment
MomentJS est plus dédié à la notation de temps à un point donné, mais il est possible de
On entends sur le net beaucoup à propos de Grunt ou de Gulp, ces outils vous permettent de compiler du sass en css, de minifier les script css et javascript, de rassembler en un seul fichier etc.
Cependant, il vous est tout à fait possible de faire ce que fait Gulp par exemple rien qu’en utilisant ce qui est disponible avec NPM script.
NPM est le gestionnaire de package sous nodeJS. Il vous permet de télécharger les dépendances nécessaire au fonctionnement de votre application web et du développement de ce dernier.
Voyons voir comment on peut compiler du Sass en CSS en utilisant NPM script.
les scripts NPM sont logés dans le fichier package.json, dans la propriété scripts.
C’est un objet json qui contient des paire clé-valeurs. La clé étant le nom d’un script, et la valeur est la commande NPM que vous auriez tapé en ligne de commande.
Bon assez parlé on y va !
Compiler du Sass en css
c’est la tâche que l’on aura le plus souvent à faire.
Donc je suppose que vous avez déjà installé nodeJS, donc que vous pouvez utiliser NPM.
> npm install node-sass
Ensuite dans l’objet scripts qu’il y a dans le fichier package.json, créez une entrée comme ceici:
les chemins sont relatifs à l’emplacement du fichier package.json
le premier script « scss-build » va dire à node de compiler le fichier style.scss en style.scss
src/scss est le répertoire source
src/scss/style.scss est le fichier sass à compiler
public/css/style.css est le fhicer cible
Rien qu’avec ce premier script (n’ajoutez pas le second script watch-scss pour l’instant), faite ceci:
> npm run scss-build
et voilà !
Passons au second script, comme avez à modifier un grand nombre de fois le fichier sass, vous aurez envie que la compilation se fasse à chaque fois que vous sauvez le fichier sass,
le « watch-scss » va surveiller toute modification du ficheir et va le compiler.
Il suffit donc de lancer non pas le premier script, mais le second script seul.
> npm run watch-scss
et voilà !
Il y a plus dans les npm scripts que la compilation. On aura envie de minifier le css,minifier le javascript, linter le javascript (linter veut dire vérifier que le code soit aux normes),autopréfixer les propriétés css, et même compresser les images (ce qui est très intéressant !). Le top du top est de pouvoir travailler avec Browsersync quand vous développez en cross browser.
Pour un projet web en php pour le backend, et javascript pour le front(en fait vous n’avez pas d’autres choix que le javascript pour le front car c’est le seul langage côté navigateur à l’heure actuelle),
je vais vous montrer comment initier un projet avec NPM.
Créez votre répertoire web, entrez-y, et commencez par:
>npm init
Vous aurez une suite de question pour configurer votre application, les paramètres globaux de la solution sera sauvée dans un fichier package.json.
A ce niveau votre fichier json ne contient pas de dépendance vers une quelconque bibliothèque javascript.
On va installer Angular (la dernière version):
> npm install --save angular
L’argument save a pour but de sauver la ligne d’installation du module Angular dans el fichier package.json.
Vous faites de même avec les autres librairie (sass, gulp etc), pour savoir ce qu’il faut taper exactement, allez sur le site officiel de NPM, maintenant on va faire une installation d’une autre catégorie de librairies, les dev dependencies. Ce sont les librairies qui sont utilisée seulement en développement mais ne figureront pas dans la version production.
Par exemple je vais installer la librairie de test unitaire Karma, qui est un orchestrateur de tests, et Jasmine qui est la librairie de test unitaire proprement dite.
>npm install --save-dev karma
Voilà ce que vous aurez comme fichier package.json
Si vous versionnez avec GIT par exemple, vous n’allez pas versionner le répertoire node_modules (le répertoire dans lequel sont entreposés les dépendances). Mais vous allez par contre versionner le fichier package.json. C’est lui qui contient toutes les informations sur les dépendances, si un collègue ou un contributeur désire cloner le projet chez lui, il fera un :
> npm update
pour lancer le processus de chargement des modules npm. Npm va lire le package.json et réinstaller les modules. Comme ça pas de repository Github surchargé par du code non en liaison directement avec votre application.