147 votes

preventDefault() sur une balise <a>

J'ai du html/jquery qui fait glisser un div vers le haut et vers le bas pour le montrer/cacher, quand un lien est cliqué :

<ul class="product-info">
  <li>
    <a href="#">YOU CLICK THIS TO SHOW/HIDE</a>
    <div class="toggle">
      <p>CONTENT TO SHOW/HIDE</p>
    </div>
  </li>
</ul>

et mon jquery...

$('div.toggle').hide();
  $('ul.product-info li a').click(function(event){
    $(this).next('div').slideToggle(200);
  }         
);

Ma question est la suivante : comment puis-je utiliser preventDefault() pour empêcher le lien de se comporter comme un lien et d'ajouter # à la fin de mon URL et de sauter en haut de la page ? Je n'arrive pas à trouver la bonne syntaxe, je continue à obtenir une erreur disant que preventDefault() n'est pas une fonction.

204voto

Davide Gualano Points 5832

Essayez quelque chose comme

$('div.toggle').hide();
  $('ul.product-info li a').click(function(event){
    event.preventDefault();
    $(this).next('div').slideToggle(200);
  }             
);

Voici la page à ce sujet dans la documentation de jQuery :

http://docs.jquery.com/Events_(Guide)#event.preventDefault.28__.29

62voto

Musaddiq Khan Points 128

Définissez l'attribut href comme href="javascript: ;"

<ul class="product-info">
  <li>
   <a href="javascript:;">YOU CLICK THIS TO SHOW/HIDE</a>
  <div class="toggle">
    <p>CONTENT TO SHOW/HIDE</p>
  </div>
 </li>
</ul>

39voto

Ryan Points 303

Je sais que c'est un vieux post, mais il est en fait suggéré de ne pas utiliser return false, car trois choses se produisent en conséquence :

  1. event.preventDefault() ;
  2. event.stopPropagation() ;
  3. Arrête l'exécution de la callback et revient immédiatement lorsqu'elle est appelée.

Vous ne devriez donc vraiment utiliser que la première (dans ce type de situation) : event.preventDefault() ;

Lisez ceci : http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/ pour plus de détails à ce sujet.

13voto

Kent Fredric Points 35592

Sinon, vous pouvez simplement renvoyer false à partir de l'événement de clic :

 $('div.toggle').hide();
 $('ul.product-info li a').click(function(event){
  $(this).next('div').slideToggle(200);
+ return false; 
 });

Ce qui empêcherait le déclenchement de la A-Href.

Notez cependant que, pour des raisons d'ergonomie, dans un monde idéal, le href devrait toujours aller quelque part, pour les personnes qui veulent ouvrir le lien dans un nouvel onglet ;)

12voto

Jefrey Bulla Points 51

Voici une solution non JQuery que je viens de tester et qui fonctionne.

<html lang="en">
<head>
<script type="text/javascript">
addEventListener("load",function(){
    var links= document.getElementsByTagName("a");
    for (var i=0;i<links.length;i++){
        links[i].addEventListener("click",function(e){
        alert("NOPE!, I won't take you there haha");
        //prevent event action
        e.preventDefault();
        })
    }
}); 

</script>
</head>
<body>
<div>
<ul>
    <li><a href="http://www.google.com">Google</a></li>
    <li><a href="http://www.facebook.com">Facebook</a></li>
    <p id="p1">Paragraph</p>
</ul>
</div>
<p>By Jefrey Bulla</p>
</body>
</html>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X