Jak zapobiec przeskakiwaniu kliknięcia linku „#” na górę strony?

213

Obecnie używam <a>tagów z jQuery do inicjowania rzeczy takich jak zdarzenia kliknięcia itp.

Przykładem jest <a href="#" class="someclass">Text</a>

Ale nienawidzę tego, jak „#” powoduje, że strona przeskakuje na górę strony. Co mogę zamiast tego zrobić?

st4ck0v3rfl0w
źródło
2
Jestem tutaj z Davidem Dorwardem i gargantaun w sprawie powiązanego duplikatu pytania. Jeśli masz linki na swojej stronie, muszą funkcjonować jak zwykłe linki. Jeśli JavaScript przechwytuje je i robi coś innego, wszystko dobrze i dobrze, ale musisz mieć tam prawdziwy link, który prowadzi do prawdziwej strony. Jest to konieczne z różnych powodów, w tym SEO i dostępności.
Daniel Pryden
„Głupi jest jak głupi” Wszyscy byliśmy tam wcześniej :)
trwa

Odpowiedzi:

242

W jQuery podczas obsługi zdarzenia click zwraca false, aby zatrzymać odpowiedź linku w zwykły sposóbuniemożliwić wykonanie domyślnej akcji hrefpolegającej na odwiedzeniu atrybutu (zgodnie z komentarzem PoweRoy i odpowiedzią Erika ):

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

    // Cancel the default action
    e.preventDefault();
});
BoltClock
źródło
1
@pranay: OP określił, że używa jQuery do pracy z tymi linkami.
BoltClock
8
Zamiast zwracać wartość false, wykonaj event.preventDefault (). Jest to bardziej jasne dla osób, które będą czytać Twój kod.
RvdK
@PoweRoy: rozumiem.
Dokonałem
5
@BoltClock OP powinien używać przycisków do obsługi zdarzeń kliknięcia zamiast zakotwiczeń. Twoja odpowiedź jest całkiem przydatna, ale w przypadku, gdy href wskazuje gdzieś i nie potrzebujesz w tej chwili przekierowania . Zapobieganie domyślnemu zachowaniu działania, które wcale nie jest potrzebne, jest rodzajem porady: weź nóż, chwyć ostrze i wbij gwoździe za pomocą rączki :) Weź odpowiednie narzędzie do pracy!
bierze
1
Jeśli jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin
298

To jest stare, ale ... na wypadek, gdyby ktoś znalazł to podczas wyszukiwania.

Wystarczy użyć "#/"zamiast, "#"a strona nie przeskoczy.

Chris
źródło
2
DOKŁADNIE to, czego potrzebowałem! Nawet rok po twoim komentarzu było to dla mnie pomocne, więc dziękuję Chris
Zack
49
to działa, ponieważ prowadzi do nazwanej kotwicy /, a nie dlatego, że #/ma jakiekolwiek znaczenie. możesz zrobić to samo, #whateveryouwanta to zapobiegnie skokowi na szczyt
slang
3
To musi być najlepsza odpowiedź. Dziękuję ci.
Gilberto Sánchez
1
@slang, chociaż masz rację, a to po prostu nitpicking, ale wolałbym używać „# /” zamiast „#whateveryouwant”, ponieważ „# /” jest używane dość często, a tym samym ujawnia zamiary (Clean Code). Może to jednak stanowić dodatek do odpowiedzi.
jobbert
22
Uwaga - tworzy to zapis w historii przeglądarki, więc kliknięcie wstecz nie zrobi tego, co użytkownik myśli, że zrobi po kliknięciu linku #/lub czegoś innego, np #whatever.
Darren Sweeney,
61

możesz nawet napisać to tak:

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

nie jestem pewien, czy to lepszy sposób, ale jest to sposób :)

facet schaller
źródło
Ta metoda była odpowiednia dla wersji wcześniejszych niż HTML 4, ale dziś jest to bardzo zła praktyka, ponieważ łamie zbyt wiele działań nawigacyjnych, takich jak „otwórz link w nowej karcie”.
Steve-o
7
może masz rację, ale ... w tym przypadku nie ma to znaczenia, ponieważ on daje zdarzenie onclick, więc i tak otwarty link w nowej karcie i tak by nie działał ...
Guy Schaller
Skrót jest href='javascript:;'ostrożny, ale wywołuje zdarzenie window.beforeUnload w IE
Mihir
To może zepsuć jego własną funkcję? Ponieważ jeśli to zrobię, moja funkcja renderowania slajdów nie będzie już uruchamiana.
user3806549,
29

Rozwiązanie nr 1: (zwykłe)

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

Rozwiązanie nr 2: (potrzebne javascript)

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

Rozwiązanie nr 3: (potrzebne jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>
Nabi KAZ
źródło
3
Pierwsze rozwiązanie jest idealne. Krótko, czysto i prosto. To powinna być zaakceptowana odpowiedź. Dzięki!
AlmostPitt,
Numer 1 to niesamowite rozwiązanie. Dziękuję Ci!
Brenton Scott,
11

Wystarczy użyć <input type="button" />zamiast <a>i użyj CSS, aby stylizować go tak, aby wyglądał jak link, jeśli chcesz.

Przyciski są stworzone specjalnie do klikania i nie wymagają żadnych atrybutów href.

Najlepszym sposobem jest użycie akcji onload, aby utworzyć przycisk i dołączyć go w razie potrzeby za pomocą javascript, więc przy wyłączonym javascript nie będą się w ogóle wyświetlać i nie dezorientują użytkownika.

Podczas korzystania href="#"dostajesz mnóstwo różnych linków prowadzących do tej samej lokalizacji, co nie będzie działać, gdy agent nie obsługuje JavaScript.

zabiera
źródło
1
@kingjeffrey Ale nic nie robić jest lepsze niż nawigacja do #.
Robert
8

Jeśli chcesz użyć kotwicy, możesz użyć http://api.jquery.com/event.preventDefault/, podobnie jak inne sugerowane odpowiedzi.

Możesz także użyć dowolnego innego elementu, takiego jak zakres, i dołączyć do niego zdarzenie click.

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});
Neothor
źródło
7

Możesz użyć #0jako href, ponieważ 0nie jest dozwolony jako identyfikator, strona nie przeskoczy.

<a href="#0" class="someclass">Text</a>
Veve
źródło
5
$('a[href="#"]').click(function(e) {e.preventDefault(); });
Praveen Manne
źródło
3
Czy możesz dodać krótkie wyjaśnienie?
JF Meier
Wygląda mi na to, że dodaje moduł obsługi kliknięć do dowolnej kotwicy, z którą jest związany odnośnik „#”. W ten sposób nie będziesz musiał wyszukiwać wszystkich programów obsługi kliknięć, które już masz, i dodać w nich e.preventDefault ().
Mani5556,
4

Po prostu użyj

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

JQUERY

$('.someclass').click(function(e) { alert("action here"); }
Ayush
źródło
4

Jeśli element nie ma znaczącej wartości href, to tak naprawdę nie jest to link, więc dlaczego nie użyć innego elementu?

Jak sugeruje Neothor, rozpiętość jest tak samo odpowiednia, a jeśli zostanie poprawnie zaprojektowana, będzie wyraźnie widoczna jako element, który można kliknąć. Możesz nawet dołączyć zdarzenie aktywowania, aby elemnt „zapalił się”, gdy mysz nad nim przesunie się.

Jednak powiedziawszy to, możesz przemyśleć projekt swojej witryny, aby działała bez javascript, ale jest ulepszona przez javascript, gdy jest dostępny.

belugabob
źródło
4

Linki z href = "#" powinny prawie zawsze zostać zastąpione elementem przycisku:

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

Korzystanie z linków z href = "#" również stanowi problem w zakresie dostępności, ponieważ linki te będą widoczne dla czytników ekranu, które będą czytać "Link - tekst", ale jeśli użytkownik kliknie, nigdzie nie przejdzie.

martinedwards
źródło
3

Możesz po prostu przekazać tag zakotwiczenia bez właściwości href i użyć jQuery do wykonania wymaganej akcji:

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

Kingjeffrey
źródło
Zasadniczo nie polecam tego podejścia, ponieważ nie ma akcji zastępczej, jeśli użytkownik wyłączył js. Ale biorąc pod uwagę, że masz już ustawiony href #, założyłem, że to nie dotyczy ciebie, i dlatego zaoferowałem to rozwiązanie, ponieważ jest to prawdopodobnie najprostszy sposób zaspokojenia twoich potrzeb.
kingjeffrey
1
a:linkSelektory CSS nie będą kierować na ten tag zakotwiczenia.
BoltClock
BoltClock, to prawda. Ale st4ck0v3rfl0w nie wskazuje na taką potrzebę.
kingjeffrey
Może również użyć <div>. Uważam, że celem utrzymania <a> jest zachowanie stylu, który jest już zdefiniowany przez zwykłe <a>. Bez href nie będzie wykrywany i stylizowany jak inne <a>.
MarsAndBack
3

Używałem:

<a href="javascript://nop/" class="someClass">Text</a>
Brice Roncace
źródło
3

#/Sztuczka działa, ale dodaje zdarzenie historię w przeglądarce. Zatem kliknięcie wstecz nie działa tak, jak użytkownik może tego oczekiwać / oczekiwać.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); jest to sposób, w jaki poszedłem, ponieważ działa na już istniejącą zawartość i wszelkie elementy dodane do DOM po załadowaniu.

W szczególności musiałem to zrobić w menu rozwijanym bootstrap w .btn-group(Reference) , więc:

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

W ten sposób był ukierunkowany i nie wpływał na nic innego na stronie.

David
źródło
3

Zawsze używałem:

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

podczas próby uniknięcia przeskoku strony. Nie jestem pewien, czy to jest najlepsze, ale wydaje się, że działa dobrze od lat.

Josh Harris
źródło
3

Istnieją 4 podobne sposoby zapobiegania przeskakiwaniu strony na górę bez użycia JavaScript:

Opcja 1:

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

Opcja 2:

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

Opcja 3:

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

Opcja 4 ( niezalecana ):

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

Ale lepiej jest użyć, event.preventDefault()jeśli przekazujesz zdarzenie click w jQuery.

ExillustX
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
A. Suliman,
2

Możesz również zwrócić wartość false po przetworzeniu swojej jquery.

Na przykład.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);
użytkownik3581326
źródło
1
To i metoda na żywo są przestarzałe i nie powinny być już używane.
Quentin
2

Używam czegoś takiego:

<a href="#null" class="someclass">Text</a>
Stefan
źródło
2

Aby zapobiec przeskakiwaniu strony, musisz zadzwonić e.stopPropagation();po zadzwonieniu e.preventDefault();:

stopPropagationzapobiega wejściu zdarzenia do drzewa DOM. Więcej informacji tutaj: https://api.jquery.com/event.stoppropagation/

anthonyjruffa
źródło
czy możesz podać pełny kod, który mógłbym wkleić w swoim html? Używam Zurb Foundation 5.5.3.
Julie S.,
2

Jeśli chcesz przeprowadzić migrację do sekcji zakotwiczenia na tej samej stronie bez przeskakiwania strony, użyj:

Wystarczy użyć „# /” zamiast „#” np

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..
Agidigbi Ayodeji Victor
źródło
1

Dodanie czegoś po #ustawia fokus strony do elementu o tym identyfikatorze. Najprostszym rozwiązaniem jest użycie, #/nawet jeśli używasz jQuery. Jednak jeśli zajmujesz się zdarzeniem w jQuery, event.preventDefault()jest to dobra droga.

Vivek Vijayan
źródło
0

<a href="#!">Link</a>I <a href="#/">Link</a>nie zadziała, jeśli trzeba kliknąć na samym wejściu więcej niż jeden raz .. to tylko w 1 zdarzenie kliknięcia dla każdego na wielu nakładów.

wciąż najlepszym sposobem jest <a href="#">Link</a>

następnie,

event.preventDefault();
Richard Rosario
źródło