2011-09-30 8 views
5

Con la delega degli eventi in jQuery 1.6, è possibile rispondere agli eventi che sono diventati un genitore comune.ambito variabile delegazione evento jQuery con chiamate consecutive

Un esempio di implementazione è come questo:

(function($){ 
    $.fn.myeventhandler = function() { 

    return this.delegate('a.next, a.prev', 'click customEvent', function (event) { 

     var target=$(event.target); 
     var bar = null; 

     if('click' == event.type) {    /*~[ call this 'a' ]~*/ 

      // handle the click event 
      $('#next-element').animate({width:'200px'},1300,function(){ 
      bar = 'value1'; 
      $('#next-element').animate({width:'100px'},1300,function(){ 
       bar = 'value2'; 
       console.log(bar); 
      }); 
      }); 

     } else if('customEvent' == event.type) { /*~[ call this 'b' ]~*/ 

      // handle the customEvent event 
      $('#my-element').animate({height:'200px'},1300,function(){ 
      bar = 'my-event1'; 
      console.log(bar); 
      }); 

     } 

     return false; 
    }); 
    } 
})(jQuery); 

Questo tipo di struttura può funzionare davvero bene quando si hanno molti evento attiva si desidera avere legato in una pagina. Tuttavia, ho notato un comportamento curioso e mi sono chiesto se qualcuno potesse illuminarmi nell'ambito di seguito:

Se si definisce una variabile 'var bar;' prima di 'a' e la si utilizza in 'a' e 'a' richiede molto tempo per essere eseguito, quindi se "clic" viene attivato una seconda volta, la variabile "bar" verrà riassegnata al valore o ne verrà creata una nuova?

Il motivo della domanda è che ho un'animazione 'incompiuta' in cui l'animazione richiede 1,3 secondi per essere completata. Se si attivano due eventi di clic consecutivi, la destinazione e il tipo sono impostati correttamente, ma la seconda animazione sembra influenzare la prima e i due ambiti sembrano disponibili l'uno con l'altro.

Non ho ancora terminato l'animazione, quindi non ho un set funzionante da mettere online in jsFiddle, ma qui c'è una regola empirica per l'ambito che dovrei ricercare o una spiegazione più chiara dello scope disponibile qualcuno potrebbe aver trovato?

EDIT: In quanto sopra, ho aggiunto in una situazione simile a quella che sto usando. Nel caso semplificato sopra, il valore di 'bar' mantiene ancora il valore atteso su 2 chiamate consecutive, ma nel caso più complicato sto lavorando (ancora), a meno che non abbia passato specificatamente i parametri nella funzione di callback, ci sia ancora una condizione che consente a due chiamate consecutive di modificare il valore del parametro in modo che la richiamata visualizzi un valore creato da una chiamata successiva, non il valore impostato logicamente nella propria chiamata attivata. Se qualcuno può replicare questo effetto su un esempio semplificato, lo apprezzerei. Sto riducendo le mie funzioni per provare a produrre un jsFiddle che lo replica.

Grazie, AE

+0

Cosa c'è 'a'? ? ? –

+0

Ciao, Interstellar_Coder, 'a' nei commenti si riferisce al primo blocco di codice if() e 'b' si riferisce al blocco di codice 'else' - scusa se i commenti non sono di aiuto - qual è un buon esempio per illustrarlo meglio ? – MyStream

risposta

1

Se si fa clic una seconda volta, verrà creata una nuova variabile di barra, entrambi i valori della barra saranno indipendenti l'uno dall'altro. Per vedere questo in azione ho creato un fiddle. Fare clic due volte velocemente e si noterà che la seconda barra assume il valore predefinito e non il valore che aveva la variabile iniziale della barra, il che è previsto.

+0

Questo è un buon esempio (leggermente modificato per abbinare la domanda più da vicino senza nessuna variabile esterna ambito) di come una chiamata non dovrebbe influire su un'altra. Devo ancora vedere cosa ho fatto per provocarlo, ma sembra più un errore che un problema di visibilità. Puoi espandere l'ambito stesso e spiegare cosa succede su ogni evento? È autonomo? – MyStream

0

L'oggetto evento viene passato attorno invece di essere appena creato con vari eventi, quindi, 'un' sarebbe non essere riassegnato, ma sarebbe influenzato da entrambe le azioni di eventi.

+0

Salve @swatkins, non sono sicuro di aver seguito ciò che intendevi. È interessante il fatto che il link http://jsfiddle.net/BHaEj/4/ (alterato) mostra che la variabile della barra non viene spostata quando arriva il secondo evento e nel codice con cui non ho ancora finito, Posso influenzare le variabili in se i loop nelle chiamate successive. Farò un altro tentativo con i miei nomi variabili e vedrò se c'è un problema separato in gioco. – MyStream

+0

Beh, nel violino, hai "count" nello spazio globale. Quindi non è legato all'oggetto evento - l'oggetto evento sta modificando 'count', ed è per questo che questo violino funziona come previsto.Tuttavia, se dichiari 'count' all'interno della funzione di callback dell'azione clic, verrà ripetuto nuovamente ogni volta che si verifica un clic. L'oggetto evento stesso è lo stesso (con valori diversi per le proprietà), ma le particolari variabili dichiarate verrebbero dichiarate nuovamente in ogni azione. Ecco uno sguardo ai documenti per l'oggetto evento jQuery: http://api.jquery.com/category/events/event-object/ – swatkins