Come impedire che un clic su un link "#" salti all'inizio della pagina?


213

Attualmente sto usando i <a>tag con jQuery per avviare cose come eventi di clic, ecc.

L'esempio è <a href="#" class="someclass">Text</a>

Ma odio come '#' fa saltare la pagina all'inizio della pagina. Cosa posso fare invece?



2
Sono qui con David Dorward e sto discutendo sulla domanda duplicata collegata. Se hai collegamenti sul tuo sito Web, devono funzionare come normali collegamenti. Se JavaScript li intercetta e fa qualcosa di diverso, tutto bene e bene, ma devi avere un link reale lì, che porta a una pagina reale. Ciò è necessario per tutti i tipi di motivi, non ultimo il SEO e l'accessibilità.
Daniel Pryden,

"Lo stupido è come lo stupido". Siamo già stati tutti lì prima :)
data

Risposte:


242

In jQuery, quando gestisci l'evento click, restituisce false per impedire al link di rispondere normalmenteimpedire che si hrefverifichi l' azione predefinita, che consiste nel visitare l' attributo, (secondo il commento di PoweRoy e la risposta di Erik ):

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

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

1
@pranay: OP ha specificato che sta usando jQuery per lavorare con questi collegamenti.
BoltClock

8
Invece di restituire false, eseguire un event.preventDefault (). Questo è più chiaro per le persone che leggeranno il tuo codice.
RvdK,

@PoweRoy: capito. Ho apportato la modifica e imparato qualcosa di nuovo :)
BoltClock

5
@BoltClock L'OP dovrebbe usare i pulsanti per gestire gli eventi clic anziché le ancore. La tua risposta è molto utile, ma nel caso in cui href punta da qualche parte e non è necessario il redirect al momento . Prevenire il comportamento predefinito dell'azione non necessario è un tipo di consiglio come: prendi il coltello, afferra la lama e martella le unghie usando la maniglia :) Prendi lo strumento giusto per il lavoro!
Takeshin,

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

298

Quindi questo è vecchio ma ... nel caso qualcuno lo trovi in ​​una ricerca.

Basta usare "#/"invece di "#"e la pagina non salterà.


2
ESATTAMENTE quello di cui avevo bisogno! Anche un anno dopo il tuo commento mi è stato utile, quindi grazie Chris
Zack,

49
funziona perché naviga verso l'ancora indicata /, non perché #/ha alcun significato. puoi fare la stessa cosa con #whateveryouwante impedirà un salto in alto
gergo

3
Questa deve essere la risposta migliore. Grazie.
Gilberto Sánchez,

1
@slang, anche se hai ragione, e questo è solo un pignolo, ma preferirei usare "# /" invece di "#whateveryouwant" perché "# /" è usato abbastanza comune e quindi rivela intenzioni (Clean Code). Potrebbe comunque essere un'aggiunta alla risposta.
Jobbert,

22
Attenzione: questo crea un record nella cronologia del browser, quindi fare clic indietro non farà ciò che l'utente pensa che farà dopo aver fatto clic su un collegamento #/o qualsiasi altra cosa, ad es #whatever.
Darren Sweeney,

61

puoi persino scriverlo in questo modo:

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

non sono sicuro che sia un modo migliore ma è un modo :)


Questo metodo andava bene per pre-HTML 4 ma oggi è una pessima pratica in quanto interrompe troppe azioni di navigazione come "apri collegamento in una nuova scheda".
Steve-o

7
forse hai ragione ma ... in questo caso non importa perché sta dando un evento onclick quindi il link aperto in una nuova scheda non funzionerebbe comunque ...
guy schaller

La scorciatoia è href='javascript:;'ma fai attenzione, innesca window.beforeScarica l'evento in IE
Mihir,

Questo potrebbe interrompere la sua funzione? Perché se lo faccio, la mia funzione per rendere le diapositive non è più attivata.
user3806549,

29

Soluzione n. 1: (semplice)

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

Soluzione n. 2: (necessario javascript)

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

Soluzione n. 3: (necessario jQuery)

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

3
La prima soluzione è perfetta. Breve, pulito e semplice. Questa dovrebbe essere la risposta accettata. Grazie!
QuasiPitt

Il numero 1 è una soluzione fantastica. Grazie!
Brenton Scott,


11

Basta usare <input type="button" />invece di <a>CSS e usare lo stile per assomigliare ad un collegamento se lo si desidera.

I pulsanti sono creati appositamente per fare clic e non hanno bisogno di alcun attributo href.

Il modo migliore è usare l'azione onload per creare il pulsante e aggiungerlo dove necessario tramite javascript, quindi con javascript disabilitato, non verranno mostrati affatto e non confondere l'utente.

Quando lo usi href="#"ottieni tonnellate di link diversi che puntano alla stessa posizione, il che non funzionerà quando l'agente non supporta JavaScript.


1
@kingjeffrey Ma non fare nulla è ancora meglio che navigare #.
Robert,

8

Se si desidera utilizzare un'ancora è possibile utilizzare http://api.jquery.com/event.preventDefault/ come le altre risposte suggerite.

Puoi anche utilizzare qualsiasi altro elemento come un intervallo e associare l'evento click a quello.

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

7

È possibile utilizzare #0come href, poiché 0non è consentito come ID, la pagina non salterà.

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

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

3
Potresti per favore aggiungere una breve spiegazione?
JF Meier,

Mi sembra che stia aggiungendo un gestore di clic su qualsiasi ancoraggio a cui è associata una porzione di "#". In questo modo, non dovresti cercare tutti i gestori di clic che hai già in atto e aggiungere e.preventDefault () al loro interno.
Mani5556,

4

Basta usare

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

jquery

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

4

Se l'elemento non ha un valore href significativo, allora in realtà non è un collegamento, quindi perché non utilizzare un altro elemento?

Come suggerito da Neothor, un intervallo è altrettanto appropriato e, se disegnato correttamente, sarà visibilmente evidente come un elemento su cui è possibile fare clic. È anche possibile associare un evento hover, per far illuminare l'elemento mentre il mouse dell'utente si sposta su di esso.

Tuttavia, detto questo, potresti voler ripensare il design del tuo sito in modo che funzioni senza javascript, ma è migliorato da javascript quando è disponibile.


4

I collegamenti con href = "#" dovrebbero quasi sempre essere sostituiti con un elemento pulsante:

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

L'uso dei collegamenti con href = "#" è anche un problema di accessibilità poiché questi collegamenti saranno visibili agli screen reader, che leggeranno "Link - Testo" ma se l'utente fa clic non andrà da nessuna parte.


3

Potresti semplicemente passare un tag anchor senza una proprietà href e utilizzare jQuery per eseguire l'azione richiesta:

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


In genere non raccomando questo approccio, poiché non esiste alcuna azione di fallback se l'utente ha js disabilitato. Ma dato che hai già impostato l'href #, ho pensato che questo non fosse un problema per te, e quindi ho offerto questa soluzione in quanto è probabilmente il mezzo più semplice per soddisfare le tue esigenze.
Kingjeffrey,

1
a:linkI selettori CSS non sceglieranno come target questo tag di ancoraggio.
BoltClock

BoltClock, questo è vero. Ma st4ck0v3rfl0w non ha indicato un tale bisogno.
Kingjeffrey,

Quindi può usare anche un <div>. Credo che il punto nel mantenere <a> sia quello di mantenerne lo stile, che è già definito dai normali <a>. Senza href, non verrà rilevato e disegnato come gli altri <a>.
MarsAndBack,


3

Il #/trucco funziona, ma aggiunge un evento storico al browser. Pertanto, il clic indietro non funziona come l'utente potrebbe desiderare / aspettarsi.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); è la mia strada, poiché funziona per i contenuti già esistenti e tutti gli elementi aggiunti al DOM dopo il caricamento.

In particolare, dovevo farlo in un menu a discesa bootstrap all'interno di un .btn-group(Riferimento) , quindi ho fatto:

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

In questo modo è stato scelto come target e non ha influito su nient'altro sulla pagina.


3

Ho sempre usato:

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

quando si cerca di impedire il salto della pagina. Non sono sicuro che sia il migliore, ma sembra funzionare bene da anni.


3

Esistono 4 modi simili per impedire alla pagina di saltare in alto senza JavaScript:

Opzione 1:

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

Opzione 2:

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

Opzione 3:

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

Opzione 4 ( non consigliata ):

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

Ma è meglio usarlo event.preventDefault()se stai gestendo l'evento click in jQuery.


3
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
A. Suliman,

2

Puoi anche restituire false dopo aver elaborato il tuo jquery.

Per esempio.

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

1
Questo e il metodo live sono entrambi deprecati e non dovrebbero più essere utilizzati.
Quentin,

2

Uso qualcosa del genere:

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

2

Per evitare che la pagina salti, è necessario chiamare e.stopPropagation();dopo aver chiamato e.preventDefault();:

stopPropagationimpedisce all'evento di salire sull'albero DOM. Maggiori informazioni qui: https://api.jquery.com/event.stoppropagation/


potresti per favore fornire il codice completo che ho potuto incollare nel mio HTML? Sto usando Zurb Foundation 5.5.3.
Julie S.

2

Se si desidera migrare in una sezione di ancoraggio nella stessa pagina senza saltare la pagina, utilizzare:

Basta usare "# /" invece di "#" ad es

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

1

L'aggiunta di qualcosa dopo #imposta il focus della pagina sull'elemento con quell'ID. La soluzione più semplice è usare #/anche se stai usando jQuery. Tuttavia, se stai gestendo l'evento in jQuery, event.preventDefault()è la strada da percorrere.


0

Il <a href="#!">Link</a>e <a href="#/">Link</a>non funziona se si deve fare clic sullo stesso input più di una volta .. richiede solo 1 clic sull'evento per ciascuno su più input.

è ancora il modo migliore per andare <a href="#">Link</a>

poi,

event.preventDefault();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.