Czy tag kotwicy bez atrybutu href jest bezpieczny?

232

Czy można używać tagu zakotwiczenia bez dołączania hrefatrybutu i zamiast tego używać procedury obsługi zdarzenia kliknięcia JavaScript? Pominąłbym więc hrefcałkowicie, nawet nie mając go pustym ( href="").

Jan
źródło
1
Jednak zdarzenie onclick nadal się uruchamia? Chcę używać tagów zakotwiczenia zamiast span / div, ponieważ jest to jedyny rozsądny tag obsługujący CSS: hover w IE
Jan
3
@Martin ANCHORS można uzyskać i aktywować za pomocą klawiatury. Zwykłe elementy SPAN nie mogą. Zobacz tutaj: jsfiddle.net/simevidas/4DTxv/2
Šime Vidas
2
W HTML5 kotwice bez atrybutu href są zastępczymi hiperłączami: dev.w3.org/html5/markup/a.html
Ignacio Lago
1
Czy na pewno nie chcesz przycisku? Oznaczałoby to, że klawisze tabulacji itp. Działają, aw razie potrzeby możesz stylizować przyciski tak, aby wyglądały jak linki. Trzeba przyznać, że nie wiem o aktywowaniu w IE.
robbie_c

Odpowiedzi:

217

W HTML5 poprawne jest użycie aelementu bez hrefatrybutu. Jest uważany za „zastępczy hiperłącze”.

Przykład:

<a>previous</a>

Poszukaj „zastępczego hiperłącza” na stronie odniesienia tagu kotwicy w3c: https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element .

I jest również wspomniany na wiki tutaj: https://www.w3.org/wiki/Elements/a

Łącze zastępcze jest przeznaczone dla przypadków, w których chcesz użyć elementu kotwicy, ale nie możesz go nigdzie nawigować. Jest to przydatne do oznaczania bieżącej strony w menu nawigacyjnym lub ścieżce nawigacyjnej. (Stare podejście polegałoby na użyciu tagu rozpiętości lub tagu zakotwiczenia z klasą o nazwie „aktywna” lub „bieżąca”, aby nadać mu styl, oraz JavaScript, aby anulować nawigację).

Łącznik zastępczy jest również przydatny w przypadkach, gdy chcesz dynamicznie ustawić miejsce docelowe łącza za pomocą JavaScript w czasie wykonywania. Po prostu ustawiasz wartość atrybutu href, a tag kotwicy staje się klikalny.

Zobacz też:

dthrasher
źródło
3
Jaka jest definicja „zastępczego linku”?
Gyum Fox
14
Należy wziąć pod uwagę, że bez styl nie zostanie automatycznie dodany do elementu. hrefcursor: pointer
Łukasz
38

Jest OK, ale jednocześnie może powodować spowolnienie niektórych przeglądarek.

http://webdesignfan.com/yslow-tutorial-part-2-of-3-reducing-server-calls/

Moja rada to skorzystanie z <a href="#"> </a>

Jeśli używasz JQuery, pamiętaj, aby również użyć:

.click(function(event){
    event.preventDefault();
    // Click code here...
});
Gunnar Hoffman
źródło
7
Nie mogę użyć href = "#", ponieważ korzystam z zakładek ajax, która wymaga zmiany skrótu, co mogę zrobić?
John
5
Zamiast używać javascript: void (0); wewnątrz href używam javascript :; jest krótszy do napisania.
Ally,
16
Kara za wydajność obowiązuje tylko wtedy, gdy faktycznie podasz pusty atrybut href. Pytanie stwierdza, że ​​w ogóle nie ma atrybutu href.
Pete B,
18
W rzeczywistości, zgodnie z artykułem (i ma to sens), potencjalna kara wydajności dotyczy tylko pustych atrybutów src . Nie mówi nic o wydajności pod względem pustych atrybutów href.
bergie3000
1
Witaj @Gunnar, link chyba już zniknął. Czy masz inne odniesienie do roszczenia?
user31782,
25

Krótka odpowiedź: nie

Długa odpowiedź:

Po pierwsze, bez atrybutu href nie będzie to link. Jeśli nie jest to link, nie będzie on dostępny dla klawiatury (lub przełącznika oddechu lub innego urządzenia wejściowego nie opartego na wskaźnikach) (chyba że użyjesz funkcji HTML 5, tabindexktórych nie są powszechnie obsługiwane). Bardzo rzadko zdarza się, że formant nie ma dostępu do klawiatury.

Druga. Powinieneś mieć alternatywę dla, gdy JavaScript nie działa (ponieważ ładowanie z serwera było wolne, połączenie internetowe zostało przerwane (np. Sygnał mobilny w jadącym pociągu), JS jest wyłączony itp.).

Skorzystaj z progresywnego ulepszania dzięki dyskretnemu JS.

Quentin
źródło
Problem polega na tym, że chcę coś, do czego mogę dołączyć zdarzenie kliknięcia za pomocą metody „kliknięcia” jQuery, która również zostanie podświetlona i podkreślona jak link, gdy najedzie na nią mysz. Co jeszcze, oprócz tagu kotwicy bez ograniczeń, może to osiągnąć bez CSS? (tj. „tak jak jest” bez ręcznego dodawania tej podstawowej interakcji, zachowując jednocześnie prostotę przypisania funkcji bezpośredniego kliknięcia za pomocą jQuery).
Triynko
@Triynko - użyj linku, ale zrób to poprawnie. Zobacz ostatni wiersz odpowiedzi.
Quentin,
5
Tabindex w znacznikach „a” jest ważny od HTML4 (przynajmniej) w3schools.com/tags/att_global_tabindex.asp
technoTarek
@technoTarek - Tak, ale hrefbył obowiązkowy (chyba że był to nazwany kotwica, w którym to przypadku tabindex nie miał sensu). Zastosowanie tabindexdodawania nieusuwalnych elementów do kolejności tabulatorów jest nową innowacją w HTML 5.
Quentin
4
To jest po prostu złe. Niezależnie od tego, czy odwoływałeś się do starszej specyfikacji HTML w tym czasie, nie mogę powiedzieć, ale zgodnie ze specyfikacją HTML5 rzeczywiście jest poprawne mieć atag bez hrefatrybutu.
Michael
23

Jeśli musisz użyć href dla kompatybilności wstecznej, możesz także użyć

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

zamiast #, jeśli nie chcesz używać atrybutu

Rasive
źródło
1
Potrzebowałem tagu <a>, który zachowywał się jak link we wszystkich oprócz funkcji. To załatwiło sprawę.
Jad S
13

Znacznika można używać bez atrybutu href. W przeciwieństwie do wielu odpowiedzi tutaj, istnieją tak naprawdę standardowe powody, dla których należy utworzyć kotwicę, gdy nie ma href. Semantycznie „a” oznacza kotwicę lub link. Jeśli użyjesz go do czegokolwiek zgodnego z tym znaczeniem, nic ci nie będzie.

Jednym standardowym zastosowaniem znacznika bez hrefa jest tworzenie nazwanych łączy. Pozwala to na użycie kotwicy o nazwie name = blah, a później można utworzyć kotwicę za pomocą href = # blah, aby połączyć się z nazwaną sekcją bieżącej strony. Zostało to jednak przestarzałe, ponieważ można również używać identyfikatorów w ten sam sposób. Jako przykład możesz użyć tagu nagłówka o id = nagłówek, a później możesz mieć kotwicę wskazującą na href = # nagłówek.

Nie chcę jednak sugerować używania właściwości name. Podaj tylko jeden przypadek użycia, w którym nie potrzebujesz href, i dlatego uzasadnij, dlaczego nie jest wymagany.

monokrom
źródło
2
Myślę, że to pytanie próbowało zadać pytanie i do czego odnoszą się inne odpowiedzi, czy bezpiecznie jest pominąć hrefatrybut <a>elementu, który jest używany jako element interaktywny (tj. Link). Jak wspomniałeś, bez hrefatrybutu nie jest to po prostu ... nie link, tylko kotwica, co jest zupełnie inną rzeczą.
BoltClock
1
Tak, ale - aby podkreślić - znacznik <a> nadal obowiązuje w tych przypadkach użycia.
monokrom
9

Z punktu widzenia dostępności <a>bez hrefa nie można tabulować, wszystkie linki powinny mieć tabulację, więc dodaj tabindex = „0”, jeśli nie masz href.

użytkownik3862605
źródło
1
Lub użyj przycisku, jeśli zamierza wykonać akcję na stronie zamiast przekierowania.
SimonDever
8

<a>Tag bez „href” może być przydatny podczas korzystania z menu wielopoziomowych i trzeba rozszerzyć na następny poziom, ale nie chce, że etykieta menu, aby być aktywnym ogniwem. Nigdy nie miałem żadnych problemów z używaniem go w ten sposób.

Jon
źródło
1
Czy próbowałeś uzyskać dostęp do tego menu za pomocą klawiatury?
aij
Właśnie dowiedziałem się, że w IE, jeśli umieścisz kursor nad niektórymi linkami, a jeden jest kotwicą bez href, małe okienko z poniższym adresem URL pozostanie tam, pokazując poprzedni adres URL, zamiast znikania. Kotwicy nie można jednak kliknąć, więc nie jest to duży problem, ale wystarczy, żebym zamiast tego wybrał div.
Andrew
1

W niektórych przeglądarkach napotkasz problemy, jeśli nie podasz atrybutu href. Sugeruję napisanie kodu w taki sposób:

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

możesz zastąpić swój kod () własną funkcją lub logiką, ale pamiętaj, aby dodać return false; oświadczenie na końcu.

shashwat13
źródło
Używam Backbone.js z Backbone.Router i mam #na stronie indeksu. W przypadku niektórych linków na pasku nawigacyjnym nie chcę uruchamiać trasy, do #której tak się dzieje, jeśli korzystasz a href="#"z niej samodzielnie. Użycie <a href="#" onclick="return false;"powoduje zatrzymanie wyzwalanej trasy, ale zdarzenie click nadal przenika do mojego modułu obsługi (który korzysta ze zdarzeń DOM przechwyconych przez jQuery i Backbone.Radio). Dzięki @ shashwat13 :)
David Williamson