前言

移动端事件主要有触摸、滑动、点击、拖拽、双击、旋转、放大缩小,下面主要会介绍前三种事件。

触摸

  • touchstart:手指触摸到屏幕会触发
  • touchmove:当手指在屏幕上移动时,会触发
  • touchend:当手指离开屏幕时,会触发
  • touchcancel:可由系统进行的触发,比如手指触摸屏幕的时候,突然alert了一下,或者系统中其他打断了touch的行为,则可以触发该事件

swipe类滑动事件

  • swipe:手指在屏幕上滑动时会触发
  • swipeLeft:手指在屏幕上向左滑动时会触发
  • swipeRight:手指在屏幕上向右滑动时会触发
  • swipeUp:手指在屏幕上向上滑动时会触发
  • swipeDown:手指在屏幕上向下滑动时会触发

点击事件

tap

  • 标准事件中没有tap事件,tap事件是zepto,使用touch进行封装的
  • tap: 手指碰一下屏幕会触发
  • longTap: 手指长按屏幕会触发
  • singleTap: 手指碰一下屏幕会触发
  • doubleTap: 手指双击屏幕会触发

click

  • 移动端的click有300ms延迟的问题,在移动端浏览器中,连续两次点击是缩放操作,所以在用户点击屏幕后,浏览器会检查在300ms内是否有另一次点击,如果没有则触发click事件。因为有延迟,所以尽量不使用click做为点击事件
  • 可以使用touchstart代替点击事件,但前提是同一对象上不能同时绑定一个单击事件和一个滑动事件

点透问题

  • 原因 当一个用户在点击屏幕的时候,系统会触发touch事件和click事件,touch事件优先处理,touch事件经过 捕获,处理, 冒泡 一系列流程处理完成后, 才回去触发click事件
  • 场景 tap和click不能混用 A 和 B不是后代继承关系(如果是后代继承关系的话,就直接是冒泡子类的话题了) A发生touch, A touch后立即消失, B事件绑定click A z-index大于B,即A显示在B浮层之上
  • 解决方案 可以touch阶段取消掉系统触发的click事件,也可以让消失的元素延迟200-300ms

    HTML代码 HTML codes

<body>
    <div>
        <div id="A">
        </div>
        <div id="B">
        </div> 
    </div>
</body>
<script type="text/javascript">
var A = document.getElementById("A");
var B = document.getElementById("B");
A.addEventListener('touchstart', function(e) {
    A.style.display = 'none';
});
A.addEventListener('touchend', function(e) {
    e.preventDefault();
});
B.onclick = function() {
    console.log('兄弟元素B被点击了');
}
</script>

results matching ""

    No results matching ""