2009-08-28 14 views
70

Quiero crear una etiqueta de anclaje que ejecute algo de JavaScript y luego continúe para ir a donde la tomó el href. Invocar una función que ejecuta mi JavaScript y luego establece window.location o top.location en la ubicación href no funciona para mí.Enlace de anclaje HTML - href y onclick ambos?

Entonces, imagina que tengo un elemento con id "Foo" en la página. Quiero al autor un ancla similar a:

<a href="#Foo" onclick="runMyFunction(); return false;">Do it!</a> 

Cuando esto se hace clic, quiero ejecutar runMyFunction y luego saltar la página a #Foo (no causar una recarga - usando top.location sería hacer que se vuelva a cargar la página).

Sugerencias? Me complace utilizar jQuery si puede ayudar aquí ...

+0

'return true;' es la solución, pero también puede llamar a 'location.hash = '# Foo''. No volverá a cargar la página. – shuangwhywhy

Respuesta

110

¿Solo return true en su lugar?

El valor de retorno desde el código onClick es lo que determina si la acción se ha hecho clic inherente del enlace se procesa o no - volver false significa que no se procesa, pero si regresa true entonces el navegador se procederá a procesarlo después de su la función vuelve e ir al anclaje correcto.

+0

¿Qué pasa si onclick no devuelve nada? – maciek

+1

@maciek, entonces el valor de retorno se trata como 'indefinido', que se considera falso para estos fines. – Amber

+1

En el pasado, cada vez que usaba una función js para abrir una nueva página, y ponía solo un "#" para el atributo href, devolvía "-1" para evitar la acción predeterminada, que generalmente es el navegador saltando al principio de la página, o a veces simplemente no devuelvo nada. Últimamente he tenido que revisar todas esas páginas porque @Amber me recomendó ... que devuelva específicamente falso, si no quiero que la página salte. – Randy

7

Si el enlace solo debe cambiar la ubicación si la función se ejecuta correctamente, haga onclick="return runMyFunction();" y en la función devolverá verdadero o falso.

Si solo desea ejecutar la función, y luego dejar que la etiqueta de anclaje haga su trabajo, simplemente elimine la instrucción return false.

Como nota al margen, probablemente debería utilizar un controlador de eventos en su lugar, ya que JS en línea no es una forma muy óptima de hacer las cosas.

23
<a href="#Foo" onclick="return runMyFunction();">Do it!</a> 

y

function runMyFunction() { 
    //code 
    return true; 
} 

De esta manera usted tendrá Youf función ejecutada y que se siga el enlace y le sigue el enlace exactamente después de que su función era ejecutar con éxito.

+0

¿Parece que no funciona si su función devuelve verdadero después de una llamada de función diferida? – DavidVdd

Cuestiones relacionadas