Alors pour l’explication:
Prenons ce code:
<a href="#" id="test" class="off">geo</a>
<script>
$('#test.off').click(function(){
$(this).removeClass('off').addClass('on');
alert('ok');
});
$('#test.on').click(function(){
$(this).removeClass('off').addClass('on');
alert(' pas ok');
});
</script>
$('#test.off') va rechercher dans le dom un élément avec l'id test et la classe off. Il va le trouver et lui attacher l'exécution de la fonction lors de l'évènement click.
$('#test.on') va rechercher dans le dom un élément avec l'id test et la classe on. Il ne va pas en trouver et donc il n'attachera rien du tout.
Lors du click, l'évènement déclenche l’exécution de la fonction, la classe passe de off à on, mais l'évènement attaché à l'élément ne change pas lui.
maintenant si j'écris:
$('#container').on('click', '#test.off', function(){
$(this).removeClass('off').addClass('on');
alert('ok');
});
Cela va rechercher un élément avec un id "container", et lui attacher une fonction (avec un filtre) lors du click. Lorsque l'on clique dans #container, jQuery va vérifier à ce moment si on a cliqué sur un élément correspondant au filtre ''#test.off', et si il est trouvé lui appliquer l'éxecution de la fonction.
Pour plus de compréhension, $('#test.on').click(function(){}); est un alias de $('#test.on').on('click', function(){}); et font donc strictement la même chose. Cependant avec la forme "on" on peut ajouter ces filtres qui permettent d'attacher des évènements à des éléments qui n'existent pas encore, alors qu'avec la forme sans filtre on attache des évènements qu'à des qui existent déjà lors de l’exécution du script.
p.s. :
L'autre avantage de l'utilisation des filtres est de soulager le navigateur. Si j'ai un tableau avec 500 cases et que je fait:
$('#truc td').on('click', function(){});
Je vais attacher un écouteur d'évènements à 500 éléments du DOM, ce qui n'est pas des mieux pour les performances. Alors qu'en l'écrivant ainsi:
$('#truc').on('click', 'td', function(){});
Je n'attache l'écouteur qu'à un seul évènement du DOM, soulageant un peu l’exécution de ma page.