问题 Hammer.js事件优先级


我为我的活动实现了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%的工作溶剂。请帮忙...


9838
2018-04-17 12:37


起源

你可以评论而不是给出弊端吗?谢谢! - Jacob
你试过打电话吗? evt.stopPropagation() 要么 evt.preventDefault()?我不知道他们是否出现在Hammer.JS上,但我想是这样,因为它有jQuery支持...... - gustavohenke


答案:


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

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,然而不幸的是,你可以做的就是使用某种计时器,如果一段时间过去,它会结束你的变换。它并不完美,但它可以帮助您从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) { ... } });

7
2018-04-22 13:48



试试这个...... - Jacob
溶剂的工作方式就像我上面一样。通常工作,但有些时候无法将转换设置为false,因此拖动保持禁用... - Jacob
啊,我改变了使用的代码 transformstart 代替 transform。锤子有可能存在错误,要么就是它 transform 后 transformend 有时(这种变化会解决),或者它并不总是调用 transformend 这将是Hammer中需要修复的错误。尝试添加一些 console.log 声明 transformstart 和 transformend 看看你是否得到了 end 为每一个人 start。 - Brandon


尝试 ev.gesture.stopDetect();

看一下Hammer的维基,了解一些细节! https://github.com/EightMedia/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults


2
2018-04-23 18:24





我刚刚设法解决了这个问题。

            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; 


2
2018-01-12 12:21