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!

ahmed
quelle
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 */
});
Tyson
quelle
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.

Zaius
quelle
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>
Philippe Leybaert
quelle
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.

Oli
quelle
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:;">
Punit Gajjar
quelle
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>
KristoferA
quelle
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

Rutesh Makhijani
quelle
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

aross
quelle
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>
Milan Gajjar
quelle
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.

Connell
quelle
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();
});
Bärenfreund
quelle
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>
Tee
quelle
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");
pat capozzi
quelle
2

Sie können es tun, indem Sie

<a style='cursor:pointer' >Link</a>
Naveen Heroorkar
quelle
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;
}
Burk
quelle
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.

Bryant Jackson
quelle
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>
w3bh4ck
quelle
-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.

Jeremy Jao
quelle