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

一种廉价的方法是让您的事件处理程序合作:

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 回答
2

尝试ev.gesture.stopDetect();

有关详细信息,请参阅 Hammer 的 wiki! https://github.com/EightMedia/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults

于 2013-04-23T18:24:29.863 回答