移动端300ms延迟事件响应

kelen|2016-10-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);
});