Jak sprawić, by kotwica nic nie odnosiła się?


159

Używam jQuery, muszę sprawić, aby niektóre znaczniki kotwicy nie wykonywały żadnej akcji.

Zwykle piszę to tak:

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

Jednak odnosi się to do góry strony!


ponieważ jquery obsłuży zdarzenie kliknięcia, więc chcę, aby link był jak link achor, ale zachowywał się jak funkcja JavaScript
ahmed


1
Jak wspomniano w jednej z poniższych odpowiedzi: jeśli nie chcesz, aby odsyłacz wskazywał na zasób, nie używaj elementu A.
Mathias Bynens

Nie używaj w nim hrefatrybutu at.
vsync

Odpowiedzi:


103

Jeśli nie chcesz, aby cokolwiek wskazywało, prawdopodobnie nie powinieneś używać <a>tagu (kotwica).

Jeśli chcesz, aby coś wyglądało jak link, ale nie zachowywało się jak łącze, najlepiej użyć odpowiedniego elementu (takiego jak <span>), a następnie nadać mu styl za pomocą CSS:

<span class="fake-link" id="fake-link-1">Am I a link?</span>

.fake-link {
    color: blue;
    text-decoration: underline;
    cursor: pointer;
}

Ponadto, biorąc pod uwagę, że oznaczyłeś to pytanie jako „jQuery”, zakładam, że chcesz dołączyć moduł obsługi zdarzenia kliknięcia. Jeśli tak, po prostu zrób to samo, co powyżej, a następnie użyj czegoś takiego jak następujący JavaScript:

$('#fake-link-1').click(function() {
    /* put your code here */
});

37
Występuje problem: nie pozwala na nawigację po kartach.

6
Zauważ, że (jak wskazuje Iraimbilanja) podejście span wyłącza możliwość wywołania funkcji za pomocą klawiatury, co uważam za problem z użytecznością.
Fredrik Mörk

3
Również problem z dostępnością. Możesz to rozwiązać za pomocą elementu przycisku (wygenerowanego z JavaScript, aby użytkownicy nie-JS nie otrzymali uszkodzonej kontroli).
Quentin

4
Oto szybkie rozwiązanie tego problemu: tabindex = "0" w elemencie niebędącym łączem umożliwi nawigację za pomocą klawiatury w większości nowoczesnych przeglądarek.
Mathias Bynens

1
Innym „problemem” jest to, że pseudoklasa CSS: hover nie będzie działać na elementach, które nie są linkami w IE6. Ale ponieważ i tak dodajesz te elementy za pomocą JavaScript (a przynajmniej powinieneś), równie dobrze możesz napisać skrypt, który dodaje klasę .hover do elementu po najechaniu kursorem.
Mathias Bynens

268

Istnieje kilka mniej niż doskonałych rozwiązań:

1. Link do fałszywej kotwicy

<a href="#">

Problem: kliknięcie linku powoduje przejście z powrotem na górę strony

2. Używanie tagu innego niż „a”

Użyj tagu span i jQuery, aby obsłużyć kliknięcie

Problem: przerywa nawigację po klawiaturze, trzeba ręcznie zmienić kursor

3. Link do funkcji void javascript

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

Problem: przerwy podczas łączenia obrazów w IE

Rozwiązanie

Ponieważ wszystkie one mają swoje problemy, rozwiązaniem, na które się zdecydowałem, jest połączenie z fałszywą kotwicą, a następnie zwrócenie wartości false z metody onClick:

<a href="#" onClick="return false;">

Nie jest to najbardziej zwięzłe rozwiązanie, ale rozwiązuje wszystkie problemy z powyższymi metodami.


2
Zwykle używam javascript: void (0); podejście, ponieważ użycie znaku # wyświetla aktualny adres URL na pasku przeglądarki Firefox po najechaniu kursorem myszy, co może wprowadzać użytkownika w błąd.
lucaferrario

8
breaks when linking images in IECo to znaczy?
Eugene

14
@eugene to pytanie ma już 3 lata, ale IE powodowało, że obrazy znikały, gdy były otoczone linkiem do funkcji void. Nie jestem pewien, kiedy został naprawiony, ale działa w IE10, czyli wszystko, co zainstalowałem. Osobiście teraz używam<a href="javascript:;">
zaius

1
Tam też użyłem komentarzy: <a href="javascript:void(0); // Pokaż paletę właściwości">. W ten sposób, gdy użytkownik najedzie kursorem, zobaczy komentarz, który może dać mu wskazówkę, czego się spodziewać po kliknięciu. (Chociaż możesz też użyć podpowiedzi.)
Robin Zimmermann

5
Wygląda na href="javascript:"to, że to też wystarczy i działa w najnowszych głównych przeglądarkach. Nie ma potrzeby używania średnika, w rzeczywistości PhpStorm sugeruje nawet jego usunięcie.
jlh

40

Aby w ogóle nic nie robił, użyj tego:

<a href="javascript:void(0)"> ... </a>

1
lub po prostu <a href="javascript:;">. PS nie działa target=_blankjednak
Alex

36

Prawidłowym sposobem rozwiązania tego problemu jest „zerwanie” łącza za pomocą jQuery podczas obsługi łącza

HTML

<a href="#" id="theLink">My Link</a>

JS

$('#theLink').click(function(ev){
    // do whatever you want here

    ev.preventDefault();
    ev.stopPropagation();
});

Te dwa ostatnie wywołania uniemożliwiają przeglądarce interpretację kliknięcia.


5
Chociaż brzmi to tak, jakby było „właściwe”, ponieważ zatrzymuje bulgotanie zdarzeń, „return false” jest dużo mniej szczegółowe i robi to samo. Jedyny przypadek, w którym chciałbyś to zrobić, to jeśli masz już programy obsługi zdarzeń zarejestrowane do klikania linków za pośrednictwem jQuery.
aleemb

25

Jest na to wiele sposobów

Nie dodawaj i nie hrefprzypisuj

<a name="here"> Test <a>

Możesz dodać zdarzenie onclick zamiast href jak

<a name="here" onclick="YourFunction()"> Test <a>

Lub możesz dodać funkcję void, która byłaby najlepszym sposobem

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

Czy atrybut nazwy jest wymagany?
Petrus Theron

@PetrusTheron Nie jest konieczne. .
Punit Gajjar

Jest to zdzierstwo wcześniejszych odpowiedzi
1919

1
Nie zapomnij ustawić stylu swojego znacznika kotwicy, jeśli usuniesz hrefatrybut, ponieważ nie będzie on już zachowywał się jak hiperłącze (nawet jeśli onclick nadal działa), będziesz musiał zresetować rzeczy takie jak cursor: pointer;i :hoverselektor.
Partack

@Partack Poprawnie .. Dzięki za zauważenie
Punit Gajjar

24

Co masz na myśli przez nic?

<a href='about:blank'>blank page</a>

lub

<a href='whatever' onclick='return false;'>won't navigate</a>

1
Zgoda - po prostu zwróć false ze swojej metody jQuery i voila, to nigdzie nie pójdzie
joshcomley

14

Myślę, że możesz spróbować

<a href="JavaScript:void(0)">link</a>

Jedyny haczyk, jaki tutaj widzę, to wysoki poziom zabezpieczeń przeglądarki, który może monitować o wykonanie javascript.

Chociaż jest to jeden z łatwiejszych sposobów niż

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

powinno to być używane oszczędnie

Przeczytaj ten artykuł, aby uzyskać wskazówki https://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void


Prawidłowa odpowiedź, umożliwia nawigację po zakładkach.
K - Toksyczność SO rośnie.

14

Ta odpowiedź powinna zostać zaktualizowana, aby odzwierciedlić nowe standardy sieciowe (HTML5).

To:

<a tabindex="0">This represents a placeholder hyperlink</a>

... jest prawidłowym HTML5. Atrybut tabindex sprawia, że ​​można go ustawić za pomocą klawiatury, tak jak zwykłe hiperłącza. Równie dobrze możesz użyć spando tego elementu, jak wspomniano wcześniej, ale uważam, że użycie aelementu jest bardziej eleganckie.

Zobacz: https://w3c.github.io/html-reference/a.html
i: https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-href


1
Jest to również poprawny HTML4, ale nie nadaje stylu kotwicy jako linku.
interjay

1
Nie wiedziałem, że to poprawny HTML4, ale specyfikacja HTML5 wyraźnie wspomina o przypadku użycia. Style, które nie są ukierunkowane na atrybut href, będą działać dobrze, problemem mogą być tylko domyślne style przeglądarki.
aross

1
Nie wywołuje to również clickzdarzenia, gdy użytkownik skupi się na elemencie i naciśnie klawisz Enter (testowane w przeglądarce Firefox 51).
torvin

@torvin, to proste. Skorzystaj z keydownwydarzenia.
aross

snazzy dziwactwo, ale w oknie 10 dodaje obramowane pudełko wokół elementu
1-14x0r

12

Oto trzy sposoby, <a>w jakie hrefwłaściwość tagu nie odwołuje się do niczego:

<a href="JavaScript:void(0)"> link </a>

<a href="javascript:;">link</a >

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

1
To jest tylko duplikat odpowiedzi , która została obecnie najwyżej
oceniona

5

Wiem, że to stare pytanie, ale pomyślałem, że i tak dodam moje dwa centy:

Zależy to od tego, co zrobi link, ale zazwyczaj wskazywałbym link na adres URL, który może wyświetlać / robić to samo, na przykład, jeśli robisz trochę o wyskakującym okienku:

<a id="about" href="/about">About</a>

Następnie z jQuery

$('#about').click(function(e) {
    $('#aboutbox').show();
    e.preventDefault();
});

W ten sposób bardzo stare przeglądarki (lub przeglądarki z wyłączoną obsługą JavaScript) mogą nadal przechodzić do oddzielnej strony about, ale co ważniejsze, Google również ją pobierze i zaindeksuje zawartość strony about.


5

Upewnij się, że wszystkie linki, które chcesz przestać, mają href="#!"(lub cokolwiek chcesz, naprawdę), a następnie użyj tego:

jq('body').on('click.stop_link', 'a[href="#!"]',
function(event) {
     event.preventDefault();
});

4

Możesz mieć kotwicę HTML ( atag) bez hrefatrybutu. Pozostaw hrefatrybut, a nie będzie on do niczego prowadzić:

<a>link</a>

Dziękuję Ci! To doskonale zadziałało w moim przypadku. Gdzie chciałem, aby tag kotwicy otwierał się w nowej karcie, gdy jest adres URL, ale nic, jeśli nie ma adresu URL. W przypadku # było to zaakceptowanie KLIKNIĘCIA i przeniesienie go na górę strony. Nie mając części href, jak sugerowałeś. To rozwiązało problem! Formatowanie wygląda świetnie ze względu na tag, problem z kliknięciami zniknął bez atrybutu href. Dziękuję Ci!!!
Mohsin

1
Jeśli ktoś zastanawia się, czy jest poprawny w HTML5, odpowiedź brzmi TAK :) stackoverflow.com/a/33046203/5323892 . Oto przykład ze strony standardów (patrz trzecia pozycja li): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Strona główna </a> </li> <li> <a href = "/ news "> Aktualności </a> </li> <li> <a> Przykłady </a> </li> <li> <a href="https://stackoverflow.com/legal"> Informacje prawne </a> </li> </ ul> </nav>
Mohsin

Działa, ale jeśli chcesz, aby wskaźnik myszy zmienił się w palec, po prostu dodaj href = "JavaScript: void (0)" zgodnie z sugestią zawartą w odpowiedzi @Rutesh Makhijani.
Tarik

3

Jedyną rzeczą, która zadziałała dla mnie, była kombinacja powyższych:

Najpierw li przy ul

<li><a onclick="LoadTab2_1()" href="JavaScript:void(0)">All Assigned</a></li>

Następnie w LoadTab2_1 ręcznie przełączyłem karty div

$("#tabs-2-1").hide();
    $("#tabs-2-2").show();

Dzieje się tak dlatego, że odłączenie się odłącza również akcję w zakładkach

Musisz także ręcznie zmienić styl karty, gdy główna karta zmieni rzeczy

$("#secTab1").addClass("ui-tabs-active").addClass("ui-state-active").addClass("ui-state-hover").addClass("ui-state-focus");
    $("#secTab1 a").css("color", "#ffffff");


1
<a href="#" onclick="SomeFunction()"  class="SomeClass">sth.</a>

to był mój tag kotwicy. więc zwracanie false na zdarzenie onClick = "" nie jest tutaj przydatne. Właśnie usunąłem właściwość href = "#" i działała ona tak jak poniżej

<a onclick="SomeFunction()"  class="SomeClass">sth.</a>

i musiałem dodać ten CSS.

.SomeClass
{
    cursor: pointer;
}

Co przez to rozumiesz. Co jest zalecane i dlaczego?
Burk

Dobrą praktyką jest przechowywanie javascript i html w osobnych plikach. Oto szczegółowa odpowiedź: stackoverflow.com/questions/5871640/ ...
Alexandru Severin

1

Napotkałem ten problem w witrynie WordPress. Nagłówki w menu rozwijanych zawsze miały atrybut, href=""a używana wtyczka nagłówka dopuszczała tylko standardowe adresy URL. Najłatwiejszym rozwiązaniem było po prostu uruchomienie tego kodu w stopce:

jQuery('[href=""]').click(function(e){
    e.preventDefault();
});

Dzięki temu puste kotwice nie będą cokolwiek robić.


0

React nie obsługuje już używania takiej funkcji href="javascript:void(0)"w tagu kotwicy, ale tutaj jest coś, co działa całkiem nieźle.

<a href="#" onClick={() => null} >link</a>

-1

Wiem, że to jest oznaczone jako pytanie jQuery, ale możesz odpowiedzieć na to również za pomocą AngularJS.

w swoim elemencie dodaj dyrektywę ng-click i użyj zmiennej $ event, która jest zdarzeniem kliknięcia ... zapobiegaj jej domyślnemu zachowaniu:

<a href="#" ng-click="$event.preventDefault()">

Możesz nawet przekazać zmienną $ event do funkcji:

<a href="#" ng-click="doSomething($event)">

w tej funkcji robisz, co chcesz ze zdarzeniem kliknięcia.

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.