Come disabilito un collegamento href in JavaScript?


107

Ho un tag <a href="#"> Previous </a> 1 2 3 4 <a href="#"> Next </a>e in alcune condizioni voglio che questo tag sia completamente disabilitato.

Codice dai commenti (è così che viene generato il collegamento)

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>';

in alcune condizioni voglio che questo tag sia completamente disabilitato : cosa significa? Quali condizioni?
Felix Kling

1
Per disabilitato vuoi dire che vuoi che il testo appaia ancora come link (sottolineato e tutto) ma non fare nulla quando cliccato?
Shadow Wizard is Ear For You

Risposte:


190

Prova questo quando non vuoi che l'utente reindirizzi al clic

<a href="javascript: void(0)">I am a useless link</a>

54
Che ne dici <a href='javascript:;'>I am a shorter useless link</a>?
Charlie Schliesser

16
Non serve nemmeno il punto e virgola.
mVChr

44
Voi sviluppatori web mettete milioni di tab \t, line feed \ne spazi solo per vedere il codice ripiegato e carino (per chi? Browser) e ora vi preoccupate di circa 7 byte void(0)e / o un ;, o dio.

3
Sono leggermente in disaccordo con il commento sopra. A volte le cose devono essere descrittive e in altri casi devono essere più semplici e facili da ricordare. Preferirei "javascript:".
Lamy

2
A mio parere - Millions millions of tabs\t, line feeds\n and spaces- sì, questo rende il codice facile da capire, mentre void(0)non lo è. Ecco perché questo dovrebbe essere rimosso o deve essere il più breve possibile. Ad esempio qui più breve - è per la comprensione (lettura) non per la "compressione" o l'economia dei byte. :)
Cherry il

71

puoi disattivare tutti i link in una pagina con questa classe di stile:

a {
    pointer-events:none;
}

ora ovviamente il trucco è disattivare i link solo quando serve, ecco come farlo:

usa una classe A vuota, come questa:

a {}

quindi quando vuoi disattivare i link, fai questo:

    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
    }

NOTA: i nomi delle regole CSS vengono trasformati in minuscolo in alcuni browser e questo codice fa distinzione tra maiuscole e minuscole, quindi è meglio usare nomi di classe minuscoli per questo

per riattivare i collegamenti:

GetStyleClass('a').pointerEvents = ""

controlla questa pagina http://caniuse.com/pointer-events per informazioni sulla compatibilità del browser

Penso che questo sia il modo migliore per farlo, ma purtroppo IE, come sempre, non lo permetterà :) Lo sto comunque postando, perché penso che contenga informazioni che possono essere utili e perché alcuni progetti usano un browser noto , come quando utilizzi le visualizzazioni web su dispositivi mobili.

se vuoi solo disattivare UN link (mi rendo conto solo che era QUELLA la domanda), userei una funzione che imposta manualmente l'URL della pagina corrente, oppure no, in base a quella condizione. (come la soluzione che hai accettato)

questa domanda è stata MOLTO più facile di quanto pensassi :)


3
Devo ringraziarti per il pointer-events:none;non ho mai saputo di quel tag, è stato molto utile!
Johnathan Brown

3
Questo è fantastico, ma vale la pena notare che pointer-events non è supportato in IE prima della versione 11. caniuse.com/#feat=pointer-events
JakeRobb

2
L'ho provato su questa pagina modificando gli stili globali ma poi non ho potuto
votarti positivamente

È stato incredibile! ha avuto difficoltà a trovare un modo per farlo senza jquery.
Hesam Khaki

Mi piace la risposta css meglio delle altre perché non richiede la mutazione dell'href del link che, nel mio caso, è dinamico.
Paul

16

Puoi semplicemente dargli un hash vuoto:

anchor.href = "#";

o se questo non è abbastanza buono come "disabilitazione", usa un gestore di eventi:

anchor.href = "javascript:void(0)";

21
# non è consigliato, perché? considera questo, il tuo link disabilitato appare in fondo / piè di pagina di una lunga pagina, cliccando il link ti porterà in cima, "javascript :;" è abbastanza
Kumar

3
# 1 non torna all'inizio
Cétia

3
@ Bixi, scorrerà fino a un elemento con un ID 1se viene aggiunto in seguito.
ps2goat

Ebbene sì, è ovvio. Sapendo che non creare mai un id = 1. È solo una possibile soluzione alternativa
Cétia

Questo non funzionerà se hai una <base> diversa dalla tua pagina corrente
Miguel Pynto,

9

Prova questo usando jQuery:

$(function () {
    $('a.something').on("click", function (e) {
        e.preventDefault();
    });
});

5
anchor.href = null;


1
chrome cerca di passare a una pagina denominata null per questa risposta ora
OrangeKing89

5
(function ($) {
    $( window ).load(function() {
        $('.navbar a').unbind('click');
        $('.navbar a').click(function () {
            //DO SOMETHING
            return false;
        });
    });
})(jQuery);

Trovo questo modo più facile da implementare. E ha il vantaggio che tu js. Non è all'interno del tuo html ma in un file diverso. Penso che senza lo scioglimento. Entrambi gli eventi sono ancora attivi. Non sono sicuro. Ma in un certo senso hai solo bisogno di questo evento


1
È unbindnecessario? Credo return falseo e.preventDefault()sarebbe sufficiente.
Tasos K.

Spiega cosa c'è di sbagliato nel codice di OP e perché questo risolve il problema modificando la tua risposta .
Baum mit Augen


4

Il modo più semplice per disabilitare un collegamento è semplicemente non mostrarlo. Esegui questa funzione ogni volta che desideri verificare se la tua condizione è soddisfatta per nascondere il pulsante Precedente (sostituisci if (true)con la tua condizione):

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";
            }
        }
    }
};

Quindi esegui testHideNav()ogni volta che devi controllare se la tua condizione è cambiata.


3

Utilizza invece uno span e un javascript onclick. Alcuni browser "saltano" se si dispone di un collegamento e "#" href.


Puoi fare un esempio per favore? Alcuni browser "salta" è vero .. :)
Arup Rakshit

Piacere di vederti, @ArupRakshit =) La risposta accettata lo fa con javascript: void(0);o javascript:;. Se stai eseguendo il rendering da Rails, esegui il rendering di uno span invece di dove vuoi che sia disabilitato.
Abdo

3

Anche questo è possibile:

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

Il collegamento non va da nessuna parte poiché la tua funzione verrà eseguita.


si prega di rivedere la risposta esistente
ses

3

Avevo un'esigenza simile, ma la mia motivazione era quella di evitare che il collegamento venisse fatto doppio clic. L'ho realizzato usando jQuery:

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

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

L'HTML ha questo aspetto:

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

2

Quindi le soluzioni di cui sopra fanno sì che il collegamento non funzioni, ma non rendono visibile (AFAICT) che il collegamento non è più valido. Ho una situazione in cui ho una serie di pagine e voglio disabilitare (e rendere ovvio che è disabilitato) il collegamento che punta alla pagina corrente.

Così:

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;
                }
            }
        }
    }
}

Questo passa attraverso l'elenco dei collegamenti, trova quello che punta alla pagina corrente (n_root3 potrebbe essere una cosa locale, ma immagino documentdebba avere qualcosa di simile) e sostituisce il collegamento con il contenuto del testo del collegamento.

HTH



0

Installa questo plugin per jquery e usalo

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

Ti consente di disabilitare / abilitare praticamente qualsiasi campo nella pagina.

Se vuoi aprire una pagina in qualche condizione scrivi una funzione java script e chiamala da href. Se la condizione è soddisfatta, apri la pagina, altrimenti non fare nulla.

il codice ha questo aspetto:

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

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

Puoi anche inserire il link in un div e impostare la proprietà di visualizzazione dell'attributo Style su none. questo nasconderà il div. Ad esempio,

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

Questo nasconderà il collegamento. Usa un pulsante o un'immagine per rendere visibile questo div ora chiamando questa funzione in onclick come:

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

and write the js code as:

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

Puoi anche inserire un tag id al tag html, quindi sarebbe

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

E ottieni questo ID sul tuo javascript usando

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

Uno di questi deve funzionare di sicuro haha


0

Un altro metodo per disabilitare il collegamento

element.removeAttribute('href');

il tag di ancoraggio senza href reagirebbe come testo disabilitato / normale

<a> w/o href </a>

invece di <a href="#"> with href </a>

vedi jsFiddel

spero che questo sia utile.


0

Invece di void puoi anche usare:

<a href="javascript:;">this link is disabled</a> 

-2

0) è meglio che ti ricordi che alcuni browser "saltano" se hai un link e "#" href. Quindi il modo migliore sarebbe un JavaScript personalizzato

1) Se dopo il JavaScript personalizzato , eccolo:

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

Il "return false" impedisce che il collegamento venga effettivamente seguito.

2) Puoi considerare di evitare di utilizzare quanto segue

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

o

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

Perché lo pseudo-protocollo javascript può mettere la pagina in uno stato di attesa in alcuni browser, il che può avere conseguenze impreviste. IE6 è noto per questo. Ma se non ti interessa IE6 e stai testando tutto, potrebbe essere una buona soluzione.

3) Se lo hai già jQuerye bootstrapnel tuo progetto, puoi provare a usarli in questo modo:

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

dove la .disabledclasse viene dal bootstrap.

Qupte form bootstrap site ( qui )

Avvertenza sulla funzionalità dei collegamenti

La classe .disabled pointer-events: nonetenta di disabilitare la funzionalità di collegamento di s, ma quella proprietà CSS non è ancora standardizzata. Inoltre, anche nei browser che supportano gli eventi del puntatore: nessuno, la navigazione da tastiera rimane inalterata, il che significa che gli utenti vedenti della tastiera e gli utenti di tecnologie assistive saranno comunque in grado di attivare questi collegamenti. Quindi, per sicurezza, aggiungi un tabindex="-1"attributo a questi collegamenti (per impedire loro di ricevere il focus della tastiera) e usalo custom JavaScriptper disabilitare la loro funzionalità.

e il è custom JavaScriptstato mostrato nella sezione 1


qualcuno aveva bisogno di metterlo come risposta, le persone bootstrap lo hanno fatto per un motivo. Anche se è una cattiva idea, è comunque una risposta e con la spiegazione del perché l'idea è cattiva, la risposta porta del bene alle persone.
Yevgeniy Afanasyev

risposta migliorata
Yevgeniy Afanasyev

-4

Di seguito il codice per i link disabilitati:

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

un'altra soluzione molto semplice è:

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

La prima soluzione è efficiente.


9
Si prega di rivedere le risposte esistenti prima di pubblicare. Quelle opzioni erano già state suggerite ... più di due anni fa. Meglio non resuscitare i vecchi thread a meno che la risposta non contribuisca in modo significativo alle risposte esistenti.
Leigh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.