JavaScript et la série DOM Leçon 1

Bonjour et bienvenue dans la première partie de ce qui sera, espérons-le, une vaste série couvrant les aspects fondamentaux du langage de programmation JavaScript et de l'API DOM..

Bien que les frameworks tels que jQuery, Prototype et MooTools soient un excellent moyen de supprimer les bogues du navigateur et d'accélérer le développement, il est important de connaître et de comprendre les technologies sous-jacentes. Cette série a pour but de vous dire ce que vous devez savoir sur JavaScript et le modèle de document objet (DOM). Même si vous ne jurez que par une bibliothèque en particulier, cela vous sera tout de même bénéfique: savoir comment quelque chose fonctionne sous la peau ne peut être qu'une bonne chose.!

Introductions

JavaScript

JavaScript est un dynamique, lâchement tapé, à base de prototype langage de programmation utilisé dans de nombreux environnements. En plus d'être le langage de programmation côté client répandu du Web, il est également utilisé pour écrire des plugins pour les IDE, dans les fichiers PDF et comme base pour d'autres plateformes et abstractions supérieures..

JavaScript est basé sur le standard ECMAScript (ECMA-262) et a été créé par Brendan Eich de Netscape. Il s'appelait à l'origine LiveScript, mais il a ensuite été renommé en JavaScript, probablement dans le seul but de semer la confusion..

Voici quelques unes de ses caractéristiques plus en détail:

  • Dynamique les langages de programmation s'exécutent au moment de l'exécution; ils ne sont pas compilés. Pour cette raison, JavaScript est parfois considéré comme un langage de script par opposition à un vrai langage de programmation (évidemment une idée fausse). Lorsque vous avez du JavaScript dans un document HTML, il est analysé au fur et à mesure que la page se charge dans le navigateur, donc à "exécution"..
  • Librement tapé les langues n’insistent pas sur un système de dactylographie puissant. Si vous avez programmé en C ou en Java (différent de JavaScript), vous saurez que lors de la déclaration d'une variable, vous devez spécifier un type tel que 'int' (entier). JavaScript est différent en ce que vous n'avez pas besoin de spécifier le type.
  • Pour effectuer l'héritage dans JavaScript, vous devez utiliser quelque chose appelé prototypes. JavaScript ne supporte pas les classes.
  • JavaScript est aussi un fonctionnel la langue. Il traite les fonctions comme des objets de première classe. c'est l'idée derrière lambda.

Comprendre les points ci-dessus n’est pas important pour apprendre à utiliser JavaScript. Ce ne sont là que quelques idées pour faire fonctionner votre cerveau et devraient vous aider à différencier JavaScript des autres langages de programmation que vous avez pu expérimenter..

Modèle d'objet de document

Le modèle de document, généralement abrégé en DOM, est l’API par laquelle JavaScript interagit avec le contenu d’un site Web. JavaScript et les DOM sont généralement considérés comme une seule et même entité, car JavaScript est généralement utilisé à cette fin (interaction avec le contenu sur le Web). L'API DOM est utilisée pour accéder, parcourir et manipuler des documents HTML et XML..


Un aperçu de base de la hiérarchie typique du DOM (simplifié)

Voici quelques points remarquables sur le DOM:

  • L'objet window sert d'objet global, vous y accédez en tapant simplement "window". C'est dans cet objet que tout votre code JavaScript est exécuté. Comme tous les objets, il a des propriétés et des méthodes.
    • Une propriété est une variable stockée sous un objet. Toutes les variables créées sur une page Web deviennent automatiquement des propriétés de l'objet window.
    • Une méthode est une fonction stockée sous un objet. Puisque toutes les fonctions sont stockées sous (au moins) l'objet window, elles peuvent toutes être appelées «méthodes»..
  • Le DOM crée une hiérarchie correspondant à la structure de chaque document Web. Cette hiérarchie est composée de nœuds. Il existe plusieurs types de nœuds DOM, les plus importants étant 'Element', 'Text' et 'Document'..
    • Un noeud 'Element' représente un élément dans une page. Donc, si vous avez un élément de paragraphe ('

      ') alors on peut y accéder via le DOM en tant que noeud.

    • Un nœud 'Texte' représente tout le texte (au sein d'éléments) d'une page. Donc, si votre paragraphe contient un peu de texte, il est directement accessible via le DOM.
    • Le nœud 'Document' représente l'ensemble du document. (c'est le nœud racine de la hiérarchie / de l'arborescence DOM).
    • Notez également que les attributs d'élément sont des nœuds DOM eux-mêmes..
  • Chaque moteur de présentation a une implémentation légèrement différente du standard DOM. Par exemple, le navigateur Web Firefox, qui utilise le moteur de mise en page Gecko, a une bonne implémentation (bien que, pas tout à fait en ligne avec la spécification W3C), mais Internet Explorer, qui utilise le moteur de mise en page Trident, est connu pour son implémentation buggy et incomplète; une cause de grande angoisse au sein de la communauté de développement web!

Télécharger Firebug

Si vous utilisez Firefox et que vous ne possédez pas déjà l'addon Firebug, je vous recommande de le télécharger et de l'installer maintenant. C'est un outil très utile pour obtenir une image correcte de l'ensemble de la structure du document..

JavaScript sur le Web

L'élément de script

Lorsque vous souhaitez utiliser JavaScript sur un site Web, vous devez l'inclure dans un élément SCRIPT:

     JavaScript!     

Comme vous pouvez le constater, nous avons un élément SCRIPT au bas de notre document.. L'attribut TYPE doit être strictement défini sur 'application / javascript' mais ce n’est pas une surprise si cela ne fonctionne pas dans Internet Explorer, nous sommes donc bloqués avec l’attribut 'text / javascript' ou aucun attribut TYPE. Si la validation vous tient à cœur, la première suggestion vous conviendra probablement..


N'oubliez pas de spécifier vos scripts en tant que CDATA!

Vous aurez également remarqué que cet élément SCRIPT comporte quelques lignes commentées. Ceux-ci informent les navigateurs prenant en charge XHTML que le contenu de l'élément SCRIPT est un 'caractère de données' et qu'il ne doit pas être interprété comme un balisage XHTML. Ce n’est vraiment nécessaire que si vous prévoyez d’utiliser le<' or '>'caractères dans votre code JavaScript. Évidemment, vous pouvez oublier tout cela si vous utilisez du HTML simple.

L'attribut différé

Tout code JavaScript que nous mettons à l'intérieur de cet élément SCRIPT s'exécutera au chargement de la page. La seule exception est lorsqu'un élément SCRIPT a un attribut 'différer'. Par défaut, lorsqu'un navigateur rencontre un élément SCRIPT, il arrête et exécute le code, puis analyse le document. L'attribut DEFER informe le navigateur que le code ne contient aucun code modifiant le document et peut donc être exécuté ultérieurement. Le seul problème avec cela est que cela ne fonctionne que dans IE, il est donc probablement préférable d'éviter cet attribut.

Liaison à des scripts externes

Si vous souhaitez créer un lien vers un fichier de script externe, ajoutez simplement un attribut SRC à votre élément SCRIPT correspondant à son emplacement. Il est généralement préférable d’avoir des fichiers de script distincts que d’écrire du code en ligne car cela signifie que le navigateur peut mettre le fichier en cache. De plus, vous n'avez pas à vous soucier de ces absurdités CDATA:

 

Essentials JavaScript

Avant de continuer avec le DOM, il est judicieux de maîtriser quelques notions de base de JavaScript. Si vous avez du mal à comprendre certaines de ces choses, ne vous inquiétez pas, vous finirez par les prendre.!

En JavaScript, vous pouvez avoir différents types de valeurs. Il y a des nombres, des chaînes, des booléens, des objets, des indéfinis et des nuls:

Les commentaires sur une seule ligne sont écrits en utilisant deux barres obliques (//), tout le texte restant sur cette ligne est supposé être un commentaire de l'analyseur. Les commentaires multi-lignes sont signifiés en utilisant '/ *' et '* /' pour finir le commentaire.

Nombres

En JavaScript, tous les nombres sont représentés sous forme de valeurs à virgule flottante. Lorsque vous définissez une variable numérique, n'oubliez pas de la mettre entre guillemets.

 // Remarque: utilisez TOUJOURS 'var' pour déclarer une variable: var leftSide = 100; var topSide = 50; var areaOfRectangle = leftSide * topSide; // = 5000

Les cordes

Toute chaîne que vous définissez est prise à la lettre, JavaScript ne la traitera pas. Une chaîne est une séquence de caractères Unicode et doit être entourée d'une paire de guillemets simples ou doubles..

 var firstPart = 'Bonjour'; var secondPart = 'World!'; var allOfIt = firstPart + "+ secondPart; // Hello World! // Le signe + est utilisé en tant qu'opérateur de concaténation de chaînes // (il est également utilisé pour l'addition numérique)

Booléens

Les types booléens sont utiles lorsque vous souhaitez évaluer une condition - pour voir si elle répond à un critère spécifié. Il n'y a que deux valeurs booléennes possibles: true et false. Toute comparaison, à l’aide d’opérateurs logiques, donnera un booléen.

 5 === (3 + 2); // = true // Vous pouvez affecter des valeurs booléennes à des variables: var veryTired = true; // Vous pouvez le tester comme ceci: if (veryTired) // Sleep

Le '===' que vous voyez ci-dessus est un opérateur de comparaison, nous le couvrirons plus tard.

Les fonctions

Une fonction est un objet spécialisé:

 // Utilisation de l'opérateur de fonction pour créer une nouvelle fonction: function myFunctionName (arg1, arg2) // Le code de fonction va ici.  // Si vous omettez le nom de la fonction, // vous créez une "fonction anonyme": function (arg1, arg2) // Le code de la fonction va ici.  // Exécuter une fonction consiste simplement à la référencer // puis à ajouter une parenthèse (avec arguments): myFunctionName (); // Pas d'argument myFunctionName ('foo', 'bar'); // avec arguments // Vous pouvez également exécuter une fonction sans // l'assinguer à une variable: (function () // Ceci est appelé une fonction anonyme auto-invoquante) ();

Tableaux

Un tableau est également un objet spécialisé et peut contenir un nombre quelconque de valeurs de données. Pour accéder aux valeurs de données dans un tableau, vous devez utiliser un nombre, appelé "index" de l'élément que vous essayez d'extraire:

 // 2 manières différentes de déclarer un nouveau tableau, // Literal: var fruit = ['apple', 'lemon', 'banana']; // Utilisation du constructeur Array: var fruit = new Array ('pomme', 'citron', 'banane'); fruit [0]; // Accéder au 1er élément du tableau (pomme) fruit [1]; // Accède au 2ème élément du tableau (citron) fruit [2]; // Accéder au 3ème élément du tableau (banane)

Objets

Un objet est une collection de valeurs nommées (paires clé-valeur). C'est semblable à un tableau, la seule différence est que vous pouvez spécifier un nom pour chaque valeur de données.

 // 2 manières différentes de déclarer un nouvel objet, // Literal (accolades): var profile = name: 'Bob', age: 99 ans, job: 'Freelance Hitman'; // Utilisation du constructeur Object: var profile = new Object (); profile.name = 'Bob'; profil.age = 99; profile.job = 'Hitman indépendant';

Déclaration If / Else

L’une des constructions les plus courantes en JavaScript est la 'SINON' déclaration. Ca fait plutot comme ca:

 var legalDrinkingAge = 21; var yourAge = 29; if (yourAge> = legalDrinkingAge) // Nous pouvons utiliser 'alert' pour avertir l'utilisateur: alert ('Vous pouvez boire.');  else alert ('Désolé, vous ne pouvez pas boire.'); 

Opérateurs JavaScript:

Au lieu de les énumérer ici, je vous suggère de consulter l'article du MDC sur les opérateurs. Cela les explique en détail. J'ai configuré quelques exemples pour vous donner une idée de la façon dont certains opérateurs sont utilisés ci-dessous:

 // additioa / soustraction / multiplier / diviser var someMaths = 2 + 3 + 4 - 10 * 100/2; // Egalité si (2 == (5 - 3) / * Faire des choses * / // == vérifie l’équivalence // Inégalité si (2! = (5 - 3) / * Faire des choses * / / / Opérateurs d'égalité strictes: // (je suggère d'utiliser ces outils) 2 === 2 // Au lieu de 2 == 2 2! == 3 // Au lieu de 2! = 3 // Affectation: var numberOfFruit = 9; numberOfFruit - = 2; // Identique à "numberOfFruit = numberOfFruit - 2" numberOfFruit + = 2; // Identique à "numberOfFruit = numberOfFruit + 2"

En boucle

La mise en boucle est utile lorsque vous devez parcourir tous les éléments d'un tableau ou tous les membres d'un objet. Le moyen le plus courant de boucler en JavaScript consiste à utiliser l'instruction FOR ou WHILE..

 var envatoTutSites = ['NETTUTS', 'PSDTUTS', 'AUDIOTUTS', 'AETUTS', 'VECTORTUTS']; // WHILE loop var counter = 0; var lengthOfArray = envatoTutSites.length; tandis que (compteur < lengthOfArray)  alert(envatoTutSites[counter]); counter++; // Same as counter += 1;  // FOR loop // (The i stands for "iterator" - you could name it anything) for (var i = 0, length = envatoTutSites.length; i < length; i++)  alert(envatoTutSites[i]); 

Les boucles FOR sont plus populaires pour les boucles dans les tableaux..

Retour au DOM

Accéder aux nœuds DOM

Supposons que nous ayons un document XHTML de base contenant un paragraphe et une liste non ordonnée:

     JavaScript!   

Mon premier paragraphe…

  • Élément de liste 1
  • Élément de liste 1
  • Élément de liste 1
  • Élément de liste 1
  • Élément de liste 1

Dans ce premier exemple, nous allons accéder à notre paragraphe en utilisant la méthode DOM 'getElementById':

(Ce code est contenu dans l'élément SCRIPT du modèle ci-dessus.).

 var introParagraph = document.getElementById ('intro'); // Nous avons maintenant une référence au nœud DOM. Ce nœud DOM // représente le paragraphe d'introduction.

La variable 'introParagraph' est maintenant une référence au noeud DOM. Nous pouvons faire un certain nombre de choses avec ce nœud, nous pouvons interroger son contenu et ses attributs et en manipuler n’importe quel aspect. Nous pouvons le supprimer, le cloner ou le déplacer vers d'autres parties de l'arborescence DOM.

Tout ce qui est présent dans un document auquel nous pouvons accéder à l'aide de JavaScript et de l'API DOM. Ainsi, nous pourrions vouloir accéder à la liste non ordonnée de la même manière, le seul problème est qu’elle n’a pas d’ID. Vous pouvez lui donner un identifiant puis utiliser la même méthode que ci-dessus ou nous pourrions y accéder en utilisant 'getElementsByTagName':

 var allUnorderedLists = document.getElementsByTagName ('ul'); // 'getElementsByTagName' retourne une collection / liste de noeuds vivants // - C'est très similaire à un tableau avec quelques légères différences.

getElementsByTagName

La méthode 'getElementsByTagName' renvoie une collection / liste de nœuds actifs. Cela ressemble à un tableau en ce sens qu'il a une propriété length. Une chose importante à noter est que ces collections sont "live" - ​​si vous ajoutez un nouvel élément au DOM, la collection se mettra à jour. Comme c'est un objet de type tableau, nous pouvons accéder à chaque nœud via un index, de 0 à la longueur totale de la collection (moins 1):

 // Accès à une liste non ordonnée unique: [0] index var unorderedList = document.getElementsByTagName ('ul') [0]; // Créer la liste des noeuds de tous les éléments de la liste au sein de l'UL: var allListItems = unorderedList.getElementsByTagName ('li'); // Maintenant, nous pouvons parcourir chaque élément de la liste en utilisant une boucle FOR: for (var i = 0, length = allListItems.length; i < length; i++)  // Extract text node within and alert its content: alert( allListItems[i].firstChild.data ); 

Accéder aux nœuds et attributs dans le DOM

Traverser le DOM

Le terme "traverse" est utilisé pour décrire l'action de traverser le DOM pour trouver des nœuds. L'API DOM nous donne beaucoup de propriétés de nœud que nous pouvons utiliser pour parcourir tous les nœuds d'un document..

Ces propriétés sont inhérentes à tous les nœuds et vous permettent d'accéder aux nœuds liés / proches:

  • Node.childNodes: Vous pouvez l'utiliser pour accéder à tous les nœuds enfants directs d'un seul élément. Ce sera un objet de type tableau, que vous pourrez parcourir en boucle. Les nœuds de ce tableau incluront tous les types de nœuds, y compris les nœuds de texte et les autres nœuds d'élément..
  • Node.firstChild: Cela revient à accéder au premier élément du tableau 'childNodes' ('Element.childNodes [0]'). C'est juste un raccourci.
  • Node.lastChild: Cela revient à accéder au dernier élément du tableau 'childNodes' ('Element.childNodes [Element.childNodes.length-1]'). C'est juste un raccourci.
  • Node.parentNode: Cela vous donne accès au noeud parent de votre noeud actuel. Il n'y aura jamais qu'un seul nœud parent. Pour accéder au grand-parent, vous utiliserez simplement 'Node.parentNode.parentNode' etc..
  • Node.nextSibling: Cela vous donne accès au prochain nœud au même niveau dans l'arborescence DOM.
  • Node.previousSibling: Cela vous donne accès au dernier noeud du même niveau dans l'arborescence DOM.

Parcourir un document (simplifié - à lire ci-dessous)

Donc, comme vous pouvez le constater, parcourir le DOM est incroyablement facile, il suffit de connaître les noms de propriété..

Une chose à noter à propos du graphique ci-dessus: les éléments de la liste ne peuvent être récupérés de cette manière que s’ils ne sont pas séparés par des espaces. Comme vous pouvez avoir des nœuds de texte et des nœuds d'élément dans un document, l'espace entre

    'et le premier'
  • 'compte réellement comme un noeud lui-même. De même, la liste non ordonnée n'est pas réellement le prochain frère du paragraphe - puisqu'il se trouve sur une nouvelle ligne, il y a un espace entre les deux éléments - d'où un autre nœud! Normalement, ce que vous feriez dans cette situation serait de parcourir en boucle le tableau 'childNodes' et de tester le 'nodeType'. Un 'type de nœud' de 1 signifie que c'est un élément, 2 que c'est un attribut, 3 que c'est un nœud de texte. Vous pouvez voir une liste complète ici: https://developer.mozilla.org/En/DOM/Node.nodeType.

    C'est tout ce que c'est!

    C’est ainsi que fonctionnent toutes les principales bibliothèques JavaScript. en utilisant des méthodes et des propriétés DOM natives pour vous donner accès à ces éléments via une abstraction bien polie. Ce qui vous sépare du cadre inflexible, c'est que vous avez maintenant une idée de la façon de survivre sans cadre (si vous ne l'avez pas déjà fait)!

    Jusqu'à la prochaine fois…

    Eh bien, c'est tout pour la première partie. J'espère que vous avez appris quelque chose de toutes mes divagations. Nous espérons que, dans la prochaine partie de la série, nous nous concentrerons sur des exemples plus applicables; nous allons probablement couvrir le modèle d'événement du navigateur ainsi.

    En attendant, et si vous ne l’avez pas encore fait, consultez ces exposés de Doug Crockford (site Yahoo! Video):

    • Douglas Crockford: "Le langage de programmation JavaScript" / 1 sur 4
    • Douglas Crockford: "Le langage de programmation JavaScript" / 2 sur 4
    • Douglas Crockford: "Le langage de programmation JavaScript" / 3 sur 4
    • Douglas Crockford: "Le langage de programmation JavaScript" / 4 sur 4

    Merci d'avoir lu!

    • Abonnez-vous au flux RSS NETTUTS pour plus de commentaires et d'articles sur le développement Web au quotidien.