我正在尝试仅使用纯 javascript#drag
将 div ( ) 拖动到其父 ( #container
) 中。(只需要在 iPad 上工作)。
我编写了一个脚本,当我在打开“模拟触摸事件”的情况下在 Chrome 中使用它时运行良好,
但在真正的 iPad 上,只要我开始快速拖动 div 就会停止跟随。
我认为当我移动得太快时我的手指可能会离开元素,
所以我将 设置addEventListner
在 body 上而不是 div 上,但还是一样。
有人知道为什么吗?以及如何让它在 iPad 上流畅运行?
演示:http: //jsfiddle.net/kxrEZ/
Javascript
var dom = {
container: document.getElementById("container"),
drag: document.getElementById("drag"),
}
var container = {
x: dom.container.getBoundingClientRect().left,
y: dom.container.getBoundingClientRect().top,
w: dom.container.getBoundingClientRect().width,
h: dom.container.getBoundingClientRect().height
}
var drag = {
w: dom.drag.offsetWidth,
h: dom.drag.offsetHeight
}
target = null;
document.body.addEventListener('touchstart', handleTouchStart, false);
document.body.addEventListener('touchmove', handleTouchMove, false);
document.body.addEventListener('touchend', handleTouchEnd, false);
function handleTouchStart(e) {
if (e.touches.length == 1) {
var touch = e.touches[0];
target = touch.target;
}
}
function handleTouchMove(e) {
if (e.touches.length == 1) {
if(target === dom.drag) {
moveDrag(e);
}
}
}
function handleTouchEnd(e) {
if (e.touches.length == 0) { // User just took last finger off screen
target = null;
}
}
function moveDrag(e) {
var touch = e.touches[0];
var posX = touch.pageX - container.x - drag.w / 2;
var minX = 0;
var maxX = container.w - drag.w;
if(posX < minX) {posX = minX;}
else if(posX > maxX) {posX = maxX;}
var posY = touch.pageY - container.y - drag.h / 2;
var minY = 0;
var maxY = container.h - drag.h;
if(posY < minY) {posY = minY;}
else if(posY > maxY) {posY = maxY;}
dom.drag.style.left = posX + "px";
dom.drag.style.top = posY + "px";
}