Wie kann verhindert werden, dass ein Klick auf einen '#' - Link zum Seitenanfang springt?


212

Ich verwende derzeit <a>Tags mit jQuery, um Dinge wie Klickereignisse usw. zu initiieren.

Beispiel ist <a href="#" class="someclass">Text</a>

Aber ich hasse es, wie das '#' die Seite an den Anfang der Seite springt. Was kann ich stattdessen tun?



2
Ich bin mit David Dorward hier und gigantisch über die verknüpfte doppelte Frage. Wenn Sie Links auf Ihrer Website haben, müssen diese als normale Links funktionieren. Wenn JavaScript sie abfängt und etwas anderes macht, alles gut und schön, aber Sie müssen dort einen echten Link haben, der zu einer echten Seite führt. Dies ist aus allen möglichen Gründen erforderlich, nicht zuletzt aus SEO und Barrierefreiheit.
Daniel Pryden

"Dumm ist so dumm wie" Wir waren alle schon einmal dort :)
Takeshin

Antworten:


241

Wenn Sie in jQuery das Klickereignis behandeln, Geben Sie false zurück, um zu verhindern, dass der Link wie gewohnt reagiertVerhindern Sie, dass die Standardaktion "Besuch des hrefAttributs" ausgeführt wird (gemäß PoweRoys Kommentar und Eriks Antwort ):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});

1
@pranay: OP hat angegeben, dass er jQuery verwendet, um mit diesen Links zu arbeiten.
BoltClock

8
Führen Sie anstelle von false ein event.preventDefault () aus. Dies ist klarer für die Personen, die Ihren Code lesen werden.
RvdK

@PoweRoy: verstanden. Ich habe die Bearbeitung vorgenommen und etwas Neues gelernt :)
BoltClock

5
@BoltClock Das OP sollte Schaltflächen verwenden, um die Klickereignisse anstelle von Ankern zu behandeln. Ihre Antwort ist ziemlich nützlich, aber für den Fall, dass href irgendwo hin zeigt und Sie die Weiterleitung im Moment nicht benötigen . Das Verhindern eines nicht erforderlichen Standardverhaltens ist eine Art Ratschlag wie: Nehmen Sie das Messer, greifen Sie die Klinge und hämmern Sie die Nägel mit dem Griff :) Nehmen Sie das richtige Werkzeug für den Job!
Takeshin

1
Wenn jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

Das ist also alt, aber ... nur für den Fall, dass jemand dies bei einer Suche findet.

Verwenden Sie einfach "#/"anstelle von "#"und die Seite springt nicht.


2
Genau das, was ich brauchte! Auch ein Jahr nach Ihrem Kommentar war dies hilfreich für mich, also danke Chris
Zack

49
Das funktioniert, weil es zu dem genannten Anker navigiert /, nicht weil #/es irgendeine Bedeutung hat. Sie können das gleiche mit tun #whateveryouwantund es wird einen Sprung nach oben verhindern
Slang

3
Dies muss die beste Antwort sein. Danke.
Gilberto Sánchez

1
@slang, obwohl Sie Recht haben, und dies ist nur ein Trottel, aber ich würde lieber "# /" anstelle von "#whateveryouwant" verwenden, da "# /" ziemlich häufig verwendet wird und somit Absichten offenbart (Clean Code). Es könnte dennoch eine Ergänzung der Antwort sein.
Jobbert

22
Achtung - dies erstellt einen Datensatz im Browserverlauf, sodass das Zurückklicken nicht das tut, was der Benutzer nach dem Klicken auf einen Link mit #/oder etwas anderem glaubt, z #whatever.
Darren Sweeney

61

Sie können es sogar einfach so schreiben:

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

Ich bin mir nicht sicher, ob es ein besserer Weg ist, aber es ist ein Weg :)


Diese Methode war für Pre-HTML 4 in Ordnung, aber heute ist es eine sehr schlechte Praxis, da zu viele Navigationsaktionen wie "Link in neuem Tab öffnen" unterbrochen werden.
Steve-o

7
Sie haben vielleicht Recht, aber ... in diesem Fall spielt es keine Rolle, weil er ein Onclick-Ereignis gibt, so dass ein offener Link in einem neuen Tab sowieso nicht funktionieren würde ...
Guy Schaller

Verknüpfung ist, href='javascript:;'aber seien Sie vorsichtig, es löst window.beforeUnload-Ereignis in IE
Mihir

Dies könnte seine eigene Funktion brechen? Denn wenn ich das mache, wird meine Funktion zum Rendern von Folien nicht mehr ausgelöst.
user3806549

29

Lösung Nr. 1: (einfach)

<a href="#!" class="someclass">Text</a>

Lösung 2: (benötigt javascript)

<a href="javascript:void(0);" class="someclass">Text</a>

Lösung 3: (benötigt jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>

3
Die erste Lösung ist perfekt. Kurz, sauber und einfach. Dies sollte die akzeptierte Antwort sein. Vielen Dank!
AlmostPitt

Nummer 1 ist eine großartige Lösung. Danke dir!
Brenton Scott


11

Verwenden Sie einfach <input type="button" />anstelle von <a>und verwenden Sie CSS, um es so zu gestalten, dass es wie ein Link aussieht, wenn Sie dies wünschen.

Schaltflächen wurden speziell zum Klicken erstellt und benötigen keine href-Attribute.

Am besten erstellen Sie die Schaltfläche mithilfe der Onload-Aktion und hängen sie über Javascript an die gewünschte Stelle. Wenn Javascript deaktiviert ist, werden sie überhaupt nicht angezeigt und verwirren den Benutzer nicht.

Wenn Sie verwenden, erhalten href="#"Sie unzählige verschiedene Links, die auf denselben Speicherort verweisen. Dies funktioniert nicht, wenn der Agent JavaScript nicht unterstützt.


1
@kingjeffrey Aber nichts zu tun ist immer noch besser als zu navigieren #.
Robert

8

Wenn Sie einen Anker verwenden möchten, können Sie http://api.jquery.com/event.preventDefault/ wie die anderen vorgeschlagenen Antworten verwenden.

Sie können auch ein anderes Element wie eine Spanne verwenden und das Klickereignis daran anhängen.

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});

7

Sie können #0als href verwenden, da 0die Seite nicht als ID zulässig ist und die Seite nicht springt.

<a href="#0" class="someclass">Text</a>

5
$('a[href="#"]').click(function(e) {e.preventDefault(); });

3
Könnten Sie bitte eine kurze Erklärung hinzufügen?
JF Meier

Es sieht für mich so aus, als würde er jedem Anker, dem ein href von "#" zugeordnet ist, einen Klick-Handler hinzufügen. Auf diese Weise müssten Sie nicht nach allen bereits vorhandenen Klick-Handlern suchen und darin e.preventDefault () hinzufügen.
Mani5556

4

Benutz einfach

<a href="javascript:;" class="someclass">Text</a>

JQUERY

$('.someclass').click(function(e) { alert("action here"); }

4

Wenn das Element keinen aussagekräftigen href-Wert hat, handelt es sich nicht wirklich um einen Link. Warum also nicht stattdessen ein anderes Element verwenden?

Wie von Neothor vorgeschlagen, ist eine Spanne genauso angemessen und bei korrekter Gestaltung als Element sichtbar, auf das geklickt werden kann. Sie können sogar ein Hover-Ereignis anhängen, um das Element zum Leuchten zu bringen, wenn sich die Maus des Benutzers darüber bewegt.

Nachdem Sie dies gesagt haben, möchten Sie möglicherweise das Design Ihrer Site überdenken, damit sie ohne Javascript funktioniert, aber durch Javascript erweitert wird, wenn es verfügbar ist.


4

Links mit href = "#" sollten fast immer durch ein Schaltflächenelement ersetzt werden:

<button class="someclass">Text</button>

Die Verwendung von Links mit href = "#" ist ebenfalls ein Problem der Barrierefreiheit, da diese Links für Bildschirmleser sichtbar sind, die "Link - Text" auslesen. Wenn der Benutzer jedoch auf klickt, wird er nirgendwo hingehen.


3

Sie können einfach ein Ankertag ohne href-Eigenschaft übergeben und mit jQuery die erforderliche Aktion ausführen:

<a class="foo">bar</a>


Ich empfehle diesen Ansatz im Allgemeinen nicht, da es keine Fallback-Aktion gibt, wenn der Benutzer js deaktiviert hat. Da Sie jedoch bereits die Einstellung href festgelegt haben, #ging ich davon aus, dass dies für Sie kein Problem darstellt, und bot diese Lösung daher an, da dies wahrscheinlich das einfachste Mittel ist, um Ihren Bedarf zu decken.
Kingjeffrey

1
a:linkCSS-Selektoren zielen nicht auf dieses Ankertag.
BoltClock

BoltClock, das ist wahr. Aber st4ck0v3rfl0w zeigte keinen solchen Bedarf an.
Kingjeffrey

Kann dann auch ein <div> verwenden. Ich glaube, der Punkt bei der Aufrechterhaltung des <a> ist, das Styling beizubehalten, das bereits durch reguläre <a> definiert ist. Ohne href wird es nicht wie die anderen <a> erkannt und gestaltet.
MarsAndBack


3

Der #/Trick funktioniert, fügt dem Browser jedoch ein Verlaufsereignis hinzu. Das Zurückklicken funktioniert also nicht so, wie es der Benutzer möchte / erwartet.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); ist der Weg, den ich gegangen bin, da er für bereits vorhandene Inhalte und alle Elemente funktioniert, die nach dem Laden zum DOM hinzugefügt wurden.

Insbesondere musste ich dies in einem Bootstrap-Dropdown-Menü innerhalb einer .btn-group(Referenz) tun, also tat ich Folgendes :

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

Auf diese Weise wurde es gezielt und hatte keinen Einfluss auf etwas anderes auf der Seite.


3

Ich habe immer verwendet:

<a href="#?">Some text</a>

beim Versuch, den Seitensprung zu verhindern. Ich bin mir nicht sicher, ob dies das Beste ist, aber es scheint seit Jahren gut zu funktionieren.


3

Es gibt 4 ähnliche Möglichkeiten, um zu verhindern, dass die Seite ohne JavaScript nach oben springt:

Option 1:

<a href="#0">Link</a>

Option 2:

<a href="#!">Link</a>

Option 3:

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

Option 4 ( nicht empfohlen ):

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

Es ist jedoch besser zu verwenden, event.preventDefault()wenn Sie das Klickereignis in jQuery übergeben.


3
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
A. Suliman

2

Sie können auch false zurückgeben, nachdem Sie Ihre Abfrage verarbeitet haben.

Z.B.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);

1
Dies und die Live-Methode sind beide veraltet und sollten nicht mehr verwendet werden.
Quentin

2

Ich benutze so etwas:

<a href="#null" class="someclass">Text</a>

2

Um zu verhindern, dass die Seite springt, müssen Sie nach dem Aufruf e.stopPropagation();Folgendes aufrufen e.preventDefault();:

stopPropagationverhindert, dass das Ereignis in den DOM-Baum aufgenommen wird. Weitere Informationen hier: https://api.jquery.com/event.stoppropagation/


Könnten Sie bitte den vollständigen Code angeben, den ich in mein HTML einfügen könnte? Ich verwende Zurb Foundation 5.5.3.
Julie S.

2

Wenn Sie zu einem Ankerabschnitt auf derselben Seite migrieren möchten, ohne dass eine Seite hochspringt, verwenden Sie:

Verwenden Sie einfach "# /" anstelle von "#", z

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..

1

Wenn Sie etwas hinzufügen, wird #der Seitenfokus auf das Element mit dieser ID gesetzt. Die einfachste Lösung ist die Verwendung, #/auch wenn Sie jQuery verwenden. Wenn Sie das Ereignis jedoch in jQuery behandeln, event.preventDefault()ist dies der richtige Weg.


0

Das <a href="#!">Link</a>und<a href="#/">Link</a> funktioniert nicht, wenn man mehr als einmal auf denselben Eingang klicken muss. Es dauert nur 1 Ereignisklick für jeden auf mehrere Eingänge.

Der beste Weg ist immer noch mit <a href="#">Link</a>

dann,

event.preventDefault();
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.