我有一个mootools拖动窗口在桌面计算机上运行良好,我发现this回答有关如何使mootools拖动支持触摸事件。
当我拖动移动设备(IOS)并应用Class.refactor
时,也会触发滚动事件。因此可拖动的窗口移动,屏幕同时滚动。
问题:有什么方法可以在拖动事件“移动”时禁用/暂停滚动?或当鼠标/触摸位于拖动div区域内时?
小提琴示例here
我的代码(使用mootools 1.3.2)
答案:
document.getElement('.dragme').ontouchmove = function() {event.preventDefault();}
(以下答案中的解释)
HTML:
<div class="container">
<div class="dragme">drag me</div>
</div>
JS:
Class.refactor(Drag.Move,
{
attach: function(){
this.handles.addEvent('touchstart', this.bound.start);
return this.previous.apply(this, arguments);
},
detach: function(){
this.handles.removeEvent('touchstart', this.bound.start);
return this.previous.apply(this, arguments);
},
start: function(event){
document.body.addEvents({
touchmove: this.bound.check,
touchend: this.bound.cancel
});
this.previous.apply(this, arguments);
},
check: function(event){
if (this.options.preventDefault) event.preventDefault();
var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
if (distance > this.options.snap){
this.cancel();
this.document.addEvents({
mousemove: this.bound.drag,
mouseup: this.bound.stop
});
document.body.addEvents({
touchmove: this.bound.drag,
touchend: this.bound.stop
});
this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
}
},
cancel: function(event){
document.body.removeEvents({
touchmove: this.bound.check,
touchend: this.bound.cancel
});
return this.previous.apply(this, arguments);
},
stop: function(event){
document.body.removeEvents({
touchmove: this.bound.drag,
touchend: this.bound.stop
});
return this.previous.apply(this, arguments);
}
});
new Drag.Move(document.getElement('div.container'), {
handle: document.getElement('.dragme'),
modifiers: {
x: 'margin-left',
y: 'margin-top'
}
});
答案 0 :(得分:1)
为onTouchMove
添加一个除event.preventDefault
之外什么都不做的事件处理程序 - 它应该停止滚动/缩放/捏合的东西。您可以在this.bound
回调中添加此内容并附加到document.body或实际的可拖动元素。