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

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>

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 :)


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

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


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


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ł.


3

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


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.


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>

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



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


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.


0

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

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

-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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.