移动端300ms延迟事件响应

by: kelen / 2017-04-06


移动端涉及到的触摸操作比较复杂,所以在设计上,移动端浏览器会在 touchendclick 之间有300ms左右的延迟间隔来判断用户是单击还是双击屏幕,所以在移动端浏览器经常看到,我们可以双击屏幕来放大显示的范围,但是在开发中,我们要消除这些延迟,所以总结了一下几个方法

情景再现,运行下面代码,要在移动端预览,可以看出平均延迟在200ms左右

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8">	
	<style type="text/css">
		#div1 {
			width: 50px;
			height: 50px;
			line-height: 50px;
			border: 1px solid #333;
		}
	</style>
</head>
<body>
<div id="div1">click</div>
<h3 id="timeTxt"></h3>
<script type="text/javascript">
	var div1 = document.getElementById("div1");
	var timeTxt = document.getElementById("timeTxt");
	var last;
	div1.addEventListener("touchend", function() {
		last = +new Date();
	})
	div1.addEventListener("click", function() {
		timeTxt.innerText = +new Date() - last + "ms";
	})
</script>
</body>
</html>

meta标签

在头部添加以下meta标签,禁止网页缩放

<meta name="viewport" content="width=device-width">

touch-action属性 

利用css3的touch-action属性,他的作用是防止你的双击行为,缺点就是兼容性不高

html {
  -ms-touch-action: manipulation; // ie10
  touch-action: manipulation;
}

利用第三方库

fastclick这个基本用在移动端浏览器来取消这300ms的延迟操作,用起来十分方便,大小只有几k,地址:fastclick,使用方法如下

if ('addEventListener' in document) {
	document.addEventListener('DOMContentLoaded', function() {
		FastClick.attach(document.body);
	}, false);
}

// jquery用法
$(function() {
	FastClick.attach(document.body);
});