56 votes

Comment annuler la navigation lorsque l'utilisateur clique sur un lien (élément <a>) ?

J'essaie de charger des éléments en utilisant AJAX lorsqu'un utilisateur clique sur un lien, mais je veux que le lien aille quelque part pour que l'application fonctionne toujours lorsque javascript est désactivé. Existe-t-il un moyen de faire quelque chose avec javascript et d'annuler la navigation lorsqu'un lien est cliqué ?

Quelle est la meilleure pratique ? Cela peut-il être fait, ou dois-je remplacer le lien en utilisant du javascript ou autre ?

55voto

Paolo Bergantino Points 199336

Si vous avez du HTML comme ça :

<a href="no_javascript.html" id="mylink">Do Something</a>

Vous feriez quelque chose comme ça avec jQuery :

$(document).ready(function() {
    $('#mylink').click(function() {
        doSomethingCool();
        return false; // cancel the event
    });
});

Il suffit d'annuler l'événement de clic avec Javascript pour empêcher l'action par défaut de se produire. Ainsi, lorsque quelqu'un clique sur le lien avec Javascript activé, doSomethingCool(); est appelé et l'événement de clic est annulé (donc l'élément return false; ) et empêche le navigateur d'aller à la page spécifiée. En revanche, si le Javascript est désactivé, le navigateur se rendra à la page suivante no_javascript.html directement.

3 votes

+1, mais beaucoup de gens mettent href="#" dans les liens qu'ils prévoient d'utiliser avec javascript.

0 votes

Ok, je suis un idiot. Je pensais que c'était la chose à faire mais ça ne marchait pas. Il s'avère que c'était juste IE qui mettait en cache le javascript et n'exécutait pas ma nouvelle ligne avec return false.

1 votes

@Gromer - L'idée est de le faire fonctionner avec ou sans javascript.

45voto

Partap Davis Points 221

Rien de tout cela n'a fonctionné pour moi avec le navigateur Google Chrome.

Voici ce qui a fonctionné (en utilisant jQuery) :

$(document).ready(function() {
    $('#mylink').click(function(event) {
        doSomethingCool();
        event.preventDefault(); // cancel the event
    });
});

3 votes

Renvoyer false fonctionne pour IE, mais pas pour Firefox ou Chrome ; Cette solution a fonctionné pour les deux, Merci !

2 votes

Deux ajouts : 1) On peut vouloir appeler preventDefault() avant de faire quelque chose de cool. 2) Ajoutez ceci au début de la fonction pour prendre en charge correctement le bouton central de la souris : if(event.which != 1) return ;

31voto

Sergey Kovalenko Points 364

Pourquoi jQuery ?

HTML :

<a href="no_javascript.html" onclick="return doSmth()">Link</a>

...et du code javascript :

function doSmth(){
  // your code here
  return false
}

0 votes

Eh bien je travaille avec jQuery (comme la majorité des gens sur ce site il semble), même si je n'ai pas précisé... mais merci pour le post, il peut être utile à quelqu'un.

1 votes

Ok, je vois. Je pense que les frameworks peuvent être utiles pour les grands projets puissants. Mais pour les petits sites...

4 votes

Les frameworks Javascript sont utiles sur les sites de toutes tailles qui se soucient de la compatibilité des navigateurs. De plus, l'utilisation d'événements en ligne est une mauvaise pratique en général.

8voto

jsa Points 38

Ce que je ferais, ce sont :

a. pour l'attribut href, javascript:void(); sera fixé

b. pour l'événement onclick, fournir une fonction pour gérer l'événement de clic et cette fonction retournera false.

eg :

<script type="text/javascript">
   function myfunction()
   {
      //do something
      return false;
   }
   </script>

   <a href="javascript:void();" onclick="myfunction()">Link</a>

3voto

chill Points 1

Pour IE au moins, il suffit de mettre this.event.returnValue = false; à la fin de la méthode.

par exemple

function onClickFunction()
 {
  someMethod();
  this.event.returnValue = false;
 }

J'avais une méthode complexe où cela a fait l'affaire.

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