2012-03-30 15 views
7

Non riesco a trovare un esempio di ciò che sto cercando di fare qui, ma sono sicuro che sia possibile.Esegui la funzione, quindi segui il link

Si consideri il seguente:

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

Come posso eseguire una funzione quando un link entro #main_nav si fa clic prima di allora in seguito alla link?

Quanto segue non funziona in quanto il collegamento viene seguito prima dell'esecuzione della funzione.

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

EDIT

In realtà sto cercando di cancellare un cookie con il plugin biscotto JQuery quando i collegamenti sono cliccato. Non sono sicuro se questo sia rilevante o meno.

Il codice cookie di Clear è:

$.cookie('TMMenu', null); 

TMMenu è il nome corretto e il plugin sia caricato.

EDIT

spiacenti tutti. Il problema era in realtà con lo JQuery Cookie plugin documentation.

$.cookie('TMMenu', null); 

come descritto nel readme non sembra funzionare. Questo fa:

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

Non c'è niente di sbagliato con questo codice Il corpo di "click" verrà eseguito e quindi il collegamento verrà seguito. Che problema vedi? – JaredPar

+0

Sembra che tu abbia bisogno di una richiamata di qualche tipo. – j08691

+2

Si sta tentando di eseguire un comportamento asincrono prima che il collegamento venga navigato, ad esempio un'animazione o una richiesta AJAX? – zzzzBov

risposta

21

Aggiornamento: Re tua modifica: non riesco a vedere alcuna ragione per cui non avrebbe funzionato diverso da 1 # seguito.

Mi vengono in mente due risposte a questa domanda:

  1. Si sta eseguendo il codice jQuery prima esiste l'elemento #main_nav a, e nessun gestore di eventi è collegato. Metti il ​​tuo script nella parte inferiore del file HTML, appena prima del tag di chiusura </body>, o usa lo ready callback.

  2. Stai facendo qualcosa di asincrono nel gestore e non vedendolo accadere.Questo perché non appena il gestore eventi ritorna, il collegamento viene seguito   — anche se il gestore avvia un'azione asincrona.

Ecco come risolvere il secondo (entrambi, se si mette questo alla fine o all'interno di un gestore 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

Ti segnerò come corretto per fornire un esempio interessante. Il problema era in realtà con il codice che stavo usando per cancellare un cookie. Molte grazie – Turnip

+0

@ 3rror404: sono contento che tu l'abbia trovato utile! Per quanto apprezzi il rappresentante, sarebbe meglio se tu scrivessi la tua risposta dicendo quello che era e poi (dopo 48 ore) lo accettò. Prenderò un upvote se non lo hai già fatto, però. ;-) (Oppure puoi segnalare la tua domanda, chiedendo a un moderatore di rimuoverla, poiché probabilmente non è utile per gli altri ...) –

+0

@TJCrowder Questa soluzione funzionerà per i collegamenti che sono stati fatti clic con il tasto Ctrl o con il tasto destro del mouse e aperto in una nuova scheda? – pdoherty926

2

Ecco come lo si fa. Se chiami event.preventDefault nella richiamata del gestore di clic, impedirà l'azione predefinita. Quindi per seguire il collegamento tramite javascript basta usare 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 ha più informazioni sulla differenza tra window.open e window.location.

Problemi correlati