302 votes

jQuery désactiver un lien

Quelqu'un sait-il comment désactiver un lien dans jquery SANS utiliser return false; ?

Plus précisément, ce que j'essaie de faire, c'est de désactiver le lien d'un élément, en effectuant un clic sur celui-ci à l'aide de jquery qui déclenche certaines choses, puis en réactivant ce lien de sorte que s'il est cliqué à nouveau, il fonctionne comme par défaut.

Merci. Dave

UPDATE Voici le code. Ce qu'il faut faire après le .expanded a été appliquée est de réactiver la liaison désactivée.

$('ul li').click(function(e) {
    e.preventDefault();
    $('ul').addClass('expanded');
    $('ul.expanded').fadeIn(300);
    //return false;
});

7 votes

Pourquoi l'obligation de ne pas utiliser return false ? Utilisez-le, puis supprimez le gestionnaire d'événement lorsqu'il ne s'applique plus (ou ajoutez-y une condition pour renvoyer des valeurs différentes en fonction de l'état de l'élément mentionné).

0 votes

Essayez-vous simplement d'effectuer un prétraitement avant que le lien ne soit suivi sur la même action de clic ? c'est-à-dire que vous ne proposez pas deux clics mais plutôt que l'utilisateur clique sur le lien, que certaines actions se produisent et que le lien soit suivi ?

0 votes

Sinon, pouvez-vous expliquer pourquoi vous adoptez cette approche, car une meilleure compréhension de l'espace du problème améliorera les réponses.

376voto

karim79 Points 178055
$('#myLink').click(function(e) {
    e.preventDefault();
    //do other stuff when a click happens
});

Cela empêchera le comportement par défaut d'un hyperlien, qui consiste à visiter le href spécifié.

Depuis le site jQuery tutoriel :

Pour le clic et la plupart des autres événements, vous pouvez empêcher le comportement par défaut - ici, en suivant le lien vers jquery.com - en appelant event.preventDefault() dans le gestionnaire d'événement

Si vous voulez preventDefault() seulement si une certaine condition est remplie (quelque chose est caché par exemple), vous pourriez tester la visibilité de votre ul avec la classe élargi . S'il est visible (c'est-à-dire non caché), le lien devrait se déclencher normalement, car l'instruction if ne sera pas saisie, et le comportement par défaut ne sera donc pas empêché :

$('ul li').click(function(e) {
    if($('ul.expanded').is(':hidden')) {
        e.preventDefault();
        $('ul').addClass('expanded');
        $('ul.expanded').fadeIn(300);
    } 
});

3 votes

Avec jQuery 1.7+, vous pouvez utiliser on/off : stackoverflow.com/questions/209029/

0 votes

S'il a un href et un onclick, cela fonctionnera $("#myLink").attr('onclick', '').click(function (e) { e.preventDefault() ; }) ;

0 votes

Réalisé par ajax et jquery je peux cacher un href acheter ayant le callback pour empêcher les scrapers d'obtenir ces liens. Merci beaucoup !

117voto

TStamper Points 17163

Essayez ça :

$("a").removeAttr('href');

EDIT-

A partir de votre code mis à jour :

 var location= $('#link1').attr("href");
 $("#link1").removeAttr('href');
 $('ul').addClass('expanded');
 $('ul.expanded').fadeIn(300);
 $("#link1").attr("href", location);

3 votes

Jouer avec les href est très agréable car c'est un moyen rapide de déshabiliter un lien qui effectue une action via un événement onclick. Très très astucieux !

0 votes

Méthode douce pour empêcher le navigateur d'ajouter le # à l'intérieur de l'URI lors de l'exécution de l'opération. href="#"

68voto

Hein Points 452

Pour ceux qui, comme moi, sont arrivés ici via Google, voici une autre approche :

css:
.disabled {
  color: grey; // ...whatever
}

jQuery:
$('#myLink').click(function (e) {
  e.preventDefault();
  if ($(this).hasClass('disabled'))
    return false; // Do something else in here if required
  else
    window.location.href = $(this).attr('href');
});

// Elsewhere in your code
if (disabledCondition == true)
  $('#myLink').addClass('disabled')
else
  $('#myLink').removeClass('disabled')

Rappelez-vous : il ne s'agit pas seulement d'une classe css

class="buttonstyle"

mais aussi ces deux

class="buttonstyle disabled"

afin que vous puissiez facilement ajouter et supprimer d'autres classes avec jQuery. Pas besoin de toucher aux href...

J'adore jQuery ! ;-)

2 votes

Cela suppose que le lien n'a pas de cible :)

2 votes

Au lieu de faire toutes ces fantaisies, pourquoi ne pas simplement placer l'onclick plus haut dans le dom, utiliser on() pour filtrer tous les a.disabled et empêcher les liens par défaut. Ensuite, il vous suffit d'activer/désactiver la classe désactivée et le lien se gérera de lui-même lorsqu'il sera "activé".

0 votes

Pas besoin de "== true" -- addClass('disabled') s'exécutera de toute façon. if(disabledCondition)

60voto

Peter DeWeese Points 10185

Voici une autre solution css/jQuery que je préfère pour sa brièveté et la réduction des scripts :

css :

a.disabled {
  opacity: 0.5
  pointer-events: none
  cursor: default
}

jQuery :

$('.disableAfterClick').click(function (e) {
   $(this).addClass('disabled'))
});

7 votes

De Mozilla : "Avertissement : L'utilisation de pointeurs-événements en CSS pour les éléments non-SVG est expérimentale. La fonctionnalité faisait partie du projet de spécification CSS3 UI mais, en raison de nombreux problèmes ouverts, elle a été reportée à CSS4."

1 votes

C'est une bonne chose, mais il se trouve qu'elle fonctionne bien dans la plupart des navigateurs modernes.

0 votes

Vous pouvez envisager d'enchaîner .prop("tabindex", "-1"); après le addClass

21voto

Kailas Mane Points 358

Vous pouvez supprimer le clic pour le lien en suivant ;

$('#link-id').unbind('click');

Vous pouvez réactiver le lien par les moyens suivants,

$('#link-id').bind('click');

Vous ne pouvez pas utiliser la propriété "disabled" pour les liens.

1 votes

Facile à activer et à désactiver par rapport aux autres.

3 votes

"Vous ne pouvez pas utiliser la propriété 'disabled' pour les liens." Je me demande pourquoi il n'y a pas de cohérence entre un bouton, et un lien pour la désactivation. "disabled" devrait aussi fonctionner pour un lien. C'est comme dire que pour une voiture Chevy, il faut appuyer sur la pédale de frein pour s'arrêter, mais pour cet autre constructeur automobile, il faut utiliser ce levier situé sur le toit.

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