2013-04-17 13 views
11

イベント用にhammer.jsライブラリを実装しました。問題は、複数のイベントが同時にトリガーされることです。Hammer.jsイベントの優先度

イベント優先度をいくつか設定できますか。変換が完了したときに他のすべてのイベントは無視されるとしましょう。トランスフォームが停止すると、他のイベントを停止することができます。

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

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

は、私はすでにこのような何か試してみた:

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

を終了すると、我々は

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

を形質転換し、変換したときに、それをバックenabeling起動したときにドラッグをDisabiling をこのアプローチは除いて正常に動作しますいつか抗力は真に戻らない。私は100%実用的な解決策を望んでいます。

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を呼び出していない場合は、残念ながらあなたが行うことができ、すべてのバグを回避するために:助けてください...これを行うには

+1

を設定し、あなたがやっている間に「変換」ということでしょうか?ありがとうございました! – Jacob

+0

'evt.stopPropagation()'または 'evt.preventDefault()'を呼び出してみましたか?私は彼らがHammerにいるかどうかわかりません.JSですが、jQueryのサポートがあるので、そう考えています... – gustavohenke

答えて

7

一つの安価な方法は、あなたのイベントハンドラが協力することです一定の時間が経過すると変換を終了するタイマーを使用しています。これは完璧ではありませんが、それはあなたがハンマーで可能なバグから回復するのに役立ちます。

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

ああ、私は 'transform'の代わりに' transformstart'を使うようにコードを変更しました。ハンマーにバグが存在する可能性があります。時には 'transformend'の後に' transform'を呼び出すか(この変更は回避されます)、または常に修正を必要とするハンマーのバグである 'transformend'を呼び出すとは限りません。いくつかの 'console.log'ステートメントを' transformstart'と 'transformend'に追加して、' start'ごとに 'end'を得られるか調べてみましょう。 – 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; 
      } 

     } 

ここで重要な部分

はいつもあなたがマイナスを与えるのではなく、コメントしてくださいすることができ transforming = true;