2011-09-30 17 views
5

Dzięki delegowaniu wydarzeń w jQuery 1.6 możesz odpowiadać na zdarzenia, które przepuściły wspólny rodzic.Zmienna zakres delegacji zdarzeń jquery z kolejnymi połączeniami

Implementacja próbka jest tak:

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

Ten rodzaj konstrukcji może pracować bardzo dobrze, gdy masz wiele zdarzenie wyzwala chcesz związały na stronie. Zauważyłem jednak dziwne zachowanie i zastanawiałem się, czy ktoś mógłby mnie oświecić w zakresie:

Jeśli zdefiniujesz zmienną "var bar;" przed "a" i użyjesz go w "a" i "a" wykonanie zajmuje wiele czasu, a jeśli "kliknięcie" zostanie wywołane po raz drugi, czy zmienna "słupkowa" zostanie ponownie przypisana do wartości, czy też zostanie utworzona nowa?

Powodem pytania jest to, że mam "niedokończoną" animację, w której wykonanie animacji trwa 1,3 sekundy. Jeśli uruchomię dwa kolejne zdarzenia kliknięcia, cel i typ są poprawnie ustawione, ale druga animacja wydaje się wpływać na pierwszą, a dwa zakresy wydają się dostępne dla siebie.

Jeszcze nie skończyłem animacji, więc nie mam działającego zestawu do umieszczenia w Internecie w jsFiddle, ale czy istnieje jakaś zasada dotycząca zakresu, który powinienem zbadać lub wyjaśnić nieco zakres dostępny ktoś mógł znaleźć?

EDIT: W powyższym Dodałem w podobnej sytuacji co ja używam. W powyższym uproszczonym przypadku wartość "bar" nadal zawiera oczekiwaną wartość dla dwóch kolejnych połączeń, ale w bardziej skomplikowanym przypadku pracuję (nadal), chyba że przekażę parametry do funkcji zwrotnej, warunek, który pozwala na 2 kolejne wywołania, aby zmienić wartość parametru tak, aby wywołanie zwrotne widziało wartość utworzoną przez kolejne wywołanie - nie wartość, która została logicznie ustawiona w jego własnym wyzwalanym wywołaniu. Jeśli ktokolwiek może powtórzyć ten efekt na uproszczonym przykładzie, byłbym wdzięczny. Ograniczam swoje funkcje, aby wypróbować jsFiddle, który je replikuje.

Dzięki AE

+0

Co to jest "a"? ? ? –

+0

Witaj, Interstellar_Coder, "a" w komentarzach odnosi się do pierwszego bloku kodu if(), a "b" do bloku kodu "else" - przepraszam, jeśli komentarze były niepomocne - co jest dobrym przykładem do zilustrowania go lepiej ? – MyStream

Odpowiedz

1

Po dwukrotnym kliknięciu zostanie utworzona nowa zmienna słupkowa, obie wartości prętów będą niezależne od siebie. Aby zobaczyć to w akcji, utworzyłem fiddle. Kliknij dwa razy szybko i zauważysz, że drugi pasek czasu przyjmuje wartość domyślną, a nie wartość początkową zmienną słupkową, która jest oczekiwana.

+0

To jest dobry przykład (jest lekko edytowany, aby lepiej odpowiadać na pytanie bez żadnej zmiennej zewnętrznej zakres), w jaki sposób jedno połączenie nie powinno wpływać na inne. Muszę jeszcze zobaczyć, co zrobiłem, aby to spowodować, ale wygląda to bardziej na błąd niż na problem z zasięgiem. Czy możesz rozszerzyć zakres i wyjaśnić, co się dzieje w każdym wyzwalaczu zdarzeń? Czy to jest samoistne? – MyStream

0

Obiekt zdarzenia jest przekazywana dookoła zamiast nowo tworzone z różnych wydarzeń, a zatem, „a” nie być ponownie przydzielony, ale mogą być naruszone przez obie działań zdarzeń.

+0

Hi @swatkins, nie jestem pewien, czy podążałem za tym, co miałeś na myśli. Interesujące jest to, że link http://jsfiddle.net/BHaEj/4/ (zmieniony) pokazuje, że zmienna słupkowa nie jest blitzowana, gdy pojawia się drugie zdarzenie, a w kodzie, którego jeszcze nie skończyłem, Mogę wpływać na zmienne w pętlach if w kolejnych wywołaniach. Będę miał jeszcze inne opcje na moje nazwy zmiennych i zobaczę, czy podczas gry występuje osobny problem. – MyStream

+0

Cóż, w skrzypcach, masz 'count' w przestrzeni globalnej. Więc w ogóle nie jest związany z obiektem zdarzenia - obiekt zdarzenia modyfikuje "count", i dlatego to skrzypce działa zgodnie z oczekiwaniami.Jeśli jednak zadeklarujesz 'count' w funkcji wywołania zwrotnego akcji kliknięcia, to zostanie ono ponownie zadeklarowane za każdym razem, gdy kliknie. Sam obiekt zdarzenia jest taki sam (z różnymi wartościami właściwości), ale poszczególne deklarowane zmienne zostaną ponownie zadeklarowane w każdym działaniu. Oto przykład dokumentów dla obiektu zdarzenia jQuery: http://api.jquery.com/category/events/event-object/ – swatkins