2008-10-08 20 views
5

Quiero hacer un enlace llamar a una función de Javascript a través del evento onclick y no hacer nada más (siga el enlace). ¿Cuál es la mejor manera de hacer eso? Yo suelo hacer esto:¿Cuál es la forma correcta de cambiar el comportamiento de una etiqueta <a>?

<a href="#" onclick="foo()">Click</a> 

Pero no estoy seguro de que es la mejor manera y en este caso se está navegando hacia pagina.html # que no es bueno para lo que estoy haciendo.

Respuesta

18

Por lo general, siempre se debe tener una caída posterior enlace para asegurarse de que los clientes con JavaScript desactivado todavía tiene algunas funciones . Este concepto se llama JavaScript discreto. Ejemplo...Digamos que usted tiene el siguiente enlace de búsqueda:

<a href="search.php" id="searchLink">Search</a> 

Siempre se puede hacer lo siguiente:

var link = document.getElementById('searchLink'); 

link.onclick = function() { 
    try { 
     // Do Stuff Here   
    } finally { 
     return false; 
    } 
}; 

De esa manera, las personas con JavaScript desactivado se dirigen a search.php mientras que sus espectadores con JavaScript ver su funcionalidad mejorada.

Editar:nickf Como se ha señalado en el comentario # 2, una oportunidad y captura evitarán que el enlace a seguir si hay un error en el controlador.

+0

Upped. Si realmente está buscando la MEJOR solución, esta es. Debe desacoplar su HTML (presentación) de su JavaScript (lógica). Comience con un enlace normal y luego agregue el controlador de evento click luego. –

+0

+1. Esta es la forma correcta de hacerlo. Lo único que agregaría es que si hay un error JS en su controlador onclick, no obtendrá el resultado falso, por lo que se seguirá el enlace. Para evitar eso, envuelva toda su función en un bloque try: "try {// hacer las cosas aquí} finally {return false;}" – nickf

+0

Si hay un error en el controlador, a menudo querrá que se siga el enlace. "Hazlo en JS o vuelve al servidor" es mejor que "Hazlo en JS o cometa un error o vuelve al servidor" – Quentin

0
<a href="javascript: foo()" >Click</a> 
+0

¿Por qué esto está siendo rechazado? No me importan los puntos, pero me gustaría saber qué sucede. –

+0

simplemente no es la mejor respuesta. Ver la respuesta de Andrew Moore. http://stackoverflow.com/questions/184858#184916 – nickf

6

Sólo asegúrese de volver false de su manejador onclick. P.ej. foo() deberían definirse como:

function foo() { 
    // ... do stuff 
    return false; 
} 

Alguien señaló en los comentarios que usted puede necesitar cambiar el código HTML ligeramente, para conseguirlo:

<a href="#" onclick="return foo()">Click</a> 

o simplemente poner en el código HTML:

<a href="#" onclick="foo(); return false;">Click</a> 
+0

Si hace esto, creo que debe cambiar el enlace onclick del enlace para "devolver Foo();" –

+0

@Lou Creo que tienes razón. – Avdi

+0

¿El propósito del retorno es falso para evitar que la página intente navegar al anclaje inexistente? –

0

retorno falsa después de llamar a foo()

-2

si se incluyen

return false; 

desde el evento onclick, la página no se cargará en absoluto. Por ejemplo:

<a href="#" onclick="foo();return false;">Click</a> 

O en la propia función:

function foo() { 
    // other stuff 
    return false; 
} 
-2

Establecer el atributo href para ejecutar el código JavaScript. De esta manera:

<a href="javascript:foo()">Click</a>

De esta manera la totalidad de su a: hover estilos CSS funcionan como se esperaba.

2

El problema con href="#" es que lanzará el navegador a la parte superior de la página. Puede hacerlo:

<a href="javascript:foo()">clicky</a> 

Aunque hay más personas que recomiendan no hacerlo (separación de capas). Una mejor manera, utilizando Prototype (igual de fácil en jQuery, et al):

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

$('foo').observe('click', function(evt) { 
    foo(); 
    evt.stop(); // keeps it from navigating to the href url 
}); 
+0

Espera un segundo, el retorno falso no tiene el comportamiento que esperaba ...Buscándolo ahora. – swilliams

+0

Ok, lo arreglé :). – swilliams

3

En primer lugar, hay dos formas de configurar el href - que puede hacer ya sea como usted ha indicado anteriormente con el href referencia a un ' # ', o puede configurar el href para hacer referencia a "javascript :;"

En segundo lugar, siempre recomiendo mantener el JavaScript en un archivo externo y luego administrar el controlador de eventos allí. Suponiendo que le gustaría configurar esto cada vez que se carga la página, usted podría hacer algo como esto:

window.onload = { 
    var myLink = document.getElementById('myLinkID'); 
    myLink.onclick = function(evt) { 
     var evt = (evt) ? evt : ((event) ? event : null); // for cross-browser issues 
     evt.preventDefault(); 
     evt.stopPropagation(); 
     foo(); 
    } 
} 
+0

¿Qué sucede con event.preventDefault o null.preventDefault? – eyelidlessness

+0

@eyelidlessness - Podría estar malinterpretando su pregunta, pero el operador ternario anterior se asegura de que obtenga una referencia a un objeto existente para que evt.preventDefault() funcione en los principales navegadores. En cualquier caso, cancelará el evento sin detener la propagación del evento. – Tom

0

Una gran cantidad de confusión es en torno al uso de un-tags porque cruzan en navegador admite el: hover pseudo-css-selector ...

Por lo tanto, es a menudo evidente para utilizar un tag-a, ya que representaría de forma diferente según las diferentes etapas del mouse-hover ...

Algunos afirmarían que la funcionalidad incorporada en la: seudomarjeta hover no debería estar disponible en absoluto, ya que la intención del W3C es separar el contenido, visual presentación y funcionalidad en las tres partes de html dinámico; html, css y javascript.

Pero por ahora estamos atrapados con eso, y por el momento es funcional usar etiquetas a en muchas formas, ya que cumplen tareas de una manera simple, y es directo hacia adelante browser! -)

Pero eso significa que a veces tiene que desactivar el comportamiento predeterminado de esas etiquetas de enlace, y eso significa que tiene que hacer que el evento onclick return sea falso, cuando no tiene sentido cambiar el contenido del documento actual ...

Sin embargo, se pueden hacer muy buenos ejemplos del uso del descarte del comportamiento predeterminado, un ejemplo podría ser proporcionar una ventana emergente con ciertas propiedades incluso si el usuario ha desactivado el uso de javascript:

<a href="http://en.wikipedia.org/wiki/Css" target="_blank" onclick="window.open(this.href,'_blank','width=600,height=450,status=no');return false;">Show wikipedia css</a> 
-1

Guárdese simplemente usando

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

ya que puede causar un desagradable IE6 problem.

Siempre recomiendo usar un ancla que apunta a nada. Me gusta usar esta

<a href="#MAGIC">Click</a>

porque me hace reír.

Cuestiones relacionadas