Bonnes pratiques JQuery
Charger le contenu depuis un CDN
Plutôt que de stocker JQuery sur votre serveur, vous pouvez choisir un CDN [1] notoire. Cela devrait réduire le temps de chargement de la page.
<!--:( -->
<script src="/vendor/jquery/jquery.min.js"></script>
<!-- :) -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Voici une liste de CDN fournissant un accès à la bibliothèque JQuery :
Les bonnes pratiques ne concernent pas seuelement JQuery ; les éléments d’affichage - type CSS ou autre - peuvent aussi être chargés parallèlement.
Prévoir une méthode de chargement alternative en cas de défailllance du CDN
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>window.jQuery || document.write("<script src='/vendor/jquery/jquery.min.js'>\x3C/script>");</script>
Préférer les versions compressées
<!-- :( -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js"></script>
<!-- :) -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Placer l’appel au script en fin de page plutôt qu’en en-tête
<!doctype html>
<head>
...
<!-- :( -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
...
<!-- :) -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</body>
...
Utiliser des URLs en chemins relatif
Pas besoin de spécifier le protocole http ou https. Le navigateur optera de lui-même pour le protocole https s’il se trouve déjà dans un environemment sécurisé.
<!-- :( -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- :) -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Raccourci pour l’événement ready
// Appel classique
$(document).ready(function() {
...
});
// Version rapide
$(function() {
});
Garder le $ lors de la déclaration d’une variable de type jQuery.
Grâce à cette convention de nommage, on distingue facilement la nature de l’objet JQuery.
// :(
var form = $('#contactForm');
// :)
var $form = $('#contactForm');
Du bon usage de $this
La variable $this s’utilise avantageusement au début des fonctions non déclarées, par exemple dans une boucle de type each.
// :(
$('li').each(function() {
$(this).on('click', function() {
$(this).addClass('active');
});
});
// :)
$('li').each(function() {
var $this = $(this);
$this.on('click', function() {
$this.addClass('active');
});
});
Certains préfèrent utiliser that ou self. Attention de ne pas oublier qu’il s’agit d’un objet jQuery.
Mettre en cache les objets jQuery
Si un objet jQuery est utilisé plusieurs fois, le mettre en cache permet d’optimiser les performances.
// :(
$('.menu li').each(function() { ... });
$('.menu li').each(function() { ... });
// :)
var $items = $('.menu li');
$items.each(function() { ... });
// on recycle :)
$items.each(function() { ... });
Enchaînement des fonctions
C’est asssurément l’une des fonctionalités les plus appréciée de jQuery. On peut ainsi appeler une série de méthodes dans la même foulée.
"Write less, do more", garder en tête le slogan de jQuery
// :(
var $a = $('#about');
$a.hide();
$a.addClass();
$a.fadeIn();
$a.hide();
// :)
$('#about').hide().addClass().fadeIn().hide();
// c'est mieux
// Retour à la ligne et identation améliorent la visibilité
$('#about')
.hide()
.addClass()
.fadeIn()
.hide();
Déclarer un nouvel élément
Lors de la création d’un élément, faîtes en sorte de manipuler les éléments via les méthodes jQuery plutôt que d’insérer du code HTML brut.
// Don't
var $hidden = $('<input class="form-control" type="hidden" name="foo" value="bar" />').appendTo('#form');
// :)
var $hidden = $('<input/>')
.addClass('form-control')
.attr('type', 'hidden')
.attr('name', 'foo')
.val('bar')
.appendTo('#form');
// ou bien
var $hidden = $('<input/>', {
class: 'form-control',
type: 'hidden',
name: 'foo',
value: 'bar'
}).appendTo('#form');
Garder le CSS loin des manipulations de jQuery
Pas la peine de déclarer le style CSS directement à un élément. Le recours aux classes est fait pour ça.
// :(
$('#button').css({
'background-color': '#5cb85c',
'border-color': '#4cae4c'
});
// :)
.success {
background-color: #5cb85c;
border-color: #4cae4c;
}
$('#button').addClass('success');
Choisir le bon sélecteur
Le sélecteur désignant l’id est le plus rapide
Pour retrouver un élément du DOM en fonction de son id, jQuery utilise la méthode native document.getElementById() qui s’avère bien plus efficace que Sizzle.
Sizzle is a pure-JavaScript CSS selector engine used by jQuery
// :(
$('#wrapper #inner');
$('div#inner');
$('.wrapper #inner');
// :)
$('#inner');
Du coup, mieux vaut introduire une recherche sur un id, quitte à enchaîner les recherches.
// :(
$('#container .row');
// + rapide
$('#container').find('.row');
Sélecteurs restrictifs
Il faut être spécifique sur le partie gauche de votre sélecteur, et moins en début.
// pas glup
$('div.data .gonzalez');
// glup glup
$('.data td.gonzalez');
Éviter le recours aux sélecteurs universels
// moins rapide
$('div.container > *');
// Plus rapide
$('.container').children();
Mieux vaut faire précéder les sélecteurs pseudo-class (ex :before) avec un tag ou un autre sélecteur. Car, si ce n’est pas le cas, le sélecteur universel * est implicitement employé.
// :(
$('.category :radio');
// :)
$('.category input:radio');
Privilégiez les méthodes de tri plutôt que les pseudos-sélecteurs.
Lorsque cele est possible, utiliser la méthode de tri jQuery plutôt que des pseudos-sélecteurs. La méthode querySelectorAll s’avère là encore plus rapide que la méthode Sizzle.
// :(
$('.item:first')
// :)
$('.item').eq(0)
Pas de javascript inline sur les élements HTML
Mieux vaut attacher un écouteur d’événement à l’objet.
<!-- :( -->
<button id="saveButton" onclick="javascript: save();">Save</button>
// :)
$('#saveButton').on('click', function() {
...
});
Choisir un namespace personnalisé pour les événements
Ainsi il est plus facile de désactiver un événement sans affecter les autres écouteurs d’événements assignés à l’élément.
$('#saveButton').on('click.bv', function() { ... });
//Plus tard, on peut retirer sans crainte l'écouteur l'événement
$('#saveButton').off('click.bv');
Ne pas passer les paramètres Ajax "en dur"
Lorsque d’un requête de type xmlHttpRequest, il faut utiliser le paramètre data, et non concaténer l’information au sein de l’URL.
// :(
$.ajax({
url: '/remote/url?param1=value1&param2=value2...'
}});
// :)
$.ajax({
url: '/remote/url',
data: {
param1: 'value1',
param2: 'value2'
...
}
});
Dans le cas où les paramètres à transmettre sont très long (ex : le contenu intégral d’un article), on privilégiera la méthode POST, à la fois pour Ajax et le traitement côté serveur.
Internet Explorer 8 (and earlier) limits 2083 characters in URL
source Best jQuery practices · Programmer Tips