Comment désactiver un lien href en JavaScript?

107

J'ai une balise <a href="#"> Previous </a> 1 2 3 4 <a href="#"> Next </a>et dans certaines conditions, je souhaite que cette balise soit complètement désactivée.

Code à partir des commentaires (c'est ainsi que le lien est généré)

if (n_index != n_pages) 
    a = a+'<li><a href="#" onclick="javascript:paginateAjaxPage('+(n_index+1) +','+stype+');">></a></li><li><a href="#" onclick="javascript:paginateAjaxPage('+n_pages+','+stype+');" >>></a></li>'; 
else 
    a = a+'<li><a style="cursor: pointer;" onclick="return false;">></a></li><li><a style="cursor: pointer;" onclick="return false" >>></a></li>'; 
a = a+'</ul></div>';
guerrier
la source
dans certaines conditions, je souhaite que cette balise soit complètement désactivée : qu'est-ce que cela signifie? Quelles conditions?
Felix Kling
1
Par désactivé, vous voulez dire que vous voulez que le texte apparaisse toujours sous forme de lien (souligné et tout) mais ne rien faire lorsque vous cliquez dessus?
Shadow Wizard est une oreille pour vous

Réponses:

190

Essayez ceci lorsque vous ne voulez pas que l'utilisateur redirige sur clic

<a href="javascript: void(0)">I am a useless link</a>
Pranay Rana
la source
54
Et pourquoi pas <a href='javascript:;'>I am a shorter useless link</a>?
Charlie Schliesser
16
Vous n'avez même pas besoin du point-virgule.
mVChr
44
Vous, les développeurs Web, mettez des millions d'onglets \t, de sauts de ligne \net d'espaces pour simplement voir le code plié et agréable (pour qui? Navigateur) et vous vous inquiétez maintenant de 7 octets void(0)et / ou d'un ;, o dieu.
3
Je suis légèrement en désaccord avec le commentaire ci-dessus. Parfois, les choses doivent être descriptives et dans d'autres cas, plus simples et plus faciles à retenir. Je préférerais "javascript:".
Lamy
2
À mon avis - Millions millions of tabs\t, line feeds\n and spaces- oui, cela rend le code facile à comprendre, alors que ce void(0)n'est pas le cas. C'est pourquoi cela doit être supprimé ou doit être aussi court que possible. Par exemple, ici plus court - est pour comprendre (lire) pas pour "compression" ou octets ecomony. :)
Cherry
71

vous pouvez désactiver tous les liens d'une page avec cette classe de style:

a {
    pointer-events:none;
}

maintenant, bien sûr, l'astuce est de désactiver les liens uniquement lorsque vous en avez besoin, voici comment procéder:

utilisez une classe A vide, comme ceci:

a {}

puis lorsque vous souhaitez désactiver les liens, procédez comme suit:

    GetStyleClass('a').pointerEvents = "none"

    function GetStyleClass(className)
    {
       for (var i=0; i< document.styleSheets.length; i++) {
          var styleSheet = document.styleSheets[i]

          var rules = styleSheet.cssRules || styleSheet.rules

          for (var j=0; j<rules.length; j++) {
             var rule = rules[j]

             if (rule.selectorText === className) {
                return(rule.style)
             }
          }
       }

       return 0
    }

REMARQUE: les noms de règles CSS sont transformés en minuscules dans certains navigateurs, et ce code est sensible à la casse, il vaut donc mieux utiliser les noms de classe en minuscules pour cela

pour réactiver les liens:

GetStyleClass('a').pointerEvents = ""

consultez cette page http://caniuse.com/pointer-events pour plus d'informations sur la compatibilité du navigateur

Je pense que c'est la meilleure façon de le faire, mais malheureusement, IE, comme toujours, ne le permettra pas :) Je poste quand même, parce que je pense que cela contient des informations qui peuvent être utiles, et parce que certains projets utilisent un navigateur connu , comme lorsque vous utilisez des vues Web sur des appareils mobiles.

si vous voulez juste désactiver UN lien (je me rends seulement compte que c'était la question), j'utiliserais une fonction qui définit manuellement l'url de la page actuelle, ou non, en fonction de cette condition. (comme la solution que vous avez acceptée)

cette question était BEAUCOUP plus facile que je ne le pensais :)

Pizzaiola Gorgonzola
la source
3
pointer-events:none;Je dois vous remercier pour le je n'ai jamais su à propos de cette balise, très utile!
Johnathan Brown
3
C'est fantastique, mais il convient de noter que pointer-events n'est pas pris en charge dans IE avant la version 11. caniuse.com/#feat=pointer-events
JakeRobb
2
Je l'ai essayé sur cette page en éditant les styles globaux mais je n'ai pas pu vous voter pour :)
pllee
C'était génial! eu du mal à trouver un moyen de le faire sans jquery.
Hesam Khaki
J'aime mieux la réponse css que les autres car elle ne nécessite pas de muter le href du lien qui, dans mon cas, est dynamique.
Paul
16

Vous pouvez simplement lui donner un hachage vide:

anchor.href = "#";

ou si ce n'est pas suffisant pour un "désactiver", utilisez un gestionnaire d'événements:

anchor.href = "javascript:void(0)";
tcooc
la source
21
# n'est pas recommandé, pourquoi? considérez ceci, votre lien désactivé apparaît en bas / pied de page d'une longue page, en cliquant sur le lien vous amènera en haut, "javascript :;" est assez
Kumar
3
# 1 ne reviendra pas vers le haut
Cétia
3
@Bixi, il fera défiler jusqu'à un élément avec un identifiant de 1si on est ajouté plus tard.
ps2goat
Eh bien oui, c'est évident. Sachant que ne créez jamais un id = 1. C'est juste une solution de contournement possible
Cétia
Cela ne fonctionnera pas si vous avez une <base> différente de votre page actuelle
Miguel Pynto
9

Essayez ceci en utilisant jQuery:

$(function () {
    $('a.something').on("click", function (e) {
        e.preventDefault();
    });
});
ValentinVoilean
la source
5
anchor.href = null;

dn3s
la source
1
chrome essaie de naviguer vers une page nommée null pour cette réponse maintenant
OrangeKing89
5
(function ($) {
    $( window ).load(function() {
        $('.navbar a').unbind('click');
        $('.navbar a').click(function () {
            //DO SOMETHING
            return false;
        });
    });
})(jQuery);

Je trouve ce moyen plus facile à mettre en œuvre. Et cela a l'avantage que vous js. N'est pas dans votre html mais dans un fichier différent. Je pense que sans le détachement. Les deux événements sont toujours actifs. Pas certain. Mais d'une certaine manière, vous n'avez besoin que de cet événement

user3806549
la source
1
Est unbindnécessaire? Je crois return falseou e.preventDefault()suffirait.
Tasos K.
Veuillez expliquer ce qui ne va pas avec le code d'OP et pourquoi cela résout le problème en éditant votre réponse .
Baum mit Augen
4

Le moyen le plus simple de désactiver un lien est simplement de ne pas l'afficher. Exécutez cette fonction chaque fois que vous souhaitez tester si votre condition est remplie pour masquer le bouton Précédent (remplacez-le if (true)par votre condition):

var testHideNav = function() {
    var aTags = document.getElementsByTagName('a'),
        atl = aTags.length,
        i;

    for (i = 0; i < atl; i++) {
        if (aTags[i].innerText == "Previous") {
            if (true) { // your condition to disable previous
                aTags[i].style.visibility = "hidden";
            } else {
                aTags[i].style.visibility = "visible";
            }
        } else if (aTags[i].innerText == "Next") {
            if (false) { // your condition to disable next
                aTags[i].style.visibility = "hidden";
            } else {
                aTags[i].style.visibility = "visible";
            }
        }
    }
};

Ensuite, exécutez testHideNav()chaque fois que vous devez vérifier si votre état a changé.

mVChr
la source
3

Utilisez plutôt un span et un javascript onclick. Certains navigateurs "sautent" si vous avez un lien et "#" href.

Abdo
la source
Pouvez-vous nous donner un exemple? Certains navigateurs "sautent" est vrai .. :)
Arup Rakshit
Ravi de vous voir, @ArupRakshit =) La réponse acceptée le fait avec javascript: void(0);ou javascript:;. Si vous effectuez un rendu à partir de Rails, effectuez simplement le rendu d'une étendue à l'endroit où vous souhaitez qu'elle soit désactivée.
Abdo
3

Ceci est également possible:

<a href="javascript:void(0)" onclick="myfunction()">

Link ne va nulle part car votre fonction sera exécutée.

Mikko
la source
veuillez revoir la réponse existante
ses
3

J'avais un besoin similaire, mais ma motivation était d'éviter que le lien ne soit double-cliqué. Je l'ai accompli en utilisant jQuery:

$(document).ready(function() {
    $("#myLink").on('click', doSubmit);
});

var doSubmit = function() {
    $("#myLink").off('click');
    // do things here
};

Le HTML ressemble à ceci:

<a href='javascript: void(0);' id="myLink">click here</a>
JakeRobb
la source
2

Ainsi, les solutions ci-dessus font que le lien ne fonctionne pas, mais ne rendent pas visible (AFAICT) que le lien n'est plus valide. J'ai une situation où j'ai une série de pages et que je veux désactiver (et rendre évident qu'il est désactivé) le lien qui pointe vers la page actuelle.

Alors:

window.onload = function() {
    var topics = document.getElementsByClassName("topics");
    for (var i = topics.length-1; i > -1; i-- ) {
        for (var j = topics[i].childNodes.length-1; j > -1; j--) {
             if (topics[i].childNodes[j].nodeType == 1) {
                if (topics[i].childNodes[j].firstChild.attributes[0].nodeValue == this.n_root3) {
                    topics[i].childNodes[j].innerHTML = topics[i].childNodes[j].firstChild.innerHTML;
                }
            }
        }
    }
}

Cela parcourt la liste des liens, trouve celui qui pointe vers la page actuelle (le n_root3 peut être une chose locale, mais j'imagine qu'il documentdoit avoir quelque chose de similaire), et remplace le lien par le contenu du texte du lien.

HTH

David
la source
1

Merci à tous...

Mon problème résolu par le code ci-dessous:

<a href="javascript:void(0)"> >>> </a>
guerrier
la source
2
avant de passer à la production, je recommande ce lien -> stackoverflow.com/questions/3125652/…
Kumar
ce lien n'est utile que si vous vous souciez de IE6
Yevgeniy Afanasyev
0

Installez ce plugin pour jquery et utilisez-le

http://plugins.jquery.com/project/jqueryenabledisable

Il vous permet de désactiver / activer à peu près n'importe quel champ de la page.

Si vous voulez ouvrir une page sous certaines conditions, écrivez une fonction de script java et appelez-la depuis href. Si la condition est remplie, vous ouvrez la page, sinon ne faites rien.

le code ressemble à ceci:

<a href="javascript: openPage()" >Click here</a>

and function:
function openPage()
{
if(some conditon)
opener.document.location = "http://www.google.com";
}
}

Vous pouvez également placer le lien dans un div et définir la propriété d'affichage de l'attribut Style sur aucun. cela masquera le div. Par exemple,

<div id="divid" style="display:none">
<a href="Hiding Link" />
</div>

Cela masquera le lien. Utilisez un bouton ou une image pour rendre ce div visible maintenant en appelant cette fonction dans onclick comme:

<a href="Visible Link" onclick="showDiv()">

and write the js code as:

function showDiv(){
document.getElememtById("divid").style.display="block";
}

Vous pouvez également mettre une balise d'identification sur la balise html, donc ce serait

<a id="myATag" href="whatever"></a>

Et obtenez cet identifiant sur votre javascript en utilisant

document.getElementById("myATag").value="#"; 

L'un de ces éléments doit fonctionner à coup sûr haha

dLobatog
la source
0

Une autre méthode pour désactiver le lien

element.removeAttribute('href');

la balise d'ancrage sans href réagirait comme du texte désactivé / brut

<a> w/o href </a>

au lieu de <a href="#"> with href </a>

voir jsFiddel

j'espère que c'est utile.

Akshay
la source
0

Au lieu de void, vous pouvez également utiliser:

<a href="javascript:;">this link is disabled</a> 
Roy Shoa
la source
-2

0) il vaut mieux se rappeler que certains navigateurs "sautent" si vous avez un lien et "#" href. Le meilleur moyen serait donc un JavaScript personnalisé

1) Si vous recherchez le JavaScript personnalisé , le voici:

<a href="#" onclick="DoSomething(); return false;">Link</a>

Le "return false" empêche le lien d'être effectivement suivi.

2) Vous pouvez envisager d' éviter d'utiliser les

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

ou

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

Parce que le pseudo-protocole javascript peut mettre la page en état d'attente dans certains navigateurs, ce qui peut avoir des conséquences inattendues. IE6 est connu pour cela. Mais si vous ne vous souciez pas d'IE6 et que vous testez tout, cela peut être une bonne solution.

3) Si vous avez déjà jQueryet bootstrapdans votre projet, vous pouvez envisager de les utiliser comme ceci:

$('.one-click').on("click", function (e) {
   $( this ).addClass('disabled');
});

où la .disabledclasse vient du bootstrap.

Site de bootstrap du formulaire Qupte ( ici )

Mise en garde relative à la fonctionnalité de lien

La classe .disabled utilise pointer-events: nonepour essayer de désactiver la fonctionnalité de lien de s, mais cette propriété CSS n'est pas encore normalisée. En outre, même dans les navigateurs qui prennent en charge les événements de pointeur: aucun, la navigation au clavier reste inchangée, ce qui signifie que les utilisateurs de clavier voyants et les utilisateurs de technologies d'assistance pourront toujours activer ces liens. Donc, pour être sûr, ajoutez un tabindex="-1"attribut sur ces liens (pour les empêcher de recevoir le focus clavier) et utilisez custom JavaScriptpour désactiver leur fonctionnalité.

et le a custom JavaScriptété montré dans la section 1

Yevgeniy Afanasyev
la source
quelqu'un avait besoin de le mettre comme une réponse, les gens bootstrap l'ont fait pour une raison. Même si c'est une mauvaise idée, c'est toujours une réponse et avec une explication pourquoi l'idée est mauvaise, la réponse apporte du bien aux gens.
Yevgeniy Afanasyev
réponse améliorée
Yevgeniy Afanasyev
-4

Ci-dessous le code pour les liens désactivés:

<a href="javascript: void(0)">test disabled link</a> 

une autre solution très simple est:

<a href="#">test disabled link</a>

La première solution est efficace.

Rizwan Gill
la source
9
Veuillez examiner les réponses existantes avant de publier. Ces options ont déjà été suggérées ... il y a plus de deux ans. Il vaut mieux ne pas ressusciter les anciens threads à moins que la réponse n'apporte quelque chose d' important par rapport aux réponses existantes.
Leigh