2011-06-29 12 views
7

Tengo un enlace que quiero poder hacer clic para activar un fragmento del código jQuery.Enlace HREF que no tiene como objetivo nada, no quiere usar hash o void (0)

Actualmente tengo

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

y

$('#foo').click(function(){ 
    // Do stuff 
}); 

que funciona bien. Pero, siempre he odiado usar hash de esta manera. La página parpadea y el hash se agrega a la URL de la página.

Una alternativa es utilizar

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

pero también me gusta ver ese pedazo de código en la barra de estado del navegador. Se ve hortera.


Lo que yo prefiero es un marcador de posición explicativa Javascript que no hace nada, como

<a href="javascript:zoom();" id="foo">Link</a> 

que en realidad funciona, pero lanza una ReferenceError en la consola de JavaScript ya que no hay tal función. ¿Cuál es la definición mínima de una función que no hace nada?

¿Hay alguna otra alternativa?

¿Debo saltar el enlace y usar algo como

<span id="foo" style="cursor:pointer;cursor:hand;">Link</span> 

en su lugar?

+3

Por motivos de accesibilidad, no recomendaría utilizar un tramo que tenga el estilo de un ancla. – ScottE

+0

@thirtydot Eso es todo! Spot on. – Mattis

Respuesta

15

Utilice el método event.preventDefault()[docs].

$('#foo').click(function(e){ 

    e.preventDefault(); 
    // Do stuff 
}); 

Esto evitará que el hash tenga algún efecto al hacer clic. O deshazte del hash y usa CSS para darle un estilo.

Además, puede proporcionar una url real para que href maneje la degradación elegante.


¿Cuál es la definición mínima de una función que no hace nada?

Aquí es una función no-op:

var noop = function(){}; 

... o ya estás usando jQuery, puede utilizar el método jQuery.noop()[docs], que también es sólo una función de vacío.

$.noop 
+2

+1: ten en cuenta que con esta respuesta puedes mantener la etiqueta hash y la página no parpadeará. javascript: void (0) está privado. – Babiker

+1

Impresionante Patrick, <3 – Mattis

1

Puede utilizar preventDefault, por ejemplo:

$('#foo').click(function(e){ 
    // Do stuff 
    e.preventDefault(); 
}); 
+1

Esto no funcionará. preventDefault() es un método del evento, no el elemento jQuery-wrapped en el que se hizo clic. –

+0

@Rob Cowie: Error honesto: correcto, aunque un poco tarde, apueste que nunca. –

+0

Supuse que fue un simple error. :) –

3

Idealmente, el enlace debe enlazar a una página que imita la funcionalidad JavaScript habilitado para los usuarios sin JS. Entonces preventDefault prevendría la navegación real, como han indicado las otras respuestas.

Si eso no tiene sentido en este caso, tenga en cuenta que el atributo href es opcional. Puedes dejarlo por completo.

+0

Si se omite el atributo href, el elemento ya no es un enlace. – RobG

+0

No es realmente un enlace si va a una ubicación ficticia de todos modos. Probablemente tengas razón al usar un botón. – Eevee

3

Este es un uso inapropiado de un enlace, debe usar un botón u otro elemento que indique que hacer clic hará que suceda algo pero no la navegación.

+0

De acuerdo, pero en este caso el enlace se adjunta a un gráfico y es obvio que el enlace hará una acción de acercamiento en el objeto de gráfico debido a la denominación y colocación del texto. Además, los botones serían demasiado grandes en esta implementación. En general, sin embargo tienes razón. – Mattis

Cuestiones relacionadas