2010-11-19 19 views
6

I have numerous anchor tags on my page that only trigger jQuery actions on the same page.Alternativa al <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

¿Ha encontrado una solución o es mi respuesta lo ha implementado? Si lo es, sería bueno si pudieras marcarlo como la solución. :-) –

Respuesta

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:" * se rompe en Firefox en versiones más recientes. No estoy seguro de cuándo cambiaron eso, pero espero que haya una alternativa, porque * # * interrumpe la IU saltando de nuevo la vista de página hacia arriba. – 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") para no dañar los lectores de pantalla (y las pestañas del navegador).

Pero si desea continuar utilizando <a href="#">...</a>, simplemente adjunte un controlador que llame al event.preventDefault(); o devuelva false.

1

Si el anclaje es inútil para las personas que no tienen javascript, entonces no deberían verlo en absoluto.

La mejor alternativa es generar estos enlaces utilizando jQuery en la carga de la página; de ese modo, las únicas personas que los verán serán los que los usarán.

En este caso, teniendo href="#" está muy bien, porque mientras el controlador de eventos termina con return false; entonces el href Nunca será seguido

5

Usted realmente debe utilizar un elemento <button> de JS-únicas acciones. Tienen una acción predeterminada (si están dentro de un formulario) pero fuera de un formulario son solo acciones iniciadas por el usuario a las que vincula su controlador de eventos JS.

+1

Estaba muy, muy sorprendido de ver que 'button' tiene un comportamiento de forma predeterminado si no tiene un atributo' type', y aún así, eso parece ser lo que el borrador actual spec dice: http://www.w3.org/TR/html5/the-button-element.html#the-button-element Siempre pensé que el valor faltante por defecto para 'type' en los elementos' button' era 'button' , no 'enviar'. Gracias. –

1

¿Ha intentado omitir el parámetro href?

<a>Link title</a> 

que debería funcionar bien y no provocar al navegador a cargar una página web o cambiar la posición de las páginas. De hecho, no hará nada a menos que tenga JavaScript para soportarlo.

El parámetro href es opcional, ¿por qué incluirlo si no lo está utilizando?

+0

El estilo de un ancla (en realidad cualquier entidad html) no tiene nada que ver con los parámetros que contiene. Un sin href se verá exactamente igual que RAC

+0

No funciona en Chrome. No lo he probado en otros navegadores, por lo que podría estar equivocado * encogerse de hombros * – williamle8300

0

Utilizo el siguiente código y funciona bien.

<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 
Cuestiones relacionadas