2013-04-17 19 views
11

Zaimplementowałam bibliotekę hammer.js na moje wydarzenia. Problem polega na tym, że jednocześnie uruchamiane są różne zdarzenia.Priorytet zdarzenia Hammer.js

Czy mogę ustawić czas trwania priorytetu zdarzenia. Powiedzmy, że po zakończeniu transformacji wszystkie inne zdarzenia są ignorowane. Kiedy transformacja zatrzyma inne zdarzenia można zrobić.

hammertime.on("transform", function(evt) { 
     //transform 
    } 

    hammertime.on("drag", function(ev) { 
     //drag 
    } 

Ja już próbowałem coś takiego: Disabiling przeciągnij kiedy zaczniemy przekształcania

hammertime.on("transform", function(evt) { 
      //transform 
      hammertime.options.drag="false"; 
} 

I enabeling go z powrotem po zakończeniu transformacji

hammertime.on("transformend", function(evt) { 
      //transformend 
      hammertime.options.drag="true"; 
} 

Podejście to działa dobrze z wyjątkiem Czasami przeciąganie nie powraca do wartości true. Chcę 100% działającego rozwiązania. Proszę o pomoc ...

+1

Czy możesz skomentować zamiast dać minusy? Dziękuję Ci! – Jacob

+0

Czy próbowałeś wywoływać 'evt.stopPropagation()' lub 'evt.preventDefault()'? Nie wiem, czy są obecni na Hammer.JS, ale myślę, że tak, ponieważ ma wsparcie jQuery ... – gustavohenke

Odpowiedz

7

Jeden tani sposób to zrobić, aby mieć swój obsługi zdarzeń współpracować:

var transforming = false; 
hammertime.on("transformstart", function (ev) { transforming = true; ... }); 
hammertime.on("transformend", function (ev) { transforming = false; }); 
hammertime.on("drag", function (ev) { if (!transforming) { ... } }); 

Jeżeli młot nie zawsze dzwoni transformend, to niestety wszystko, co można zrobić, aby obejść ten błąd jest użycie jakiegoś zegara, który kończy transformację, jeśli upłynie pewien czas. To nie jest idealne, ale może pomóc odzyskać od ewentualnego błędu w Hammer:

var transformTimer = undefined, 
    transforming = false; 
hammertime.on("transform", function (ev) { 
    transforming = true; 
    if (transformTimer !== undefined) clearTimeout(transformTimer); 
    transformTimer = setTimeout(function() { 
     transformTimer = undefined; 
     transforming = false; 
    }, 1000); // end the transform after 1s of idle time. 

    // your transform code goes here 
}); 
hammertime.on("transformend", function() { 
    if (transformTimer !== undefined) { 
     clearTimeout(transformTimer); 
     transformTimer = undefined; 
    } 
    transforming = false; 
}); 
hammertime.on("drag", function (ev) { if (!transforming) { ... } }); 
+0

Idziemy, aby spróbować ... – Jacob

+0

Sollution działa tak jak moje powyżej. Działa w ogólności, ale czasami nie można ustawić transformacji z powrotem na false, więc przeciąganie pozostaje wyłączone ... – Jacob

+0

Ah Zmieniłem kod, aby używał 'transformstart' zamiast' transform'. Możliwe, że istnieją błędy w młotku, albo nazywają 'transform' po' transformend' czasem (które to zmiana będzie działać), albo nie zawsze nazywają 'transformend', co byłoby błędem w Hammerze, który wymaga naprawy. Spróbuj dodać niektóre instrukcje 'console.log' do' transformstart' i 'transformend', aby sprawdzić, czy otrzymasz' end' dla każdego 'start'. – Brandon

2

Właśnie udało mi się naprawić ten błąd.

  var transforming = false; 
      var transformTimer = null;   

      hammertime2.on('touch drag dragend transform', function(ev) { 
       manageMultitouch(ev); 
      }); 

      hammertime2.on("transformstart", function(evt) {      
       transforming = true; 
      }); 

      hammertime2.on("transformend", function(evt) { 
       setTimeout(function() {  
        transforming = false; 
       }, 1000); 
      }); 

     function manageMultitouch(ev){    

      if (transforming && (ev.type == 'drag' || ev.type =='dragend')) return; 

      switch(ev.type) { 
       case 'touch':      
        break; 

       case 'drag': 
        break; 

       case 'transform': 
        transforming = true;      
        break; 

       case 'dragend': 
        break; 
      } 

     } 

Ważną częścią jest to, że podczas gdy robisz „Transform” zawsze ustawiony transforming = true;