2013-04-17 3 views
11

Я реализовал библиотеку hammer.js для своих событий. Проблема в том, что одновременно запускаются несколько событий.Hammer.js приоритет события

Могу ли я установить некоторый приоритет события. Предположим, что при трансформации все остальные события игнорируются. Когда трансформация останавливается, другие события могут быть выполнены.

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

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

Я уже пытался что-то вроде этого: Disabiling сопротивление, когда мы начинаем преобразование

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

И enabeling его обратно, когда преобразование закончено

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

Этот подход хорошо, за исключением работ то перетаскивание не возвращается к истинному. Я хочу 100% рабочего раствора. Пожалуйста, помогите ...

+1

Можете ли вы прокомментировать, а не давать свои минусы? Спасибо! – Jacob

+0

Вы пытались вызвать 'evt.stopPropagation()' или 'evt.preventDefault()'? Я не знаю, присутствуют ли они на Hammer.JS, но я так думаю, так как у него есть поддержка jQuery ... – gustavohenke

ответ

7

Один дешевый способ сделать это, чтобы ваши обработчики событий сотрудничают:

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

Если Молот не всегда звонит transformend, то, к сожалению, все, что вы можете сделать, чтобы работать вокруг ошибки использует какой-то таймер, который заканчивает ваше преобразование, если пройдет определенное количество времени. Это не идеально, но это может помочь вам оправиться от возможной ошибки в Хаммере:

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

Идём, чтобы попробовать ... – Jacob

+0

Решетка работает так же, как моя. Работает в генералитете, но что-то не удается установить преобразование обратно в false, и поэтому перетаскивание остается отключенным ... – Jacob

+0

А я изменил код, чтобы использовать 'transformstart' вместо' transform'. Возможно, есть ошибки в молотке, или он иногда вызывает 'transform' после' transformend' (что это изменение будет работать), или это не всегда вызывает 'transformend', что было бы ошибкой в ​​Hammer, которая нуждается в исправлении. Попробуйте добавить некоторые операторы 'console.log' для' transformstart' и 'transformend', чтобы узнать, получаете ли вы' end' для каждого 'start'. – Brandon

2

Мне только удалось исправить эту ошибку.

  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; 
      } 

     } 

Важной частью здесь является то, что в то время как вы делаете «Transform» всегда устанавливается transforming = true;

Смежные вопросы