Sie müssen verhindern, dass die Standardaktion für das Klickereignis (dh das Navigieren zum Linkziel) auftritt.
Es gibt zwei Möglichkeiten, dies zu tun.
Option 1: event.preventDefault()
Rufen Sie die .preventDefault()
Methode des Ereignisobjekts auf, das an Ihren Handler übergeben wurde. Wenn Sie jQuery zum Binden Ihrer Handler verwenden, ist dieses Ereignis eine Instanz von jQuery.Event
und die jQuery-Version von .preventDefault()
. Wenn Sie addEventListener
Ihre Handler zum Binden verwenden, handelt es sich um eine Event
und die unformatierte DOM-Version von .preventDefault()
. In beiden Fällen wird das getan, was Sie brauchen.
Beispiele:
$('#ma_link').click(function($e) {
$e.preventDefault();
doSomething();
});
document.getElementById('#ma_link').addEventListener('click', function (e) {
e.preventDefault();
doSomething();
})
Option 2: return false;
In jQuery :
Wenn Sie von einem Ereignishandler false zurückgeben, werden automatisch event.stopPropagation () und event.preventDefault () aufgerufen.
Mit jQuery können Sie diesen Ansatz alternativ verwenden, um das Standard-Link-Verhalten zu verhindern:
$('#ma_link').click(function(e) {
doSomething();
return false;
});
Wenn Sie unformatierte DOM-Ereignisse verwenden, funktioniert dies auch in modernen Browsern, da die HTML 5-Spezifikation dieses Verhalten vorschreibt. Ältere Versionen der Spezifikation haben dies jedoch nicht getan. Wenn Sie also maximale Kompatibilität mit älteren Browsern benötigen, sollten Sie .preventDefault()
explizit aufrufen . Siehe event.preventDefault () vs. return false (kein jQuery) für das Spezifikationsdetail.
Sie können Ihre href auf
#!
anstatt einstellen#
Beispielsweise,
führt beim Klicken kein Scrollen durch.
In acht nehmen! Dadurch wird beim Klicken weiterhin ein Eintrag zum Browserverlauf hinzugefügt. Dies bedeutet, dass die Schaltfläche "Zurück" des Benutzers nach dem Klicken auf Ihren Link nicht zu der Seite führt, auf der er zuvor war. Aus diesem Grund ist es wahrscheinlich besser, den
.preventDefault()
Ansatz zu verwenden oder beide in Kombination zu verwenden.Hier ist eine Geige, die dies veranschaulicht (schieben Sie einfach Ihren Browser nach unten, bis Sie eine Bildlaufleiste erhalten):
http://jsfiddle.net/9dEG7/
Für die Spec-Nerds - warum das funktioniert:
Dieses Verhalten wird in der HTML5-Spezifikation im Abschnitt Navigieren zu einer Fragmentkennung angegeben . Der Grund dafür, dass ein Link mit einer href von
"#"
das Dokument nach oben scrollt, besteht darin, dass dieses Verhalten explizit als Methode zur Behandlung einer leeren Fragmentkennung angegeben wird:Die Verwendung eines href von
"#!"
funktioniert stattdessen einfach, weil diese Regel vermieden wird. Das Ausrufezeichen ist nichts Magisches - es ist nur eine bequeme Fragmentkennung, da es sich deutlich von einem typischen Fragid unterscheidet und wahrscheinlich nie mit demid
odername
eines Elements auf Ihrer Seite übereinstimmt . In der Tat könnten wir fast alles nach dem Hash setzen; Die einzigen Fragmente, die nicht ausreichen, sind die leere Zeichenfolge, das Wort "oben" oder Zeichenfolgen, die übereinstimmenname
oderid
Attribute von Elementen auf der Seite.Genauer gesagt benötigen wir nur eine Fragmentkennung, die dazu führt, dass wir Schritt 8 im folgenden Algorithmus durchlaufen, um den angegebenen Teil des Dokuments aus dem Fragid zu bestimmen:
Solange wir Schritt 8 drücken und kein Teil des Dokuments angegeben ist , kommt die folgende Regel ins Spiel:
Aus diesem Grund scrollt der Browser nicht.
quelle
preventDefault()
in einem Klick-Handler - eher traurig.Ein einfacher Ansatz besteht darin, diesen Code zu nutzen:
Dieser Ansatz erzwingt keine Seitenaktualisierung, sodass die Bildlaufleiste an Ort und Stelle bleibt. Außerdem können Sie das Ereignis onclick programmgesteuert ändern und die clientseitige Ereignisbindung mithilfe von jQuery verarbeiten.
Aus diesen Gründen ist die obige Lösung besser als:
Wobei die letzte Lösung das Scroll-Jump-Problem genau dann vermeidet, wenn die myClickHandler-Methode nicht fehlschlägt.
quelle
Die Rückgabe von false aus dem von Ihnen aufgerufenen Code funktioniert und ist unter bestimmten Umständen die bevorzugte Methode. Sie können dies jedoch auch tun
Wenn es um SEO geht, hängt es wirklich davon ab, wofür Ihr Link verwendet wird. Wenn Sie es tatsächlich verwenden, um auf andere Inhalte zu verlinken, würde ich im Idealfall zustimmen, dass Sie hier etwas Sinnvolles wünschen, aber wenn Sie den Link für Funktionszwecke verwenden, wie es Stack Overflow für die Post-Symbolleiste tut (fett, kursiv, Hyperlink) usw.) dann spielt es wahrscheinlich keine Rolle.
quelle
Sie sollten das ändern
zu
Auf diese Weise wird die Seite beim Klicken auf den Link nicht nach oben gescrollt. Dies ist sauberer als die Verwendung von href = "#" und die Verhinderung der Ausführung des Standardereignisses.
Ich habe gute Gründe dafür bei der ersten Antwort auf diese Frage , wie die
return false;
wird nicht ausgeführt, wenn die aufgerufene Funktion einen Fehler auslöst, oder Sie können diereturn false;
zu einerdoSomething()
Funktion hinzufügen und dann vergessen, zu verwendenreturn doSomething();
quelle
Versuche dies:
quelle
Wenn Sie den
href
Wert einfach ändern können, sollten Sie Folgendes verwenden:Eine andere nette Lösung, die ich mir gerade ausgedacht habe, ist die Verwendung von jQuery, um das Auftreten der Klickaktion zu verhindern und das Scrollen der Seite zu bewirken, jedoch nur für
href="#"
Links.quelle
return false
sollte das nach derpreventDefault()
Zeile sein, sonst kommen Sie nie zu dieser zweiten Zeile?Verlinken Sie in erster Linie auf etwas Sinnvolleres als den oberen Rand der Seite. Brechen Sie dann das Standardereignis ab.
Siehe Regel 2 der pragmatischen progressiven Verbesserung .
quelle
Sie können event.preventDefault auch im onclick- Attribut verwenden.
Es ist nicht erforderlich, ein Exstra-Klick-Ereignis zu schreiben.
quelle
Sie können einfach auch so schreiben: -
quelle
Folgen Sie dem Aufruf der Funktion anhand eines
return false
Beispiels:quelle
Erstellen Sie eine Seite, die zwei Links enthält - einen oben und einen unten. Wenn Sie auf den oberen Link klicken, muss die Seite zum Ende der Seite scrollen, auf der sich der untere Link befindet. Wenn Sie auf den unteren Link klicken, muss die Seite nach oben scrollen.
quelle
das wird gut funktionieren. keine Notwendigkeit, href = "#" hinzuzufügen
quelle
Vielleicht möchten Sie Ihr CSS überprüfen. Im Beispiel hier: https://css-tricks.com/the-checkbox-hack/ gibt es
position: absolute; top: -9999px;
. Dies ist in Chrome besonders doof, daonclick="whatever"
immer noch zur absoluten Position des angeklickten Elements gesprungen wird.Entfernen
position: absolute; top: -9999px;
, fürdisplay: none;
könnte helfen.quelle
Wenn Sie für Bootstrap 3 zum Reduzieren kein Datenziel für den Anker angeben und sich bei der Bestimmung des Ziels auf href verlassen, wird das Ereignis verhindert. Wenn Sie ein Datenziel verwenden, müssen Sie das Ereignis selbst verhindern.
quelle