我正在尝试使用拖动来回移动div。这部分工作正常,直到div具有可滚动的内容。由于滚动条,这在桌面上不是问题,但触摸设备上会出现问题。由于触摸事件与拖动事件冲突,我无法滚动内容。我试图创建一个条件来检测拖动是否比垂直更水平..
我希望在垂直触摸交互期间阻止拖动,但UI拖动方法仍会触发并覆盖触摸事件。我正在使用touch-punch插件在触摸设备上进行可拖动的工作,所以也许那里的东西使情况变得复杂。如果我可以阻止UI拖动方法完全触发直到满足水平拖动条件,那将是很好的。我认为这可以消除干扰。
// note the condition inside the drag function
start: function(e){
// get starting point of the drag
startDragX = e.pageX;
startDragY = e.pageY;
},
drag: function(e, ui){
// prevent drag until user has moved 30px horizontally
if (Math.abs(e.pageX - startDragX) < 30){
ui.position.left = 0;
} else {
if (ui.position.left < 0) {
// left drag
ui.position.left = ui.position.left + 30;
} else {
// right drag
ui.position.left = ui.position.left - 30;
}
}
}
这是一个演示问题的小提琴(触摸设备上的测试):http://jsfiddle.net/jTMxS/2/
答案 0 :(得分:3)
我遇到了完全相同的问题,经过大量谷歌搜索后,我在这里找到了解决方案:
Drag & Drop on IPad Web App - while remaining Scroll functionality
所以看看那里的正确答案以及他们提到的那段代码(实际上是在其他问题中)。我确实删除了event.preventDefault()
行,因为在我的情况下我不想丢失滚动行为。希望这会有所帮助。
编辑根据Chris的评论,我将在此处包含我的解决方案的详细信息。我为这两个功能替换了触摸打孔插件:
var init = function() {
document.addEventListener('touchstart', handler, true);
document.addEventListener('touchmove', handler, true);
document.addEventListener('touchend', handler, true);
document.addEventListener('touchcancel', handler, true);
};
var handler = function(event) {
var touch = event.changedTouches[0],
simulatedEvent = document.createEvent('MouseEvent');
simulatedEvent.initMouseEvent(
{ touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup' } [event.type],
true, true, window, 1,
touch.screenX, touch.screenY, touch.clientX, touch.clientY,
false, false, false, false, 0, null);
touch.target.dispatchEvent(simulatedEvent);
};
文档就绪时需要调用init
函数。
答案 1 :(得分:0)
你试过这个吗?
(element).ontouchstart = function(e){
e.preventDefault();
}
我已经使用上述内容来阻止使用触摸在Web应用上进行整体滚动。
或者你可以使用Kuo.js,hammer.js等将拖动绑定到另一个手势,如2手指等。