2012-03-30 17 views
7

Parece que no puedo encontrar un ejemplo de lo que estoy tratando de hacer aquí, pero estoy seguro de que es posible.Ejecutar la función luego seguir el enlace

considerar lo siguiente:

<div id="main_nav"> 
    <a href="/url/">LINK</a> 
    <a href="/url/">LINK</a> 
    <a href="/url/">LINK</a> 
    <a href="/url/">LINK</a> 
</div> 

¿Cómo puedo ejecutar una función cuando un link dentro #main_nav se hace clic a continuación, antes de la siguiente link?

Lo siguiente no funciona, ya que se sigue el enlace antes de ejecutar la función.

$('#main_nav a').click(function() { 
    // Some Function 
}); 

EDITAR

realidad estoy tratando de limpiar una cookie con el plugin jQuery galletas cuando se hace clic en los enlaces. No estoy seguro de si esto es relevante o no.

El código de galletas Claro es:

$.cookie('TMMenu', null); 

TMMenu es el nombre correcto y se carga el complemento.

EDITAR

todos sentimos. El problema fue en realidad con el JQuery Cookie plugin documentation.

$.cookie('TMMenu', null); 

como se describe en el archivo Léame no parece funcionar. Esto hace:

$.cookie('TMMenu', null, { path: '/', expires: -5 }); 
+2

No hay nada malo con este código Se ejecutará el cuerpo de 'clic' y luego se seguirá el enlace. ¿Qué problema estás viendo? – JaredPar

+0

Parece que necesita una devolución de llamada de algún tipo. – j08691

+2

¿Está tratando de realizar un comportamiento asincrónico antes de que se navegue al enlace, como una animación o una solicitud AJAX? – zzzzBov

Respuesta

21

actualización: Re tu edición: No puedo ver ninguna razón por la que no iba a funcionar aparte de # 1 a continuación.

me ocurren dos respuestas a esta pregunta:

  1. Usted está ejecutando su código jQuery antes de que exista el elemento #main_nav a, y ningún controlador de eventos está conectado. Coloque su secuencia de comandos en la parte inferior del archivo HTML, justo antes de la etiqueta de cierre </body>, o use ready callback.

  2. Está haciendo algo asincrónico en su controlador y no lo ve.Esto se debe a que tan pronto como el controlador de eventos regrese, el enlace sigue   —, incluso si su controlador inicia alguna acción asincrónica.

Aquí es cómo fijar el segundo (ambos, si se pone esto al final o dentro de un manejador de ready):

$('#main_nav a').click(function(event) { 
    // Remember the link href 
    var href = this.href; 

    // Don't follow the link 
    event.preventDefault(); 

    // Do the async thing 
    startSomeAsyncThing(function() { 
     // This is the completion callback for the asynchronous thing; 
     // go to the link 
     window.location = href; 
    }); 
}); 

(Live copy | source)

+0

Lo marcaré como correcto por proporcionar un ejemplo interesante. El problema era en realidad con el código que estaba usando para eliminar una cookie. Muchas gracias – Turnip

+0

@ 3rror404: ¡Me alegra que lo haya encontrado útil! Por mucho que aprecie a la representante, sería mejor si publicara su propia respuesta diciendo lo que era y luego (después de 48 horas) la aceptó. Sin embargo, tomaré un voto positivo si aún no lo has hecho. ;-) (O podría marcar su pregunta, pedirle a un moderador que la elimine, ya que probablemente no sea útil para otros ...) –

+0

@TJCrowder ¿Funcionará esta solución para los enlaces en los que se ha hecho clic con el botón Ctrl o en el botón derecho y abierto en una nueva pestaña? – pdoherty926

2

Así es como lo haces. Si llama al event.preventDefault en su devolución de llamada con el manejador de clics evitará la acción predeterminada. Luego, para seguir el enlace a través de javascript simplemente use window.open(url) o window.location = url.

$('#main_nav a').click(function(event) { 
    // Some Function 

    var url = $(this).attr('href'); // Get url from the <a> href attribute 
    window.open(url,"_self"); // Open the url in the current window. Set to "_blank" instead of "_self" to open in a new window. 

    event.preventDefault(); // Prevent default action (e.g. following the link) 
    return false; 
}); 

W3Schools tiene más información sobre la diferencia entre window.open y window.location.

Cuestiones relacionadas