Wie kann ein Ankertag auf nichts verweisen?


159

Ich benutze jQuery, ich muss dafür sorgen, dass einige Ankertags keine Aktion ausführen.

Normalerweise schreibe ich es so:

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

Dies bezieht sich jedoch auf den oberen Rand der Seite!


Da jquery das Klickereignis behandelt, möchte ich, dass der Link wie ein Achor-Link ist, sich aber wie eine JavaScript-Funktion verhält
ahmed


1
Wie in einer der folgenden Antworten erwähnt: Wenn Sie nicht möchten, dass ein Link auf eine Ressource verweist, verwenden Sie nicht das A-Element.
Mathias Bynens

Verwenden Sie das hrefAttribut nicht darin.
vsync

Antworten:


103

Wenn Sie nicht möchten, dass es auf irgendetwas verweist, sollten Sie wahrscheinlich nicht das <a>(Anker-) Tag verwenden.

Wenn Sie möchten, dass etwas wie ein Link aussieht, sich aber nicht wie ein Link verhält, verwenden Sie am besten das entsprechende Element (z. B. <span>) und formatieren Sie es dann mit CSS:

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

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

Da Sie diese Frage mit "jQuery" markiert haben, gehe ich davon aus, dass Sie einen Klickereignishander anhängen möchten. Wenn ja, machen Sie einfach dasselbe wie oben und verwenden Sie dann etwas wie das folgende JavaScript:

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

37
Dies hat ein Problem: Es erlaubt keine Tab-Navigation.

6
Beachten Sie, dass (wie Iraimbilanja betont) der Span-Ansatz hier die Möglichkeit deaktiviert, die Funktion über die Tastatur aufzurufen, was ich als Usability-Problem betrachten würde.
Fredrik Mörk

3
Auch ein Zugänglichkeitsproblem. Sie können das Problem mithilfe eines Schaltflächenelements beheben (das aus JavaScript generiert wurde, damit Nicht-JS-Benutzer kein fehlerhaftes Steuerelement erhalten).
Quentin

4
Hier ist eine schnelle Lösung dafür: tabindex = "0" für ein Nicht-Link-Element ermöglicht die Tastaturnavigation in den meisten modernen Browsern.
Mathias Bynens

1
Ein weiteres Problem ist, dass Sie das CSS nicht verwenden: Die Hover-Pseudoklasse funktioniert nicht mit Elementen, die keine Links in IE6 sind. Da Sie diese Elemente jedoch ohnehin über JavaScript hinzufügen (zumindest sollten Sie dies tun), können Sie auch ein Skript schreiben, das dem Element beim Bewegen des Mauszeigers eine .hover-Klasse hinzufügt.
Mathias Bynens

268

Es gibt einige weniger als perfekte Lösungen:

1. Link zu einem falschen Anker

<a href="#">

Problem: Durch Klicken auf den Link wird wieder an den Anfang der Seite gesprungen

2. Verwenden eines anderen Tags als 'a'

Verwenden Sie ein span-Tag und die jquery, um den Klick zu verarbeiten

Problem: Bricht die Tastaturnavigation ab, muss den Hover-Cursor manuell ändern

3. Link zu einer Javascript-Void-Funktion

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

Problem: Unterbrechungen beim Verknüpfen von Bildern im IE

Lösung

Da diese alle ihre Probleme haben, besteht die Lösung, die ich beschlossen habe, darin, eine Verknüpfung zu einem gefälschten Anker herzustellen und dann von der onClick-Methode false zurückzugeben:

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

Nicht die prägnanteste Lösung, aber sie löst alle Probleme mit den oben genannten Methoden.


2
Normalerweise benutze ich das Javascript: void (0); Ansatz, da bei Verwendung von # die aktuelle URL in der Firefox-Leiste mit der Maus angezeigt wird, was für den Benutzer irreführend sein kann.
Lucaferrario

8
breaks when linking images in IEWas bedeutet das?
Eugene

14
@eugene Diese Frage ist jetzt 3 Jahre alt, aber IE hat verwendet, um Bilder verschwinden zu lassen, wenn sie von einem Link zu einer Leerenfunktion umgeben sind. Ich bin mir nicht sicher, wann es behoben wurde, aber es funktioniert in IE10, was alles ist, was ich installiert habe. Ich persönlich benutze jetzt<a href="javascript:;">
zaius

1
Ich habe dort auch Kommentare verwendet: <a href="javascript:void(0); // Eigenschaftenpalette anzeigen">. Auf diese Weise sehen Benutzer beim Bewegen des Mauszeigers den Kommentar, der ihnen einen Hinweis geben kann, was sie beim Klicken erwarten können. (Obwohl Sie auch einen Tooltip verwenden könnten.)
Robin Zimmermann

5
Es scheint, dass dies href="javascript:"auch ausreicht und in den neuesten gängigen Browsern funktioniert. Das Semikolon ist nicht erforderlich, PhpStorm schlägt sogar vor, es zu entfernen.
Uhr

40

Verwenden Sie Folgendes, damit es überhaupt nichts tut:

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

1
oder einfach <a href="javascript:;">. PS funktioniert nicht mit , target=_blankobwohl
Alex

36

Der richtige Weg, dies zu handhaben, besteht darin, den Link mit jQuery zu "unterbrechen", wenn Sie den Link behandeln

HTML

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

JS

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

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

Diese letzten beiden Aufrufe stoppen den Browser, der den Klick interpretiert.


5
Während das so klingt, als wäre es "richtig", weil es das Sprudeln von Ereignissen stoppt, ist "return false" viel weniger ausführlich und macht dasselbe. Sie möchten dies nur tun, wenn Sie bereits Ereignishandler registriert haben, die über jQuery auf Links klicken.
Aleemb

25

Es gibt so viele Möglichkeiten, es so zu machen

Nicht hinzufügen und hrefzuordnen

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

Sie können onclick event anstelle von href like hinzufügen

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

Oder Sie können eine leere Funktion wie diese hinzufügen, was der beste Weg wäre

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

Ist das Namensattribut erforderlich?
Petrus Theron

@PetrusTheron Nicht erforderlich. .
Punit Gajjar

Dies ist eine Abzocke bereits vorhandener Antworten
über den

1
Vergessen Sie nicht, den Stil Ihres hrefAnkertags festzulegen, wenn Sie das Attribut entfernen , da es sich nicht mehr wie ein Hyperlink verhält (obwohl der Onclick immer noch funktioniert). Sie müssen Dinge wie cursor: pointer;und den :hoverSelektor zurücksetzen .
Partack

@Partack Richtig .. Danke, dass
du es

24

Was meinst du mit nichts?

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

oder

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

1
Einverstanden - geben Sie einfach false von Ihrer jQuery-Methode zurück und voila, es wird nirgendwo hingehen
Joshcomley

14

Ich denke du kannst es versuchen

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

Der einzige Haken, den ich hier sehe, ist die hohe Browsersicherheit, die möglicherweise zur Ausführung von Javascript führt.

Dies ist jedoch einer der einfacheren Wege als

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

Dies sollte sparsam verwendet werden

Lesen Sie diesen Artikel für einige Hinweise https://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void


Richtige Antwort, ermöglicht die Tab-Navigation.
K - Die Toxizität in SO nimmt zu.

14

Diese Antwort sollte aktualisiert werden, um neuen Webstandards (HTML5) Rechnung zu tragen.

Dies:

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

... ist gültiges HTML5. Das tabindex-Attribut macht die Tastatur wie normale Hyperlinks fokussierbar. Sie können das spanElement auch wie oben erwähnt verwenden, aber ich finde die Verwendung des aElements eleganter.

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


1
Dies ist auch gültiges HTML4, aber der Anker wird nicht als Link formatiert.
Interjay

1
Ich wusste nicht, dass es sich um gültiges HTML4 handelt, aber in der HTML5-Spezifikation wird der Anwendungsfall ausdrücklich erwähnt. Und Stile, die nicht auf das href-Attribut abzielen, funktionieren einwandfrei. Möglicherweise sind nur die Standard-Browser-Stile ein Problem.
Aross

1
Dies löst auch kein clickEreignis aus, wenn der Benutzer das Element fokussiert und die Eingabetaste drückt (getestet in Firefox 51).
Torvin

@ Torvin, das ist einfach. Verwenden Sie das keydownEreignis.
Über

pfiffige Eigenart, aber in Fenster 10 fügt es einen Rahmen um das Element
1-14x0r

12

Hier sind die drei Möglichkeiten, wie sich <a>die hrefTag-Eigenschaft des Tags auf nichts bezieht:

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

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

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

1
Dies ist nur ein Duplikat der derzeit am höchsten
bewerteten

5

Ich weiß, dass dies eine alte Frage ist, aber ich dachte, ich würde trotzdem meine zwei Cent hinzufügen:

Es hängt davon ab, was der Link tun wird, aber normalerweise würde ich den Link auf eine URL verweisen, die möglicherweise dasselbe anzeigt / tut, zum Beispiel, wenn Sie ein wenig über Box-Popup machen:

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

Dann mit jQuery

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

Auf diese Weise können sehr alte Browser (oder Browser mit deaktiviertem JavaScript) weiterhin zu einer separaten Info-Seite navigieren. Noch wichtiger ist jedoch, dass Google diese aufnimmt und den Inhalt der Info-Seite crawlt.


5

Stellen Sie sicher, dass alle Ihre Links, die Sie beenden möchten, vorhanden sind href="#!"(oder wirklich alles, was Sie möchten), und verwenden Sie dann Folgendes:

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

4

Sie können einen HTML-Anker ( aTag) ohne hrefAttribut haben. Lassen Sie das hrefAttribut weg und es wird nichts verknüpft:

<a>link</a>

Danke dir! Es hat perfekt für meinen Fall funktioniert. Wo ich wollte, dass das Anchor-Tag in einem neuen Tab geöffnet wird, wenn eine URL vorhanden ist, aber nichts, wenn keine URL vorhanden ist. Im Fall von # wurde ein KLICK akzeptiert und an den Anfang der Seite verschoben. Ich habe kein href-Teil, wie Sie vorgeschlagen haben. Es hat das Problem gelöst! Die Formatierung sieht aufgrund eines Tags großartig aus. Klicken Sie auf ein Problem ohne href. Danke dir!!!
Mohsin

1
Wenn jemand anderes denkt, ob HTML5 gültig ist, lautet die Antwort JA :) stackoverflow.com/a/33046203/5323892 . Hier ein Beispiel aus der Standardseite (siehe 3. Punkt): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Startseite </a> </ li> <li> <a href = "/ Nachrichten "> Nachrichten </a> </ li> <li> <a> Beispiele </a> </ li> <li> <a href="https://stackoverflow.com/legal"> Legal </a> </ li> </ ul> </ nav>
Mohsin

Es funktioniert, aber wenn Sie möchten, dass sich der Mauszeiger in Finger ändert, fügen Sie einfach href = "JavaScript: void (0)" hinzu, wie in der Antwort von @Rutesh Makhijani vorgeschlagen.
Tarik

3

Das einzige, was für mich funktioniert hat, war eine Kombination der oben genannten:

Zuerst das li in der ul

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

Dann habe ich im LoadTab2_1 die Tab-Divs manuell gewechselt

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

Dies liegt daran, dass durch das Trennen der auch die Aktion in den Registerkarten getrennt wird

Sie müssen das Tab-Styling auch manuell durchführen, wenn die primäre Registerkarte Änderungen vornimmt

$("#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>

Das war mein Ankertag. Geben Sie also false zurück, wenn das Ereignis onClick = "" hier nicht hilfreich ist. Ich habe gerade die Eigenschaft href = "#" entfernt und es hat bei mir genauso funktioniert wie unten

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

und ich musste dieses CSS hinzufügen.

.SomeClass
{
    cursor: pointer;
}

Was meinst du damit? Was wird empfohlen und warum?
Burk

Es ist eine gute Praxis, Javascript und HTML in separaten Dateien zu speichern. Hier ist eine detaillierte Antwort: stackoverflow.com/questions/5871640/…
Alexandru Severin

1

Ich bin auf einer WordPress-Site auf dieses Problem gestoßen. Die Header in Dropdown-Menüs hatten immer das Attribut href=""und das verwendete Header-Plugin erlaubte nur Standard-URLs. Die einfachste Lösung bestand darin, diesen Code in der Fußzeile auszuführen:

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

Dies verhindert, dass leere Anker etwas tun.


0

Reagieren Sie nicht mehr mit einer Funktion wie dieser href="javascript:void(0)"in Ihrem Ankertag, aber hier ist etwas, das ziemlich gut funktioniert.

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

-1

Ich weiß, dass dies als jQuery-Frage markiert ist, aber Sie können dies auch mit AngularJS beantworten.

Fügen Sie in Ihrem Element die Anweisung ng-click hinzu und verwenden Sie die Variable $ event, die das Klickereignis ist. Verhindern Sie das Standardverhalten:

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

Sie können die Variable $ event sogar an eine Funktion übergeben:

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

In dieser Funktion machen Sie mit dem Klickereignis, was Sie wollen.

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.