Jak wyłączyć łącze href w JavaScript?

108

Mam tag <a href="#"> Previous </a> 1 2 3 4 <a href="#"> Next </a>i chcę, aby w pewnych warunkach ten tag był całkowicie wyłączony.

Kod z komentarzy (tak jest generowany link)

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>';
Wojownik
źródło
w pewnych warunkach chcę, aby ten tag był całkowicie wyłączony : Co to oznacza? Jakie warunki?
Felix Kling,
1
Przez wyłączone masz na myśli, że chcesz, aby tekst nadal pojawiał się jako łącze (podkreślenie i wszystko), ale nic nie robisz po kliknięciu?
Shadow Wizard is Ear For You

Odpowiedzi:

191

Spróbuj tego, jeśli nie chcesz, aby użytkownik przekierowywał po kliknięciu

<a href="javascript: void(0)">I am a useless link</a>
Pranay Rana
źródło
54
A co powiesz <a href='javascript:;'>I am a shorter useless link</a>?
Charlie Schliesser
16
Nie potrzebujesz nawet średnika.
mVChr,
44
Wy twórcy stron internetowych umieszczacie miliony zakładek \t, linii \ni spacji, aby zobaczyć, jak kod jest złożony i ładny (dla kogo? Przeglądarka), a teraz martwicie się o 7 bajtów void(0)i / lub ;o Boże.
3
Nieco nie zgadzam się z powyższym komentarzem. Czasami rzeczy muszą być opisowe, aw innych przypadkach prostsze i łatwiejsze do zapamiętania. Wolałbym „javascript:”.
Lamy
2
Moim zdaniem - Millions millions of tabs\t, line feeds\n and spaces- tak, to sprawia, że ​​kod jest łatwy do zrozumienia, a void(0)nie jest. Dlatego należy to usunąć lub jak najkrótsze. Np. Tutaj krócej - służy do zrozumienia (czytania), a nie do "kompresji" lub ekomonii bajtów. :)
Cherry
71

możesz dezaktywować wszystkie linki na stronie z tą klasą stylu:

a {
    pointer-events:none;
}

teraz oczywiście sztuczka polega na dezaktywowaniu linków tylko wtedy, gdy trzeba, oto jak to zrobić:

użyj pustej klasy A, na przykład:

a {}

wtedy gdy chcesz dezaktywować linki, zrób to:

    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
    }

UWAGA: W niektórych przeglądarkach nazwy reguł CSS są przekształcane na małe litery, a ten kod jest wrażliwy na wielkość liter, więc lepiej używaj do tego nazw klas małych liter

aby ponownie aktywować linki:

GetStyleClass('a').pointerEvents = ""

sprawdź tę stronę http://caniuse.com/pointer-events, aby uzyskać informacje na temat zgodności przeglądarek

Myślę, że to najlepszy sposób na zrobienie tego, ale niestety IE, jak zawsze, na to nie pozwoli :) i tak to piszę, ponieważ myślę, że zawiera informacje, które mogą być przydatne, a niektóre projekty używają znanej przeglądarki , na przykład podczas korzystania z widoków internetowych na urządzeniach mobilnych.

jeśli chcesz tylko dezaktywować JEDNO łącze (zdaję sobie tylko sprawę, że było to pytanie), użyłbym funkcji, która ręcznie ustawia adres URL bieżącej strony, lub nie, na podstawie tego warunku. (jak rozwiązanie, które zaakceptowałeś)

to pytanie było DUŻO łatwiejsze niż myślałem :)

Pizzaiola Gorgonzola
źródło
3
Muszę ci podziękować za to, pointer-events:none;że nigdy nie wiedziałem o tej metce, bardzo się przydała!
Johnathan Brown
3
To fantastyczne, ale warto zauważyć, że pointer-events nie są obsługiwane w IE przed wersją 11. caniuse.com/#feat=pointer-events
JakeRobb
2
Wypróbowałem to na tej stronie, edytując style globalne, ale nie mogłem cię zagłosować :)
pllee
To było niesamowite! miał trudności ze znalezieniem sposobu na zrobienie tego bez jQuery.
Hesam Khaki
Odpowiedź css podoba mi się bardziej niż inne, ponieważ nie wymaga mutowania href linku, który w moim przypadku jest dynamiczny.
Paul
16

Możesz po prostu podać pusty hash:

anchor.href = "#";

lub jeśli to nie wystarczy do „wyłączenia”, użyj modułu obsługi zdarzeń:

anchor.href = "javascript:void(0)";
tcooc
źródło
21
# nie jest zalecane, dlaczego? weź pod uwagę to, twój wyłączony link pojawia się na dole / stopce długiej strony, kliknięcie linku przeniesie Cię na górę, "javascript :;" wystarczy
Kumar
3
Punkt
3
@Bixi, przewinie do elementu o identyfikatorze, 1jeśli zostanie dodany później.
ps2goat
Cóż, tak, to oczywiste. Wiedząc, że po prostu nigdy nie twórz id = 1. To tylko możliwe obejście
Cétia
To nie zadziała, jeśli masz inną bazę <base> niż Twoja bieżąca strona
Miguel Pynto
9

Spróbuj tego za pomocą jQuery:

$(function () {
    $('a.something').on("click", function (e) {
        e.preventDefault();
    });
});
ValentinVoilean
źródło
5
anchor.href = null;

dn3s
źródło
1
chrome próbuje teraz przejść do strony o nazwie null dla tej odpowiedzi
OrangeKing89
5
(function ($) {
    $( window ).load(function() {
        $('.navbar a').unbind('click');
        $('.navbar a').click(function () {
            //DO SOMETHING
            return false;
        });
    });
})(jQuery);

Ten sposób jest dla mnie łatwiejszy do wdrożenia. I ma tę zaletę, że ty js. Nie znajduje się w Twoim html, ale w innym pliku. Myślę, że bez rozpięcia. Oba wydarzenia są nadal aktywne. Niepewny. Ale w pewnym sensie potrzebujesz tylko tego jednego wydarzenia

user3806549
źródło
1
Jest unbindkonieczne? Wierzę return falselub e.preventDefault()wystarczyłoby.
Tasos K.
Proszę wyjaśnić, co jest nie tak z kodem OP i dlaczego to rozwiązuje problem , edytując odpowiedź .
Baum mit Augen
4

Najłatwiejszym sposobem wyłączenia linku jest po prostu nie pokazywanie go. Uruchom tę funkcję za każdym razem, gdy chcesz sprawdzić, czy twój warunek jest spełniony, aby ukryć przycisk Poprzedni (zamień na if (true)swój warunek):

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

Następnie biegnij testHideNav()za każdym razem, gdy musisz sprawdzić, czy twój stan się zmienił.

mVChr
źródło
3

Zamiast tego użyj span i javascript onclick. Niektóre przeglądarki „skaczą”, jeśli masz link i „#” href.

Abdo
źródło
Czy możesz podać przykład? Niektóre przeglądarki „skaczą” są prawdą… :)
Arup Rakshit,
Dobrze cię widzieć, @ArupRakshit =) Zaakceptowana odpowiedź robi to z javascript: void(0);lub javascript:;. Jeśli renderujesz z Railsów, po prostu wyrenderuj zakres w miejscu, w którym chcesz go wyłączyć.
Abdo,
3

To też jest możliwe:

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

Link nigdzie nie przechodzi przez twoją funkcję zostanie wykonana.

Mikko
źródło
proszę przejrzeć istniejącą odpowiedź
ses
3

Miałem podobną potrzebę, ale moją motywacją było zapobieganie dwukrotnemu kliknięciu linku. Dokonałem tego za pomocą jQuery:

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

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

Kod HTML wygląda następująco:

<a href='javascript: void(0);' id="myLink">click here</a>
JakeRobb
źródło
2

Zatem powyższe rozwiązania powodują, że łącze nie działa, ale nie pokazuje (AFAICT), że łącze jest już nieaktualne. Mam sytuację, w której mam serię stron i chcę wyłączyć (i pokazać, że jest wyłączone) łącze wskazujące na bieżącą stronę.

Więc:

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

Spowoduje to przeglądanie listy linków, znalezienie tego, który wskazuje na bieżącą stronę (n_root3 może być lokalną rzeczą, ale wyobrażam sobie, że documentmusi mieć coś podobnego) i zastępuje łącze treścią tekstową łącza.

HTH

David
źródło
1

Dziękuję wam wszystkim...

Mój problem rozwiązał poniższy kod:

<a href="javascript:void(0)"> >>> </a>
Wojownik
źródło
2
zanim przejdziesz do produkcji polecam ten link -> stackoverflow.com/questions/3125652/…
Kumar
ten link jest przydatny tylko, jeśli zależy Ci na IE6
Yevgeniy Afanasyev
0

Zainstaluj tę wtyczkę dla jquery i używaj jej

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

Pozwala wyłączyć / włączyć prawie każde pole na stronie.

Jeśli chcesz otworzyć stronę pod jakimś warunkiem, napisz funkcję skryptu java i wywołaj ją z href. Jeśli warunek jest spełniony, otwórz stronę, w przeciwnym razie nic nie rób.

kod wygląda następująco:

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

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

Możesz również umieścić łącze w elemencie div i ustawić właściwość display atrybutu Style na none. to ukryje div. Np.

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

Spowoduje to ukrycie linku. Użyj przycisku lub obrazu, aby ten element div był teraz widoczny, wywołując tę ​​funkcję w onclick jako:

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

and write the js code as:

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

Możesz również umieścić tag id w tagu html, więc tak będzie

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

I uzyskaj ten identyfikator w swoim javascript za pomocą

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

Jeden z nich na pewno musi działać haha

dLobatog
źródło
0

Inna metoda wyłączenia linku

element.removeAttribute('href');

tag anchor bez href zareagowałby jako wyłączony / zwykły tekst

<a> w/o href </a>

zamiast <a href="#"> with href </a>

zobacz jsFiddel

mam nadzieję, że to jest pomocne.

Akshay
źródło
0

Zamiast void możesz również użyć:

<a href="javascript:;">this link is disabled</a> 
Roy Shoa
źródło
-2

0) lepiej pamiętaj, że niektóre przeglądarki „skaczą”, jeśli masz link i „#” href. Najlepszym sposobem byłby niestandardowy JavaScript

1) Jeśli szukasz niestandardowego kodu JavaScript , oto on:

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

„Return false” zapobiega faktycznemu śledzeniu odsyłacza.

2) Możesz rozważyć unikanie używania następujących

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

lub

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

Ponieważ pseudo-protokół javascript może w niektórych przeglądarkach ustawić stronę w stan oczekiwania, co może mieć nieoczekiwane konsekwencje. IE6 jest z tego znana. Ale jeśli nie obchodzi cię IE6, a wszystko testujesz - może to być dobre rozwiązanie.

3) Jeśli już masz jQueryi bootstrapw swoim projekcie, możesz spojrzeć na ich użycie w następujący sposób:

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

gdzie .disabled klasa pochodzi z bootstrapu.

Qupte z witryny bootstrap ( tutaj )

Zastrzeżenie dotyczące funkcjonalności łącza

Klasa .disabled używa pointer-events: nonedo próby wyłączenia funkcji odsyłaczy s, ale ta właściwość CSS nie jest jeszcze ustandaryzowana. Ponadto nawet w przeglądarkach obsługujących zdarzenia wskaźnika: brak, nawigacja za pomocą klawiatury pozostaje niezmieniona, co oznacza, że ​​widzący użytkownicy klawiatury i użytkownicy technologii pomocniczych nadal będą mogli aktywować te łącza. Aby być bezpiecznym, dodaj tabindex="-1"atrybut do tych łączy (aby uniemożliwić im odbieranie fokusu z klawiatury) i użyj, custom JavaScriptaby wyłączyć ich funkcjonalność.

i custom JavaScriptpokazano w sekcji 1

Yevgeniy Afanasyev
źródło
ktoś musiał ująć to jako odpowiedź, ludzie bootstrapu zrobili to z jakiegoś powodu. Nawet jeśli jest to zły pomysł, nadal jest odpowiedzią, a wraz z wyjaśnieniem, dlaczego pomysł jest zły, odpowiedź jest dobra dla ludzi.
Yevgeniy Afanasyev
poprawiono odpowiedź
Yevgeniy Afanasjew
-4

Poniżej kod wyłączonych linków:

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

innym bardzo prostym rozwiązaniem jest:

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

Pierwsze rozwiązanie jest skuteczne.

Rizwan Gill
źródło
9
Przed wysłaniem zapoznaj się z istniejącymi odpowiedziami. Te opcje były już sugerowane ... ponad dwa lata temu. Najlepiej nie wskrzeszać starych wątków, chyba że odpowiedź wniesie coś znaczącego ponad istniejące odpowiedzi.
Leigh