【发布时间】:2015-01-27 10:12:48
【问题描述】:
我想设置 Hammer.js,以便我可以响应水平平移事件。我的第一次尝试是这样的:
var mc = new Hammer(document.body);
mc.on("panleft panright", runBind(this, 'updatePosition'));
mc.on("panend", runBind(this, 'finalisePosition'));
这几乎得到了我正在寻找的行为:如果我向左或向右平移,则调用 updatePosition 函数,当我停止平移时调用 finalisePosition 函数。
但是,如果手势在垂直滚动时向左或向右漂移,也会触发这些功能。例如,假设我触摸屏幕顶部附近,然后将手指向下拖动到屏幕的一半:这应该注册为滚动事件。现在假设我继续对角拖动:向下和向左。在这种情况下,我想忽略手势的水平部分,仅将手势视为垂直滚动事件,但 Hammer.js 会像以前一样触发 panright 和 panleft 事件。
我的下一次尝试是这样的:
var mc = new Hammer(document.body, {
recognizers: [
[Hammer.Swipe],
[
Hammer.Pan,
{event: 'panvertical', direction: Hammer.DIRECTION_VERTICAL}
],
[
Hammer.Pan, // RecognizerClass
{direction: Hammer.DIRECTION_HORIZONTAL}, // options
['swipe'], // recognizeWith
['panvertical'] // requireFailure
],
]
});
mc.on("panleft panright", runBind(this, 'updatePosition'));
mc.on("panend", runBind(this, 'finalisePosition'));
这指定仅当panvertical 事件失败时才应触发水平平移事件。果然,这可以防止我上面描述的问题。如果我开始垂直滚动手势然后开始水平移动,则不会触发 panleft 和 panright 事件。但是这个版本有一个更严重的问题:默认的滚动行为没有发生!因此无法滚动应用。
谁能提出更好的解决方案?
我使用的是 Hammer.js 版本 2.0.4。
【问题讨论】:
标签: javascript scroll touch hammer.js