Dans jQuery Events: Stop (Mis)Using Return False, Douglas Neiner nous explique, avec moult exemples, toutes les subtilités relatives aux événements dans jQuery. Une des premières choses que l’on apprend en Javascript est d’empêcher les comportements par défaut liés aux liens ou aux formulaires (le lien sur lequel on l’applique n’est pas suivi par le navigateur, le formulaire ne « submit » plus, etc.).
Typiquement, ça donne le résultat suivant…
$("a.toggle").click(function () { $("#mydiv").toggle(); return false; // Prevent browser from visiting `#` });
… alors qu’on cherche généralement à obtenir quelque chose comme :
$("a").click(function (e) { // e == our event data e.preventDefault(); });
Le premier exemple changera bien la visibilité de #mydiv
sans pour autant nous amener jusqu’à l’ancre #mydiv
. Ce que l’on sait moins, c’est que return false
provoque trois effets : preventDefault()
, stopPropagation()
et stopImmediatePropagation()
!
J’avoue que ces notions un peu complexes me donnent parfois mal à la tête. Si quelqu’un(e) pouvait compléter le deuxième exemple pour arriver au même résultat que le premier, je suis preneur. Merci d’avance 😉
Webographie
http://www.w3.org/TR/[…]#Events-Event-preventDefault — merci à Anthony Ricaud (@rik24d) pour avoir partagé cette ressource avec tact et gentillesse.
Pour comprendre ces notions, il faut bien comprendre la notion de « bubbling » que l’auteur évoque : un évènement déclenché par un élément remonte l’arborescence et déclenche le même évènement sur les éléments parents :
<div class="post">
<h2><a href="/path/to/page">My Page</a></h2>
<div class="content">
Teaser text…
</div>
</div>
<div class="post">
<h2><a href="/path/to/other_page">My Other Page</a></h2>
<div class="content">
Teaser text…
</div>
</div>
Dans cet exemple, si nous cliquons sur un des liens, l’évènement click va remonter l’arborescence jusqu’à la div.post. En utilisant le fameux « return false » ce « bubbling » sera annulé alors qu’en utilisant simplement un « preventDefault », c’est seulement le comportement par défaut de l’évènement sur l’élèment qui le déclenche qui sera annulé : autrement dit, la navigation vers la cible du lien.
Pour plus d’infos sur la stratégie des évènements (bubble ou pas, annulable ou pas, …) : http://en.wikipedia.org/wiki/DOM_events
J’ignorais que le
return false;
provoquait le déclenchement de ces trois fonctions, mais je l’utilise abondamment (si ce n’est systématiquement) pour bloquer le comportement « normal » d’un élément.Un point dans cet article m’a un peu dérouté, en quoi écrire :
$("a.toggle").click(function () {
$("#mydiv").toggle();
return false;
});
signifie que le lien devrait normalement suivre l’ancre #myDiv.
C’est pas complètement vrai, on peut très bien imaginer ce lien :
<a href="http://js4design.com/" class="toggle">Toggle the next div</a>
Le lien aurait tout de même un contrôle sur la visibilité de l’élément porteur de l’id #myDiv.
Je pense que cette partie de l’article peut porter à confusion : « Le premier exemple changera bien la visibilité de #mydiv sans pour autant nous amener jusqu’à l’ancre #mydiv. »
Excellent continuation, et merci pour ces articles.