【发布时间】:2018-08-17 02:39:24
【问题描述】:
我有一些 JavaScript 来处理网页上的触摸事件并观察主要是水平的手势。当用户开始水平滑动时,我希望他们的手势效果开始,但是当他们垂直滑动时,页面应该自然滚动。
虽然现在水平手势确实获得了预期的效果,但它们似乎仍然会导致垂直滚动触摸向上或向下移动的量,即使大部分移动是水平的。当主要水平滑动时,我将如何解决此问题以防止垂直滚动?我同时使用了preventDefault() 和stopPropagation() 都没有效果。我想我错过了一些非常明显的东西,但我似乎找不到它。
我已尽力搜索类似问题,但我的搜索查询尚未返回 anything that works。
注意:我不想完全停止垂直滚动,即使手势中的 X 值发生变化,如果 Y 变化更大,页面仍应滚动。如果 X 变化大于 Y 变化(这是我的代码现在应该做的),我只希望垂直滚动锁定。
更新:我没想过要从移动设备检索控制台日志记录。在@tushar-shukla 的建议下,我检查了它,发现以下错误:
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See <URL>
这是我的代码(和a JSFiddle, if that's more your cup of tea)的淡化版本:
var startX = undefined;
var startY = undefined;
function touchmove(ev) {
var e = ev.originalEvent;
// Set the initial start position if not already. Could also be done on touchstart
if (startX===undefined) { startX=e.touches[0].pageX; }
if (startY===undefined) { startY=e.touches[0].pageY; }
// Calculate the change or displacement from the start.
changeX = e.touches[0].pageX-startX;
changeY = e.touches[0].pageY-startY;
// If the change horizontally is greater than the change vertically...
if (Math.abs(changeX)>Math.abs(changeY)) {
// Do something with the gesture
// Prevent vertical scrolling; Apparently this isn't doing it:
ev.preventDefault();
ev.stopPropagation();
e.preventDefault();
e.stopPropagation();
}
}
$(document).on("touchmove",touchmove);
【问题讨论】:
标签: javascript jquery