2010-11-15 12 views
5

Ho uno script che sto sviluppando che crea un effetto del tipo di pulsante scorrevole. Cinque div sono situati l'uno accanto all'altro ciascuno con un link. Quando uno di quei DIVS viene cliccato sul contenuto associato viene espanso e il resto dei Div sono chiusi.Impedire l'esecuzione di Javascript due volte

Il problema è che se un utente fa clic su Div due volte mentre carica o fa clic su un altro Div in rapida successione, le crepe iniziano a mostrare.

Mi chiedo se sarebbe possibile consentire solo l'esecuzione della query una volta e attendere il completamento anziché accodarlo.

Ecco il mio codice attuale, se si tratta di merda sentitevi liberi di commentare su come avrei potuto meglio che ... Io non sono il migliore a JavaScript/jQuery: P

function mnuClick(x){ 
    //Reset all elements 
    if($('#'+x).width()!=369){ 
     $('.menu .menu_Graphic').fadeOut(300); 
     $('.menu_left .menu_Graphic').fadeOut(300); 
     $('.menu_right .menu_Graphic').fadeOut(300); 
     $('.menu').animate({width: "76px"},500); 
     $('.menu_left').animate({width: "76px"},500); 
     $('.menu_right').animate({width: "76px"},500); 
    } 
     var ElementId = '#' + x; 

     $(ElementId).animate({ 
      width: 369 + "px" 
     },500, function(){ 
      $(ElementId + ' .menu_Graphic').fadeIn(300); 
     }); 
} 

Grazie in anticipo, Chris.

risposta

9

È necessario un flag "isRunning". Controlla prima di iniziare. Impostalo quando avvii la sequenza, cancellala quando finisce.

+1

+1 proprio quello che stavo per dire, semplicemente avere una variabile che tiene traccia di se l'evento è stato eseguito, inizializzarlo prima di iniziare l'elaborazione (quindi disabilita tutti gli altri eventi). – Jakub

+0

Grazie mille. Ottima soluzione ancora molto semplice :) – Chris

3
(function() { 
var mutex = false; 

    function mnuClick(x){ 
     if (!mutex) { 
      mutex = !mutex; 

      /* all code here ... */ 

      mutex = !mutex; /* this statement should go into animation callback */ 
     } 

    } 

})(); 

mantenere uno stato attraverso una variabile, quindi non è possibile fare clic più di una volta fino a quando il codice è completamente eseguito

0

è possibile creare un Maskin invisibile e maskout (come lo sfondo in lightbox etc) o disabilitare scatti fino a quando il l'animazione finisce.

1

è possibile scollegare il gestore di eventi onClick (mnuClick) all'avvio dell'evento, per disattivare in modo efficace il richiamo di mnuClick due volte, ma assicurarsi di ripristinarlo quando l'evento termina.

1

Risposta rapida: utilizzare .addClass e .removeClass e verificare l'esistenza della classe al momento dell'esecuzione. Verifica se è impostato e restituito, oppure aggiungilo, esegui il codice, quindi rimuovilo.

Problemi correlati