Les actualités du Samedi 19 mai 2012 dans les métiers du web - Marmits.com - Reims

Le: 19 05 2012 à 16:37 Alsacreations.com - Apprendre Auteur: dew

L'API Selectors définit des méthodes pour accéder aux noeuds DOM, c'est-à-dire aux éléments HTML présents, à l'aide de fonctions de recherche. Leur intérêt est de faciliter la manipulation des noeuds en JavaScript, et d'aller bien au-delà des quelques fonctions qui équipaient les premières versions de l'interface DOM :

  • getElementById() : recherche un élément d'après son identifiant (attribut id),
  • getElementsByTagName() : recherche un élément d'après son type (balise),
  • getElementsByClassName() : recherche un élément d'après sa classe (attribut class)

Ces 3 méthodes sont performantes mais limitées. Avec des pages ou applications complexes, elles se révèlent peu souples car nécessitent de faire appel à des boucles, diverses opérations algorithmiques et des filtres sur les résultats obtenus pour pouvoir obtenir une liste d'éléments.

getElementById

Avec deux nouvelles fonctions introduites par l'API Selectors, la syntaxe permet de faire appel aux sélecteurs CSS. On applique en général ces deux méthodes à partir de la racine document.

  • querySelector() : retourne le premier élément trouvé satisfaisant au sélecteur (type de retour : Element)
  • querySelectorAll() : retourne tous les éléments satisfaisant au sélecteur, dans l'ordre dans lequel ils apparaissent dans l'arbre du document (type de retour : NodeList)

Ces deux méthodes retournent null si aucun objet correspondant n'est trouvé.

Brève comparaison

Les exemples suivants cherchent toutes les cellules <td> contenues dans un élément <table id="matable">.

// Version DOM native
var table = document.getElementById("matable");
var tbodies = table.tBodies;
var rangees = null;
var cellules = [];

for (var i = 0; i < tbodies.length; i++) {
  rangees = tbodies[i].rows;
  for (var j = 0; j < rangees.length; j++) {
    cellules.push(rangees[j].cells[1]);
  }
}

Il faut une dizaine de lignes de code pour pouvoir obtenir un tableau de cellules, ce qui est dissuasif et chronophage.

La popularité des frameworks JavaScript tels que jQuery équipé de Sizzle est initialement venue de ce manque de simplicité au niveau natif : ils permettent de rechercher des éléments HTML sur la page à l'aide d'une seule instruction, et de surcroît avec la syntaxe CSS plus compacte et lisible, en effectuant en interne tous les parcours pour arriver au bout de la recherche dans le document.

// Version jQuery ou Sizzle
var cellules = $('#matable td');

Les deux inconvénients avec le passage par jQuery sont de devoir charger la bibliothèque (poids du fichier au téléchargement, requête HTTP supplémentaire, et temps d'interprétation) ainsi que de faire appel à des instructions en JavaScript non natives, moins performantes que des instructions directement codées dans le navigateur.
Remarque : le type des données obtenues avec jQuery est différent, il s'agit d'un tableau d'objets jQuery qui sont prévus pour utiliser les autres méthodes du framework, et non d'une simple liste de noeuds DOM. On peut néanmoins retomber sur ce niveau inférieur avec la méthode .get().

C'est pour obtenir ce type de fonctionnement au niveau natif que l'API Selectors fut mise au point.

// Version API Selectors
var cellules = document.querySelectorAll('#matable td');

Ses avantages sont d'être très performante (voir le benchmark en ligne SlickSpeed comparant les méthodes natives et les frameworks JavaScript) et disponible sans charger de fichier JavaScript supplémentaire... mais elle n'est pas supportée par les anciens navigateurs (notamment IE6 et IE7, voir tableau de support).

Jumelles

Exemples variés

Pousser le principe très loin et alors aisé, la seule limite étant la connaissance des sélecteurs CSS par le navigateur.

var cellules = document.querySelectorAll("#matable>tbody>tr>td:nth-of-type(2)");
var survol = document.querySelector(":hover");
// ...

De la même façon que l'on peut sélectionner plusieurs éléments séparés par des virgules dans une feuille de styles, le principe est applicable à l'API Selectors. Sans cela, ce même résultat nécessiterait de faire appel au moins deux fois à getElementsByClassName.

var paragraphes = document.querySelectorAll("p.intro, p.suite");

Si plusieurs possibilités sont passées de la sorte à querySelector() - qui est donc limitée à retourner un seul résultat - alors seul le premier élément satisfaisant l'une des conditions est retenu. L'ordre de l'énumération n'a pas d'importance, le critère de choix se base uniquement sur l'ordre d'apparition dans le DOM HTML.

var paragraphe = document.querySelector("p.intro, p.suite");

Dans ce cas de figure, seul un élément p.intro ou p.suite sera retourné, en réalité le premier qui sera rencontré dans le code source, quel que soit l'ordre de l'énumération passée à querySelector().

Pour utiliser le jeu d'éléments retourné par querySelectorAll(), il est bien souvent nécessaire d'itérer sur la liste à l'aide d'une boucle, démarrant à l'index 0 et aboutissant à la longueur du tableau définie par la propriété .length.

var cellules = document.querySelectorAll("#matable td");
for (var i = 0; i < cellules.length; i++) {
 // Faire quelque chose avec cellules.item(i) ou cellules[i]
}

Les méthodes querySelector() et querySelectorAll() ne sont pas vouées à être appliquées uniquement au document. Elles sont exploitables sur un noeud DOM, mais seront toujours évaluées dans le contexte général du document.

var matable = document.getElementById("#matable");
var paragraphes = matable.querySelectorAll("p");

Que peut-on en faire ?

Une fois les noeuds sélectionnés dans le document, toutes les instructions ECMAScript/JavaScript sont applicables, par exemple...

Affecter un style particulier, de manière dynamique :

var importants = document.querySelectorAll('.important');
for (var i = 0; i < importants.length; i++) {
  importants[i].style.backgroundColor = 'yellow';
}

Masquer/afficher un élément :

var monmessage = document.querySelector('#message');
monmessage.style.display = 'block'; // Afficher
// ...
monmessage.style.display = 'none'; // Masquer

Affecter un gestionnaire d'événements au clic sur un élément pour en afficher un autre :

var monbouton = document.querySelector('#afficherMessage');
monbouton.onclick = function() {
  document.querySelector('#message').style.display = 'block';
}

Et ainsi de suite.

Tableau des compatibilités

Navigateurs Versions
Internet Explorer Internet Explorer 8+
Firefox Firefox 3.5+
Chrome Chrome 4+
Safari Safari 3.1+
Safari iOS Mobile 3.2
Opera Opera 10+
Opera Mini 5+
Opera Mobile 10+
Android Android 2.1+

Avertissements

Étant donné que ces méthodes de recherche exploitent directement le moteur du navigateur, elles sont limitées à ce qu'il reconnaît nativement en termes de sélecteurs. Par exemple il s'agira de CSS 2.1 sur IE8, et uniquement en mode conforme aux standards. Par ailleurs, ce navigateur ne retournera pas les éléments visés par les pseudo-classes :visited ou :link pour des raisons de sécurité. Il serait en effet possible de savoir en JavaScript si un visiteur est allé sur une adresse précise en sélectionnant des liens concernés par ces filtres et en étudiant leurs couleurs. Les autres navigateurs devront traiter tous les liens de la page comme non visités pour ne pas se trahir.

Le: 19 05 2012 à 13:44 presse-citron.net Auteur: Rénald Boulestin

L'introduction frileuse en bourse de Facebook - le titre FB finit son premier jour à 38.23$ - a éclipsé sa toute dernière acquisition. Karma, le spécialiste du cadeau sur téléphones mobiles, entre dans le giron de la société de Mark Zuckerberg.

Le: 19 05 2012 à 13:12 presse-citron.net Auteur: Rénald Boulestin

Allons faire un tour dans l'oeil du cyclone pour voir ce que le fabricant de montres Tokyoflash a mijoté avec sa nouvelle création. La Kisai Uzumaki (tourbillon en japonais) s'inscrit dans la philosophie du constructeur japonais : donner corps à des designs de montres encore jamais vus.

Le: 19 05 2012 à 12:52 ballajack.com Auteur: Ballajack

Les articles de la semaine : Gmail, applications photo pour Android, conversion de vidéos, Google Pingouin, optimisation d'un blog WordPress, Google Drive... Related posts:

  1. Revue de Web hebdomadaire – 2012 semaine 17
  2. Revue de Web hebdomadaire – 2012 semaine 14
  3. Revue de Web hebdomadaire – 2012 semaine 16

Le: 19 05 2012 à 12:10 FrenchWeb.fr Auteur: rMen

L’introduction en bourse de Facebook aura atteint ses objectifs de souscription et fixe la nouvelle valorisation de la société à 104 milliards de dollars. Toutefois les analystes financiers portent un regard négatif sur cette IPO qui aurait du être triomphale. Malgré une forte hausse lors des premières minutes de 13%, l’action Facebook a fait par [...]

Le: 19 05 2012 à 09:21 WebdesignerNews Auteur: admin

Colllor lets you easily generate a consistent color palette with just a few clicks. You should use colors consistently, so you have a common look and feel throughout your design. This tool will let you find the exact value of darker/lighter shades of any color, not just something that ‘looks darker or lighter’. This all [...]

Le: 19 05 2012 à 08:31 presse-citron.net Auteur: Rénald Boulestin

Facebook vient de faire une entrée des plus remarquées au Nasdaq avec la levée de 16 milliards de dollars. Mais, la société doit déjà faire face à des poursuites judiciaires aux Etats-Unis sur fond de violation de la vie privée des utilisateurs. Les plaignants réclament 15 milliards de dollars.

Le: 19 05 2012 à 05:38 jqueryrain.com Auteur: Admin

Apple is known for very clean design and if you have been to their website in the last few years you’ve seen their primary navigation. It’s a staple of the ...

Le: 19 05 2012 à 05:21 jqueryrain.com Auteur: Admin

The animated button & menu jQuery plugin allows you to easily replace <a> links with animated buttons and grouping buttons into a menu. Features: Buttons of any size. Any background ...

Le: 19 05 2012 à 05:13 jqueryrain.com Auteur: Admin

We want to create a video player that looks consistent across browsers. Each browser however provides its own different look and feel for the player, from the minimal approach of ...

Le: 19 05 2012 à 04:59 jqueryrain.com Auteur: Admin

Lightweight custom styled checkbox implementaion for jQuery. Features: only inline elements used, just like default checkoxes cross-browser look and feel (tested in IE6, IE7, IE8, Firefox and Chrome engines) work ...

Le: 19 05 2012 à 00:16 blog.openclassrooms.com Auteur: noreply@siteduzero.com ($imon)

Vous venez de finir de modifier votre script de connexion pour donner la possibilité aux utilisateurs de se souvenir de leur pseudo, et vous êtes persuadés d'avoir tout fait pour simplifier au maximum la tâche de vos membres ? Détrompez-vous : il existe un moyen pour les identifier d'un seul clic.

Dis, tu deviens pas un peu fou, là o_O ? Si on clique juste sur un bouton, tout le monde pourra se connecter sur mon site !

En fait, il y a une astuce : vos membres sont déjà identifiés sur d'autres sites plus connus que le vôtre, tels que Google, Facebook ou Windows Live, pour ne citer que les plus utilisés. Tous ces sites proposent une fonctionnalité intéressante : délivrer, avec l'accord de l'utilisateur, des données concernant leurs membres. Vous pouvez récupérer ces informations pour identifier vos membres.
De plus, vous pourrez proposer l'option « inscription-minute » : vous pourrez aller chercher les infos du visiteur directement dans son profil MSN ou Facebook !