2010-11-19 14 views
6

I have numerous anchor tags on my page that only trigger jQuery actions on the same page.Alternativa a <a href="#"> when the anchor tag only triggers a jQuery action without redirecting the user?

The don't redirect the user to another location, which is the normal expected behavior of an anchor tag.

I don't want to have restful urls in my app for every action. But, I also don't like sending the user to the top of the page every time they click on one of these <a href="#"> tags.

What's a better value to put inside the href value of the anchor tag besides #?

+0

Hai trovato una soluzione o è la mia risposta ciò che è stato implementato? Se fosse sarebbe bello se potessi contrassegnarlo come la soluzione. :-) –

risposta

0
return false; 

Use this to stop browser sending them to top of page?

1

# is fine. But the callbacks that are triggered should then return false.

// assigning a click callback to all anchors 
    $('a').click(function(evt){ 
     //... do stuff 
     return false; // avoid jump to '#' 
    }) 
1

I prefer to use:

<a href="javascript:">foo</a> 

unless it is actually an ajax call to load a partial template in which case I use something like this:

<a href="/link/to/page" onClick="ajax_request_to_partial(); return false;">foo</a> 

By returning false in the onclick event, you make sure the site is not reloaded, but it can still be used for opening the url in a new page.

+0

* href = "javascript:" * si interrompe in Firefox nelle versioni più recenti. Non sono sicuro di averlo modificato, ma spero che ci sia un'alternativa, perché * # * interrompe l'interfaccia utente saltando la visualizzazione della pagina in alto. – Typel

+1

'javascript: void (0)' –

9

Can you reference a fragment on the page that could work as a logical fallback to the non-executed JavaScript action? If so, it makes a lot of sense to reference <a href="#account"> and have an id="account" on the page that could work as a fallback.

Another option is to reference the dynamically loaded content directly; that way you can quite conveniently use the href in the Ajax call instead of hard-coding what to request in JavaScript somehow; <a href="/path/to/dynamic/content">.

Lastly, you can not have the <a href="#"> statically in the HTML at all, but instead create it on the fly with jQuery since it's only used by jQuery anyway. No need to pollute the markup with placeholders for JavaScript if the placeholders are only used by and for JavaScript anyway.

Regarding "sending the user to the top of the page"; you should just return false from your the function you have hooked up as a click() handler;

$('a').click(function() { 
    // Do your stuff. 
    // The below line prevents the 'href' on the anchor to be followed. 
    return false; 
}); 
0

if you bind some action on click on you can call preventDefault() to avoid sending user in top of page

$("a.clickable").live('click',function(){$(this).doSome(); $(this).preventDefault()}); 
2

If you have links that aren't links, perhaps they shouldn't be links? :-) You might consider a different UI element that doesn't have a default behavior (outside of a form), like button (you can style buttons to a substantial degree). Or you could use span or similar, but if you do be sure to set the appropriate accessibility information (such as an ARIA role="link") in modo da non rovinare gli screen reader (e la tabulazione del browser).

Ma se si desidera continuare a utilizzare <a href="#">...</a>, è sufficiente allegare un gestore a loro che chiama event.preventDefault(); o restituisce false.

1

Se l'ancora è inutile per le persone che non hanno javascript, quindi non dovrebbero vederlo affatto.

L'alternativa migliore è quella di generare questi collegamenti utilizzando jQuery al caricamento della pagina - in questo modo le uniche persone che li vedono sono quelli che li useranno.

In questo caso, avendo href="#" va bene, perché il tempo che il gestore di eventi finisce con return false; poi il href sarà mai da seguire

5

Si dovrebbe davvero si stia utilizzando un elemento <button> per le azioni JS-solo. Hanno un'azione predefinita (se all'interno di un modulo) ma al di fuori di un modulo sono puramente per le azioni attivate dall'utente a cui si associa il gestore eventi JS.

+1

Sono stato davvero molto sorpreso nel vedere che il 'pulsante' ha un comportamento di forma predefinito se non ha un attributo' type', eppure, sembra che sia la bozza corrente spec dice: http://www.w3.org/TR/html5/the-button-element.html#the-button-element Ho sempre pensato che il valore mancante predefinito per 'type' sugli elementi' button' fosse 'button' , non 'submit'. Grazie. –

1

Hai provato a omettere il parametro href?

<a>Link title</a> 

Che dovrebbe funzionare bene e non provocare il browser per caricare una pagina Web o modificare la posizione delle pagine. In effetti non farà nulla a meno che tu non abbia JavaScript per supportarlo.

Il parametro href è facoltativo, quindi perché includerlo se non lo si utilizza?

+0

Lo stile di un'ancora (in realtà qualsiasi entità html) non ha nulla a che fare con i parametri che contiene. Un con out href avrà lo stesso aspetto di RAC

+0

Non in Chrome. Non l'ho provato su altri browser, quindi potrei sbagliarmi * scrollare le spalle * – williamle8300

0

Utilizzo il codice riportato di seguito e funziona correttamente.

<div class="panel-heading">Definition 
      <div class="pull-right"> 
       <i class="fa fa-wrench"></i> 
       <a id="step3Ad" href="javascript:void(0);">Advanced</a> 
      </div> 
    </div 
Problemi correlati