12

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

イベントの優先度を設定できますか。変換が行われているとき、他のすべてのイベントは無視されるとしましょう。変換が停止すると、他のイベントを実行できます。

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

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

私はすでにこのようなことを試しました: 変換を開始するときにドラッグを無効にする

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

そして、変換が終了したら有効に戻します

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

このアプローチは、ドラッグが true に戻らない場合を除いて、うまく機能します。100% 機能するソリューションが必要です。助けてください...

4

3 に答える 3

7

これを行う安価な方法の 1 つは、イベント ハンドラーを連携させることです。

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

Hammer が常にtransformend. 完全ではありませんが、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) { ... } });
于 2013-04-22T13:48:41.807 に答える
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;

于 2014-01-12T12:21:36.683 に答える