移动端的网页,怎么很好的把滑动事件和点击事件区别开

 我来答
福喜900
推荐于2017-05-19 · TA获得超过6.1万个赞
知道大有可为答主
回答量:1.1万
采纳率:0%
帮助的人:1亿
展开全部
以前写过一个库,研究过这一问题(当然产品环境下还是用现成的解决方案比较好)

也看过成熟解决方案的代码

很简单,记录位移,任意方向超过 10 就不是 tap 了。

某一方向 超过 30 就是 swipe,如果在 swipe 之前竖直方向位移大於 10 就判定为 scroll

如果进入 swipe 状态,就 preventDefault

如果时间超过一个数值(具体多少忘了,好象是 750?)就不是 swipe 了,或者也可以直接触发 swipe 事件。

只找到了更早的 touch 库(刚开始 iOS 开发的时候写的),部分代码:

var Touchable = function() {

function Touchable(target) {
var self = this;

function Touch(touch) {
this.x = touch.pageX;
this.y = touch.pageY;
}

EventEmitter.call(self);

self.el = El.from(target);
self.touches = {};

attach(self, self.el);

self.on({
touchstart: function(e) {
log("touchstart");
// log(e);

forEach(e.changedTouches, function(touch) {
capture(self, touch);

// log(touch);
});

},
touchmove: function(e) {
forEach(e.changedTouches, function(touch) {
var ot = self.touches[touch.identifier];

if (!ot)
return;

var t = new Touch(touch);

var dx = t.x - ot.x,
dy = t.y - ot.y;

if (ot.isSwipe === undefined && Math.abs(dy) > 10) {
ot.isSwipe = false;
ot.isScrolling = true;

self.emit("touchscrollstart", e);
} else if (ot.isSwipe === undefined && Math.abs(dy) < 10 && Math.abs(dx) > 30) {
e.preventDefault();

ot.isSwipe = true;
} else if (Math.abs(dy) > 30) {
ot.isSwipe = false;
}
});
},
touchend: function(e) {
log("touchend");
// log(e);

// log(self.touches);

forEach(e.changedTouches, function(touch) {
var ot = self.touches[touch.identifier];

if (!ot)
return;

var t = new Touch(touch);

log(ot);
log(t);

var dx = t.x - ot.x,
dy = t.y - ot.y;

if (Math.abs(dx) < 10 && Math.abs(dy) < 10)
self.emit("touchtap", e);
else if (ot.isSwipe)
self.emit("touchswipe", e);
else if (ot.isScrolling)
self.emit("touchscrollend", e);

uncapture(self, touch);
});

// log(self.touches);
},
touchcancel: function(e) {
log("touchcancel");
// log(e);

forEach(e.changedTouches, function(touch) {
uncapture(self, touch);

// log(touch);
});
}
});

function forEach(a, f) {
Array.prototype.forEach.call(a, f);
}

function capture(self, touch) {
var id = touch.identifier;

var t = new Touch(touch);

self.touches[id] = t;
}

function uncapture(self, touch) {
var id = touch.identifier;

delete self.touches[id];
}
}

Touchable.prototype = Object.create(EventEmitter.prototype, Obj.descriptor({
constructor: Touchable
}));

function attach(self, el) {
"touchstart touchmove touchend touchcancel".split(" ").forEach(function(x) {
self.el.on(x, function(e) {
self.emit(x, e);
});
});
}

function setPush(set, element) {
if (set.indexOf(element) === -1)
set.push(element);
}

return Touchable;
}();
旧代码很烂,见谅。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式