2011-09-30 11 views
5

Con la delegación de eventos en jQuery 1.6, puede responder a eventos que han borboteado a un elemento primario común.ámbito de variable de delegación de eventos de jquery con llamadas consecutivas

Un ejemplo de implementación es la siguiente:

(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); 

Este tipo de estructura puede funcionar muy bien cuando se tiene muchos activadores de eventos que desea que se atado en una página. Sin embargo, noté un comportamiento curioso y me pregunté si alguien me podría aclarar el alcance de lo siguiente:

Si define una variable 'var bar;' antes 'a' y la usa en 'a' y 'a' toma mucho tiempo para ejecutarse, luego si se 'dispara' por segunda vez, ¿la variable 'barra' sería reasignada al valor o se crearía una nueva?

El motivo de la pregunta es que tengo una animación "inacabada" en la que la animación tarda 1,3 segundos en completarse. Si activa dos eventos de clic consecutivos, el objetivo y el tipo están configurados correctamente, pero la segunda animación parece estar afectando a la primera y parece que los dos ámbitos están disponibles el uno para el otro.

Todavía no he terminado la animación, así que no tengo un conjunto de trabajo para poner en línea en jsFiddle, pero ¿hay alguna regla de oro aquí que deba investigar o una explicación más clara del alcance disponible? alguien puede haber encontrado?

EDIT: En lo anterior, he añadido en una situación similar a lo que estoy usando. En el caso simplificado anterior, el valor de 'bar' todavía tiene el valor esperado en 2 llamadas consecutivas, pero en el caso más complicado estoy trabajando (todavía), a menos que pase los parámetros en la función de devolución de llamada específicamente, todavía hay una condición que permite 2 llamadas consecutivas para cambiar el valor del parámetro de modo que la devolución de llamada vea un valor creado por una llamada posterior, no el valor que se estableció lógicamente en su propia llamada activada. Si alguien puede replicar este efecto en un ejemplo simplificado, lo agradecería. Estoy reduciendo mis funciones para intentar producir un jsFiddle que lo replique.

Gracias, AE

+0

¿Qué es 'a'? ? ? –

+0

Hola, Código interestelar, 'a' en los comentarios se refiere al primer bloque de código if() y 'b' al bloque de código 'else'. Lo siento si los comentarios no fueron útiles. ¿Qué es un buen ejemplo para ilustrarlo mejor? ? – MyStream

Respuesta

1

Si hace clic una segunda vez, se creará una nueva variable de barra, ambos valores de barra serían independientes entre sí. Para ver esto en acción, creé un fiddle. Haga clic dos veces rápido y notará que la barra de la segunda vez toma el valor predeterminado y no el valor que tenía la variable de barra inicial, que se espera.

+0

Este es un buen ejemplo (ligeramente editado para que coincida con la pregunta más de cerca sin una variable externa) alcance) de cómo una llamada no debería afectar a otra. Todavía tengo que ver qué he hecho para causarlo, pero parece más un error que un problema de alcance. ¿Puede ampliar el alcance mismo y explicar en absoluto qué sucede en cada activador de evento? ¿Es autónomo? – MyStream

0

El objeto de evento se pasa alrededor en lugar de ser de nueva creación con varios eventos, por lo tanto, 'a' no estaría re-asignado, pero se verían afectados por ambas acciones de eventos.

+0

Hola @swatkins, no estoy seguro de haber seguido lo que querías decir. Es interesante que el enlace http://jsfiddle.net/BHaEj/4/ (alterado) muestra que la variable de barra no se carga cuando llega el segundo evento, y en el código todavía no he terminado, Puedo afectar las variables en bucles if en llamadas posteriores. Voy a intentar con mis nombres de variables y ver si hay un problema por separado. – MyStream

+0

Bueno, en el violín, tienes 'count' en el espacio global. Por lo tanto, no está vinculado al objeto del evento en absoluto: el objeto del evento está modificando 'count', y es por eso que este violín está funcionando como se esperaba.Sin embargo, si declara 'count' dentro de la función de devolución de llamada de la acción de clic, se volverá a declarar cada vez que ocurra un clic. El objeto de evento en sí mismo es el mismo (con diferentes valores para las propiedades), pero las variables particulares declaradas se volverían a declarar en cada acción. Aquí hay un vistazo a los documentos para el objeto Evento jQuery: http://api.jquery.com/category/events/event-object/ – swatkins

Cuestiones relacionadas