zbo2018
1/8/2019 - 10:20 AM

mousedown\mouseup\click事件关系

拖拽动作,不触发点击事件 拖动与点击事件冲突解决

拖动与点击事件冲突解决

问题:
	有些用户的鼠标非常灵敏,点击的时候会偏移。出现轻微的拖拽操作
思路1:
	点击到移动的时间间隔< 150ms: 点击事件
	点击到移动的时间间隔>=150ms: 拖拽事件
解决办法:
	mousedown时记录时间t1全局变量,
	mousemove时记录时间t2局部变量,
	mouseup时记录时间t3局部变量,
	mousemove中
		if(t2-t1<150)属于点击:不执行操作
		if(t2-t1>=150)属于拖拽:执行拖拽中逻辑
	mouseup中
		if(t3-t1<150)属于点击:执行点击逻辑
		if(t3-t1>=150)属于拖拽:执行拖拽逻辑
		重置t1全局变量
	
思路2:
	点击与移动的像素距离< 7:点击事件
	点击与移动的像素距离>=7:拖拽事件
解决办法:
	mousedown时记录下鼠标的位置x1,y1全局变量
	mousemove时记录下鼠标的位置x2,y2局部变量
	mouseup时记录下鼠标的位置x3,y3局部变量
	判断两次位置--是否一样或是相差小于一个定值(设为7px):
	d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
	d = Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3))
	当d=0或是小于7时,认定用户没有拖拽。属于点击
	当d>=7时,认定用户有拖拽。属于拖拽
	mousemove中
		if(d==0||d<7)属于点击:不执行操作
		if(d>=7)属于拖拽:执行拖拽中逻辑
	mouseup中
		if(d==0||d<7)属于点击:执行点击逻辑
		if(d>=7)属于拖拽:执行拖拽逻辑
		重置x1,y1全局变量
存在的问题:
	某些框架只有鼠标在图形元素上时才触发mousemove事件。
	当图形元素很小或是一条线时,鼠标很容易移出元素。不再触发mousemove、mouseup
	导致通过距离无法判断是哪种操作。
页面上点击一个元素,最少三个事件会被触发,事件发生顺序:
1、mousedown,按下鼠标键的时候
2、mouseup,松开鼠标键的时候
3、click,当一个mousedown和一个mouseup都在这个元素上被检测到的时候发生

功能:
  元素上同时绑定:鼠标点击、拖拽事件
要求:
	拖拽的时候不执行点击逻辑!
分析:
	希望拖拽动作后,不触发点击事件,单纯绑定click事件是不行的!
	可以使用mousedown、mousemove、mouseup来描述拖拽和鼠标点击事件。
	mousedown-mousemove-mouseup,为拖拽事件;
	mousedown-mouseup,为点击事件。
解决:
	通过flag判断是不是进行了move操作,一旦进行则mouseup中的函数体不执行即可,代码如下:
		
var ifDrag = false;
map.addEventListener("mousedown", function () {
	ifDrag = false;
})
map.addEventListener("mousemove", function () {
	ifDrag = true;
})
map.addEventListener("mouseup", function (type, evt) {
	//判断是否有拖拽动作
	if (ifDrag) {
		//拖拽逻辑
	}else {
		 //点击逻辑
	}
})