Vue 精简手势库

function vueTouch(el, binding, type) {
	var _this = this;
	this.obj = el;
	this.binding = binding;
	this.touchType = type;
	this.vueTouches = {
		x: 0,
		y: 0
	};
	this.vueMoves = true;
	this.vueLeave = true;
	this.longTouch = true;

	this.vueCallBack = typeof(binding.value) == "object" ? binding.value.fn : binding.value;

	this.obj.addEventListener("touchstart", function(e) {
		_this.start(e);
	}, false);

	this.obj.addEventListener("touchmove", function(e) {
		_this.move(e);
	}, false);

	this.obj.addEventListener("touchend", function(e) {
		_this.end(e);
	}, false);
};
vueTouch.prototype = {
	start(e) {
		this.vueMoves = true;
		this.vueLeave = true;
		this.longTouch = true;
		this.vueTouches = {
			x: e.changedTouches[0].pageX,
			y: e.changedTouches[0].pageY
		};
		this.time = setTimeout(function() {
			if(this.vueLeave && this.vueMoves) {
				this.touchType == "longtap" && this.vueCallBack(this.binding.value, e);
				this.longTouch = false;
			};
		}.bind(this), 1000);
	},
	end(e) {
		var disX = e.changedTouches[0].pageX - this.vueTouches.x;
		var disY = e.changedTouches[0].pageY - this.vueTouches.y;
		clearTimeout(this.time);
		if(Math.abs(disX) > 10 || Math.abs(disY) > 100) {
			this.touchType == "swipe" && this.vueCallBack(this.binding.value, e);
			if(Math.abs(disX) > Math.abs(disY)) {
				if(disX > 10) {
					this.touchType == "swiperight" && this.vueCallBack(this.binding.value, e);
				};
				if(disX < -10) {
					this.touchType == "swipeleft" && this.vueCallBack(this.binding.value, e);
				};
			} else {
				if(disY > 10) {
					this.touchType == "swipedown" && this.vueCallBack(this.binding.value, e);
				};
				if(disY < -10) {
					this.touchType == "swipeup" && this.vueCallBack(this.binding.value, e);
				};
			};
		} else {
			if(this.longTouch && this.vueMoves) {
				this.touchType == "tap" && this.vueCallBack(this.binding.value, e);
				this.vueLeave = false
			};
		};
	},
	move(e) {
		this.vueMoves = false;
	}
};

Vue.directive("tap", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "tap");
	}
});
Vue.directive("swipe", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "swipe");
	}
});
Vue.directive("swipeleft", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "swipeleft");
	}
});
Vue.directive("swiperight", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "swiperight");
	}
});
Vue.directive("swipedown", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "swipedown");
	}
});
Vue.directive("swipeup", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "swipeup");
	}
});
Vue.directive("longtap", {
	bind: function(el, binding) {
		new vueTouch(el, binding, "longtap");
	}
});
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值