Ist ein Ankertag ohne das href-Attribut sicher?


232

Ist es in Ordnung, ein Ankertag ohne das hrefAttribut zu verwenden und stattdessen einen JavaScript-Klickereignishandler zu verwenden? Also würde ich das hrefkomplett weglassen , es nicht einmal leer haben ( href="").


1
Das Onclick-Ereignis wird trotzdem ausgelöst? Ich möchte Ankertags anstelle von span / div verwenden, da dies das einzige vernünftige Tag ist, das CSS unterstützt: Hover in IE
John

3
@Martin ANCHORS kann über die Tastatur aufgerufen und aktiviert werden. Normale SPAN-Elemente können nicht. Siehe hier: jsfiddle.net/simevidas/4DTxv/2
Šime Vidas


2
In HTML5 sind Anker ohne href-Attribut Platzhalter-Hyperlinks: dev.w3.org/html5/markup/a.html
Ignacio Lago

1
Sind Sie sicher, dass Sie stattdessen keinen Knopf möchten? Dies würde bedeuten, dass Tabs usw. funktionieren und Sie Ihre Schaltflächen so gestalten können, dass sie bei Bedarf wie Links aussehen. Zugegeben, ich weiß nichts über Hover im IE.
Robbie_c

Antworten:


217

In HTML5 ist die Verwendung eines aElements ohne hrefAttribut gültig. Es wird als "Platzhalter-Hyperlink" betrachtet.

Beispiel:

<a>previous</a>

Suchen Sie auf der Referenzseite des w3c-Ankertags nach "Platzhalter-Hyperlink": https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element .

Und es wird auch im Wiki hier erwähnt: https://www.w3.org/wiki/Elements/a

Ein Platzhalter-Link ist für Fälle vorgesehen, in denen Sie ein Ankerelement verwenden möchten, es jedoch nirgendwo navigieren lassen möchten. Dies ist praktisch, um die aktuelle Seite in einem Navigationsmenü oder einem Breadcrumb-Trail zu markieren. (Der alte Ansatz wäre gewesen, entweder ein span-Tag oder ein Ankertag mit einer Klasse namens "active" oder "current" zu verwenden, um es zu formatieren, und JavaScript, um die Navigation abzubrechen.)

Ein Platzhalter-Link ist auch nützlich, wenn Sie das Ziel des Links zur Laufzeit dynamisch über JavaScript festlegen möchten. Sie legen einfach den Wert des href-Attributs fest und das Ankertag kann angeklickt werden.

Siehe auch:


3
Was ist die Definition eines "Platzhalter-Links"?
Gyum Fox

14
Beachten Sie, dass ohne ein hrefder cursor: pointerStil nicht automatisch zum Element hinzugefügt wird.
Luke

38

Es ist in Ordnung, kann aber gleichzeitig dazu führen, dass einige Browser langsam werden.

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

Mein Rat ist die Verwendung von <a href="#"> </a>

Wenn Sie JQuery verwenden, denken Sie daran, auch Folgendes zu verwenden:

.click(function(event){
    event.preventDefault();
    // Click code here...
});

7
Ich kann href = "#" nicht verwenden, da ich Ajax-Lesezeichen verwende, bei denen der Hash geändert wird. Was kann ich tun?
John

5
Anstatt Javascript zu verwenden: void (0); innerhalb der href verwende ich javascript:; es ist kürzer zu schreiben.
Verbündeter

16
Die Leistungsbeeinträchtigung gilt nur, wenn Sie tatsächlich ein leeres href-Attribut angeben. Die Frage besagt, dass es überhaupt kein href-Attribut gibt.
Pete B

18
Tatsächlich gilt laut Artikel (und es ist sinnvoll) der potenzielle Leistungsverlust nur für leere src- Attribute. Es sagt nichts über die Leistung von leeren href-Attributen aus.
bergie3000

1
Hallo @Gunnar, der Link scheint jetzt weg zu sein. Haben Sie eine andere Referenz für den Anspruch?
user31782

25

Kurze Antwort: Nein.

Lange Antwort:

Erstens ist es ohne ein href-Attribut kein Link. Wenn es sich nicht um einen Link handelt, kann nicht auf die Tastatur (oder den Atemschalter oder ein anderes nicht auf Zeigern basierendes Eingabegerät) zugegriffen werden (es sei denn, Sie verwenden HTML 5-Funktionen vontabindex die nicht allgemein unterstützt werden). Es ist sehr selten, dass ein Steuerelement keinen Tastaturzugriff hat.

Zweite. Sie sollten eine Alternative haben, wenn das JavaScript nicht ausgeführt wird (da es nur langsam vom Server geladen wurde, eine Internetverbindung unterbrochen wurde (z. B. mobiles Signal in einem fahrenden Zug), JS ausgeschaltet ist usw. usw.).

Nutzen Sie die progressive Verbesserung durch unauffälliges JS.


Das Problem ist, ich möchte etwas, an das ich mit der "Klick" -Methode von jQuery ein Klickereignis anhängen kann, das auch wie ein Link hervorgehoben und unterstrichen wird, wenn die Maus darüber fährt. Was außer einem href-freien Ankertag kann dies ohne CSS noch erreichen? (dh wie sie sind, ohne diese grundlegende Interaktion manuell hinzuzufügen, während die Einfachheit einer direkten Klickfunktionszuweisung über jQuery beibehalten wird).
Triynko

@Triynko - Verwenden Sie einen Link, aber machen Sie es richtig. Siehe die letzte Zeile der Antwort.
Quentin

5
Tabindex auf 'a' Tags ist gültig seit HTML4 (mindestens) w3schools.com/tags/att_global_tabindex.asp
technoTarek

@technoTarek - Ja, war aber hrefobligatorisch (es sei denn, es war ein benannter Anker. In diesem Fall ergab Tabindex keinen Sinn). Die Verwendung von tabindex, um der Tab-Reihenfolge nicht fokussierbare Elemente hinzuzufügen, ist eine neue Innovation in HTML 5.
Quentin

4
Das ist einfach falsch. Ob Sie zu dieser Zeit auf eine ältere Spezifikation für HTML verwiesen haben, kann ich nicht sagen, aber gemäß der HTML5-Spezifikation ist es in der Tat vollkommen gültig, ein aTag ohne hrefAttribut zu haben.
Michael

23

Wenn Sie href für die Abwärtskompatibilität verwenden müssen, können Sie auch verwenden

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

anstelle von #, wenn Sie das Attribut nicht verwenden möchten


1
Ich brauchte ein <a> -Tag, das sich in allen außer der Funktion wie ein Link verhält. Das hat den Trick für mich getan.
Jad S

13

Das Tag kann ohne href-Attribut verwendet werden. Im Gegensatz zu vielen Antworten hier gibt es tatsächlich Standardgründe für das Erstellen eines Ankers, wenn kein href vorhanden ist. Semantisch bedeutet "a" einen Anker oder eine Verbindung. Wenn Sie es für etwas verwenden, das dieser Bedeutung folgt, ist alles in Ordnung.

Eine Standardverwendung des a-Tags ohne href besteht darin, benannte Links zu erstellen. Auf diese Weise können Sie einen Anker mit name = blah verwenden und später einen Anker mit href = # blah erstellen, um auf den benannten Abschnitt der aktuellen Seite zu verlinken. Dies ist jedoch veraltet, da Sie auf die gleiche Weise auch IDs verwenden können. Als Beispiel könnten Sie ein Header-Tag mit id = header verwenden und später einen Anker haben, der auf href = # header zeigt.

Mein Punkt ist jedoch nicht, die Verwendung der Eigenschaft name vorzuschlagen. Nur um einen Anwendungsfall bereitzustellen, in dem Sie keine href benötigen, und daher zu begründen, warum dies nicht erforderlich ist.


2
Ich denke, die Frage, die gestellt werden sollte und die anderen Antworten betreffen, ist, ob es sicher ist, das hrefAttribut für ein <a>Element wegzulassen , das als interaktives Element verwendet wird (dh als Link). Wie Sie bereits erwähnt haben, ist es ohne hrefAttribut ganz einfach ... kein Link, nur ein Anker, was eine ganz andere Sache ist.
BoltClock

1
Ja, aber - nur um es zu betonen - das <a> -Tag ist in diesen Anwendungsfällen immer noch gültig.
Monokrom

9

Aus Sicht der Barrierefreiheit <a>ohne href ist nicht tabulatorfähig. Alle Links sollten tabulatorfähig sein. Fügen Sie daher einen tabindex = '0 "hinzu, wenn Sie keine href haben.


1
Oder verwenden Sie eine Schaltfläche, wenn anstelle einer Umleitung eine In-Page-Aktion ausgeführt werden soll.
SimonDever

8

Das <a>Tag ohne "href" kann nützlich sein, wenn Sie mehrstufige Menüs verwenden. Sie müssen die nächste Ebene erweitern, möchten jedoch nicht, dass diese Menübezeichnung ein aktiver Link ist. Ich hatte noch nie Probleme damit.


1
Haben Sie versucht, mit der Tastatur auf dieses Menü zuzugreifen?
aij

Ich habe gerade herausgefunden, dass im IE, wenn Sie mit der Maus über einige Links fahren und einer ein Anker ohne href ist, das kleine Popup mit der folgenden URL dort bleibt und die vorherige URL anzeigt, anstatt zu verschwinden. Der Anker ist zwar nicht anklickbar, es ist also kein großes Problem, aber genug für mich, stattdessen mit einem Div zu arbeiten.
Andrew

1

In einigen Browsern treten Probleme auf, wenn Sie kein href-Attribut angeben. Ich schlage vor, dass Sie Ihren Code so schreiben:

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

Sie können Ihren Code () durch Ihre eigene Funktion oder Logik ersetzen, aber denken Sie daran, return false hinzuzufügen. Aussage am Ende.


Ich verwende Backbone.js mit Backbone.Router und habe #für die Indexseite. Für einige meiner Navigationsleisten-Links möchte ich keine Route auslösen, zu #der dies geschieht, wenn Sie sie a href="#"selbst verwenden. Wenn Sie verwenden, wird <a href="#" onclick="return false;"die Route nicht ausgelöst, aber das Klickereignis sprudelt immer noch zu meinem Handler (der DOM-Ereignisse verwendet, die über jQuery und Backbone.Radio verknüpft sind). Danke @ shashwat13 :)
David Williamson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.