Archives par mot-clé : jquery

JQuery : Namespaced Events

Cet article est en grande partie la traduction de la partie Namespaced Event issus du chapitre Events and Event Delegation de jQuery Fundamentals (un site de présentation des principales fonctionnalités de jQuery très bien fait).

Une des bonnes pratiques pour la gestions des événements en jQuery est de passer par on(). Un des avantages de l’utilisation de on() est la possibilité d’utiliser des « namespaced » events. Quand utiliser ces namespaces ?
Prenons un exemple on l’on doit s’abonner à des événements pour ensuite supprimer certains de ces handlers. La première chose qui nous vient en tête est de faire :

A NE PAS UTILISER !

$( 'li' ).on( 'click', function() {
  console.log( 'a list item was clicked' );
});
 
$( 'li' ).on( 'click', function() {
  registerClick();
  doSomethingElse();
});
 
$( 'li' ).off( 'click' );

Ce code va permettre de se désabonner à tous les événements clic sur les éléments li, ce qui n’est pas ce que nous voulons. L’utilisation d’un namespaced event va permettre de spécifier un handler spécifiquement.

$( 'li' ).on( 'click.logging', function() {
  console.log( 'a list item was clicked' );
});
 
$( 'li' ).on( 'click.analytics', function() {
  registerClick();
  doSomethingElse();
});
 
$( 'li' ).off( 'click.logging' );

Ce code va garder le handler relatif à analytics, et supprimer le handler relatif au logging.

On peut également utiliser les namespaces pour déclencher certains événements :

$( 'li' ).trigger( 'click.logging' );

Chrome : Bien débuger avec la barre d’outils

Chrome est un formidable outil de développement pour le web. Voici quelques trucs et astuces pour bien debuger avec Chrome.

Extensions

Il est possible d’ajouter des extensions à la barre d’outils de développement que vous trouverez sur le chrome webstore dans la catégorie Outils de développement. (toutes les extensions ne se rajoute pas à la barre d’outils).

  • jQuery Debugger : permet de visualiser rapidement dans votre page le résultat d’un sélecteur jQuery
  • Pagespeed insights : analyse votre page et vous donne des recommandations pour améliorer les performance de votre site

Canary

Chrome Canary est la version « bêta » de Chrome qui contient pas mal de nouveautés dans la barre d’outils qui seront plus tard intégré dans la version courante de Chrome. C’est une version dédié aux développeurs. Canary s’installe en parallèle de Chrome et on peut donc utiliser les 2 simultanément sans aucun problème.

Activer les expérimentations

Les nouveautés en cours de développement de Chrome ne sont pas activé par défaut mais peuvent l’être via l’interface de gestion des fonctionnalités expérimentales. Il en est de même pour la barre de développement. Pour les activer il faut aller à l’url chrome://flags/, activer l’option Activer les expérimentations dans les outils de développement puis redémarrer.

Activation des expérimentations pour la barre d'outils Un onglet Experiments dans les paramètres de la barre d’outils de développement permet d’activer certaines fonctionnalités.

Activer les Experimentations

Snippets

Chrome (canary par défaut et chrome si activation dans les expérimentations) permet la gestion de snippets. Il s’agit de bout de code JavaScript que vous allez pouvoir enregistrer afin de pouvoir les exécuter rapidement au lieu de les taper à la main via la console. Vous trouverez ici une liste de snippets prêt à l’emploi.

Rejouer des appels Ajax

Qui dit développement d’application web riche dit appel AJAX afin de récupérer des données. Il est possible de rejouer des appels AJAX (ou XHR pour XMLHttpRequest) directement depuis la barre d’outils. Pour cela, il faut aller dans l’onglet Networks, clic droit sur l’appel Ajax (XHR) puis cliquer sur Replay XHRs

Rejouer un appel XHR

Pause on exceptions

Chrome possède également une option permettant de mettre en pause le code JavaScript dès qu’une exception est levée.  Il y a 3 modes :

  • Ne pas s’arrêter lors des exceptions. Le mode par défaut.
  • S’arrêter à toutes les exceptions.
  • S’arrêter à toutes les exception non catchées (sans bloc try/catch).

Le passage d’un mode à l’autre se fait en cliquant sur le symbole pause en bas de la l’onglet Sources.

Pause sur les exceptions

Pretty Print JavaScript

Une bonnes pratique pour avoir de bonnes performances consiste a minifier vos scripts JavaScript afin que ceux-ci soit plus léger et donc plus rapide à télécharger. Cependant, vos fichiers ne sont plus facilement débugable (en production). Chrome intègre un outil qui permet de formater un fichier afin de le rendre plus lisible et plus facile à debuger. Il suffit pour cela d’ouvrir un script dans l’onglet Sources et de cliquer sur { }. (le bleu indique que la fonctionnalité est activée)

Indenter le code JavaScriptDésactiver le cache

Le cache du navigateur peut vous amener à perdre du temps lors du développement de votre application web (vous pensez utiliser la dernière version de votre site mais vous utiliser une ancienne version d’un fichier issu du cache de votre navigateur). La barre d’outils Chrome permet de désactiver le cache pour toujours récupérer le fichier du serveur. Pour cela, il faut cocher Disable Cache dans l’onglet General des paramètres de la barre d’outils. Cela n’est pris en compte seulement si la barre d’outils est ouverte.

Changer le thème de la barre d’outils

De nombreux outils de développement permettent de configurer le thème (couleurs, police, …) et la barre d’outils de Chrome n’échappe pas à la règle. En fait, il s’agit d’une application web et il suffit donc de modifier le style CSS afin de satisfaire vos besoins.

Le fichier se nomme Custom.css et se trouve dans :

  • Windows: « C:\Users\**Your username**\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\ »
  • Mac: « ~/Library/Application Support/Google/Chrome/Default/User StyleSheets/ »
  • Linux: « ~/.config/chrome/Default/User StyleSheets/ »

Vous pouvez trouvez des thèmes prêt à l’emploi ici : http://devthemez.com/themes/chrome-developer-tools (contient également des thèmes pour sublime text 2, vim, …)

Liens

Outils CSS3 – HTML5 – JavaScript : Episode 5

Divers

  • overapi.com : une liste de cheatsheet pour pratiquement chaque technos/librairies …enfin presque
  • The Code Player est un site qui permet d’apprendre des techniques HTML5/CSS/JavaScript en vidéo interactives. Le code apparaît en live à gauche et la partie droite affiche le résultat de ce code.
  • Ressource Modern UI : Une liste de ressources concernant l’interface Modern UI de Windows 8.

JavaScript

  • FooTable : un plugin JQuery qui permet des tableaux responsives pour gérer l’affichage sur des téléphones, tablettes et desktop.
  • JQuery Enable Disable Plugin : Un plugin qui permet d’activer / désactiver des éléments de formulaire en fonction d’un autre élément (case à cocher, radio bouton ou listbox)
  • cdnjs.com : Un CDN avec une liste impressionnante de librairies disponibles
  • multiselect : Une librairie qui permet de transformer un select multiple en 2 listes
  • JSLint errors ou JSHintErrors pour avoir les explications concernant une erreur JSLint ou JSHint (validateur de code JavaScript).

CSS

Astuces JQuery

Voici une liste d’astuce / bonnes pratiques concernant JQuery :

Utiliser la dernière version de JQuery

JQuery est en développement permanent et de nouvelles versions sortent régulièrement, plus rapide et plus puissante. N’oubliez pas de mettre à jour votre version de JQuery afin de profitez de nouvelles fonctionnalités et de gain de performance.

id > tags > class

Il faut savoir que la sélection via le sélecteur de Jquery (Sizzle) sera plus rapide si vous utiliser un id par rapport à un tag (p, div, table, …). De la même manière, il est préférable d’utiliser un tag qu’une classe.

Utiliser un contexte

Afin d’éviter de parcourir tout le document, on peut utiliser la notion de contexte qui va définir le scope de recherche. Pour cela, il vaut mieux utiliser find au lieu de spécifier le contexte au sélecteur. En effet, dans la cas où on passe le contexte au sélecteur, c’est la méthode find qui sera appelée.

//On passe le contexte au sélecteur
$('li', '#monContext')
//idem mais avec find
$('#monContext').find('li')

Mettre en cache / Chaîner vos appels

La sélection des éléments est coûteux en terme de temps. Il faut mieux ainsi mettre en cache les élements sélectionné afin de gagner en performance. Un des principes de base de JQuery est que la majorité des fonctions et plugins renvoie la liste des éléments à traiter. Ainsi, on peut chaîner les appels de fonctions.

//Peu performant
$('#item').show();
$('#item').html('hello');
$('#item').css('background-color', '#ffffff');

// On chaîne les appels
$('#item').show().html('hello').css('background-color', '#ffffff');

// ou on met en cache l'élément
var item = $('#item');
item.show();
item.html('hello');
item.css('background-color', '#ffffff');

Dans le même esprit, pensez à naviguez dans le DOM de l’élément sélectionné au lieu de faire plusieurs sélection. Pour cela, JQuery propose les méthodes Traversing comme :

  • siblings : permet de récupérer les éléments frère (de même niveau)
  • childrens : permet de sélectionner les enfants
  • next : permet de sélectionner l’élément frère suivant
  • prev : permet de sélectionner l’élément frère précèdent
  • nextAll et prevAll : permet de sélectionner respectivemnt tous les élément frères suivant et précèdent
  • first et last: permet de sélection du premier et du dernier élément sélectionné

Cerise sur le gâteau, ces méthodes accepte un sélecteur afin de filtrer les données !!!

//On récupère le permier élément p de l'élément #content
$('#content').first('p')

Les méthodes end et addSelf sont particulièrement utiles. End permet de remonter aux éléments précédemment sélectionnés et addSelf permet de rajouter l’élément père.

// On veut modifier le 1er et le dernier élément
$('ul').first().css('color', '#F00').end().last().css('color', '#F00')

// On veut sélectionner les 2 derniers éléments d'une liste
// On sélectionne le dernier, on récupère le précèdent et on s'ajoute soit même
$('li:last').prev().addSelf();

Limiter la manipulation du DOM

Afin d’avoir un script rapide, il faut limiter la manipulation du DOM au maximum (comme prepend(), append(), after()).

Eviter :

var myList = $('#myList');

for (i=0; i<1000; i++){
myList.append('This is list item ' + i);
}

Utiliser plutôt

var myList = $('.myList');
var myListItems = '';

for (i = 0; i < 1000; i++) {
    myListItems += '<li>This is list item ' + i + '</li>';
}
myList.html(myListItems);

Une autre astuce consiste à encapsuler dans un élément unique les éléments à insérer dans le DOM.

var myList = $('.myList');
var myListItems = '<ul>';
for (i = 0; i &lt; 1000; i++) {
myListItems += '<li>This is list item ' + i + '</li>'; }
myListItems += '</ul>';
myList.html(myListItems);

Documentation de Jquery dans Visual Studio

Il suffit de rajouter jquery vs-doc disponible sur le CDN de Microsoft pour avoir la documentation de JQuery intégrée dans visual studio.

Veuillez à ne l’utiliser qu’en développement, le fichier pesant près de 216Ko contre 31Ko pour la version minifiée.

Liens

Voici les liens (en anglais) qui m’ont permis de faire l’article :

QuerySelectorAll, Sizzle et Jquery

En JavaScript, la récupération d’un élément passe souvent par les méthodes getElementById, getElementByTagsName ou getElementsByClassName.

Les derniers navigateurs prennent en charge une nouvelle méthode plus puissante querySelectorAll (compatibilité de la méthode) qui permet de récupérer des éléments en fonction d’un sélecteur CSS3, un peu à la manière de Sizzle, la librairie de sélection utilisée par JQuery.

Utilisation de querySelectorAll

Cette méthode est beaucoup plus intéressante car elle permet de filtrer plus facilement les éléments sur lesquelles on souhaite interagir.

La méthode querySelectorAll prend en paramètre un chaine de caractère qui représente une expression CSS et renvoie une NodeList. Afin de parcourir les éléments renvoyés, vous pouvez le parcourir avec une boucle for (document.querySelectorAll(‘#maDiv)[0]) ou en transformant le résultant en tableau.

Voici un exemple permettant d’alterner les couleurs des lignes d’un tableau avec une transformation en tableau.

Array.prototype.slice.call(document.querySelectorAll('#maincontent table tr'))
.filter(function(element, index, array){
  return index % 2 === 0;
})
.forEach(function(element, index, array){
  element.style.backgroundColor = 'Grey'
});

J’ai utilisé la fonction filter afin de ne sélectionner que les éléments paires, chose que j’aurais pu directement pu faire via le selecteur CSS tr:nth-child(odd).

A noter également que, comme dans la syntaxe CSS, on peut sélectionner plusieurs éléments en les séparant via une virgule :

document.querySelectorAll('#maDiv, .maClasse')

La méthode querySelector fonctionne de la même façon mais ne revoie que le premier élément vérifiant la ou les règles.

Avantage de Sizzle / JQuery

Sizzle est un projet mené par John Resig, qui n’est autre que le père de JQuery. Ce projet est un sélecteur CSS en Javascript. Ce projet est autonome et sans dépendance.

Quel est l’intérêt d’utiliser Sizzle me direz-vous. L’intérêt est multiple.

  • compatibilité avec les vieux navigateurs
  • Ajout de filtre de sélection :
    • contient (texte) :contains
    • contient (element) :has
    • position :first, :last, :even, :odd, :gt, :lt, :eq
    • négation :not
    • élément de formulaire :input, :text, :checkbox, :file, :password, :submit, :image, :reset, :button
  • Extensible

Avec JQuery, vous possédez en plus de fonction de manipulation de ces éléments rapide et puissante.

Ainsi, le code ci-dessus peut s’écrire avec JQuery :

$('table tr:odd').css('backgroundColor', 'Grey');

Simple non ?

Conclusion

La méthode querySelectorAll est maintenant bien supportée dans les navigateurs les plus récents et je ne peux que vous conseiller son utilisation si vous ne voulez pas utiliser des librairies additionnelles comme Sizzle/JQuery, qui apporte un support des anciens navigateurs et de plus grandes fonctionnalités. Pour les autres, JQuery c’est bon, mangez-en 😉

Création d’un diaporama avec JQuery Tools

J’ai eu à utiliser le plugin scrollable de la librairie JQuery Tools (basé sur JQuery comme son nom l’indique). Voici un petit « tutoriel / retour d’expérience » sur ce plugin très sympathique et bien fait.

Code Html

le diaporama doit être un conteneur (div dans notre exemple) qui contient un div ayant pour class items (valeur par défaut qui peut être modifiée). Chaque bloc contenu dans cette div correspondra à un slide du diaporama.

content here ...
content here ...

Les éléments ayant pour class prev et next permettront respectivement le passage au slide précédent et suivant.

Code CSS

Il faut adapter le design du slider pour par exemple dans le cas d’un slider horizontal afficher les slides les un à coté des autres.
Je vous laisser regarder le partie css sur le site qui est bien faite avec notamment un fichier css par défaut pour le mode horizontal.

Code JavaScript

Le code afin de créer le diaporama est très simple :

$('#scroller').scrollable();

Le diaporama est alors créer en utilisant les valeurs par défaut des différents paramètres possible.

initialisation

Voyons comment modifier les paramètres de la classe du conteneur des slides ainsi que la durée de l’animation. Il s’agit des paramètres items et speed. Le code devient ainsi :

$('#scroller').scrollable({items : 'maClass', speed : 1000});

Une option sympathique désactivé par défaut est l’option circular qui permet au diaporama de tourner en boucle.

$('#scroller').scrollable({circular : true});

il est également possible de passer le diaporama en mode vertical via la propriété booléenne vertical.

Défilement automatique

Il est également possible d’activer le défilement automatique. Il faut utiliser le « sous-plugin » Autoscroll. La paramètre autoplay permettant de lancer la lecture de manière automatique

$('#scroller').scrollable().autoscroll({ autoplay: true });

Fonction de easing

Il également possible de modifier la fonction de easing (fonction qui modifie l’animation en fonction du temps, de la position de départ et d’arrivée ainsi que la durée de l’animation pour avoir des animations plus réelle). Le plugin est compatible avec le plugin JQuery Easing qui propose ces équations prête à l’emploi. Pour cela, il suffit d’inclure le fichier js du plugin et de spécifier la fonction d’easing à utiliser.

$('#scroller').scrollable({easing:"easeInBounce", speed : 1000);

Navigation

Il est également possible de mettre en place une navigation via le sous plugin navigator qui va générer automatiquement autant de lien de navigation qu’il y a de slides. Le paramètre indexed permet d’afficher le numéro de la slide.

$("#scroller").scrollable({easing:"easeInBounce", speed : 1000, circular:true}).navigator({indexed : true});

Les liens de navigation sont par défaut créé dans un conteneur ayant pour classe navi




Modification d’une valeur d’un paramètre après initialisation

Il est possible de modifier la valeur d’un paramètre de la configuration du diaporama. Pour cela, on récupère la configuration via l’API (.data(« scrollable »).getConf()) et on modifie le paramètre voulu. Voici un exemple où on modifie la fonction de easing :

$("#scrollable").data("scrollable").getConf().easing = "easeOutBounce";

Je vous invite à consulter la documentation qui est très bien faite.

Pour finir, voici un petit exemple de ce qu’il est possible de faire avec ce plugin. Il est possible de modifier l’effet de easing afin de trouvez celui qui vous convient le mieux 😉