移动端事件

移动端事件类型

事件名称描述 包含touches数组

事件名称描述包含touches数组
touchstart当用户在触摸平面上放置了一个触点时触发。事件的目标 element 将是触点位置上的那个目标 element
touchmove当用户在触摸平面上移动触点时触发。事件的目标 element 和这个 touchmove 事件对应的 touchstart 事件的目标 element 相同,哪怕当 touchmove 事件触发时,触点已经移出了该 element 。
touchend当一个触点被用户从触摸平面上移除(当用户将一个手指离开触摸平面)时触发。当触点移出触摸平面的边界时也将触发。例如用户将手指划出屏幕边缘。已经被从触摸平面上移除的触点,可以在 changedTouches 属性定义的 TouchList 中找到。
touchenter当触点进入某个 element 时触发。此事件没有冒泡过程。
touchleave当触点离开某个 element 时触发。此事件没有冒泡过程。
touchcancel当触点由于某些原因被中断时触发。有几种可能的原因如下(具体的原因根据不同的设备和浏览器有所不同):由于某个事件取消了触摸:例如触摸过程被一个模态的弹出框打断。触点离开了文档窗口,而进入了浏览器的界面元素、插件或者其他外部内容区域。当用户产生的触点个数超过了设备支持的个数,从而导致 TouchList 中最早的 Touch 对象被取消。

PC端事件和移动端事件的区别

通过on的方式添加touch事件在谷歌模拟器下无效
通过on的方式添加事件会前后覆盖
鼠标事件在移动端可以使用,但有300毫秒的延迟

点击事件为什么会有延迟

  移动浏览器为什么会设置300毫秒的等待时间呢?这与双击缩放的方案有关。平时我们有可能已经注意到了,双击缩放,即用手指在屏幕上快速点击两次,可以看到内容或者图片放大,再次双击,浏览器会将网页缩放至原始比例。

  浏览器捕获第一次单击后,会先等待一段时间,如果在这段时间区间里用户未进行下一次点击,则浏览器会做单击事件的处理。如果这段时间里用户进行了第二次单击操作,则浏览器会做双击事件处理。这段时间就是上面提到的300毫秒延迟
var div = document.getElementsByTagName("div")[0];
       div.addEventListener("touchstart", function() {
           console.log("触摸开始事件");
       });
       div.addEventListener("click", function() {
           console.log("这是一个普通的点击事件");
       });
       div.addEventListener("touchend", function() {
           console.log("触摸结束事件") 
       });

在这里插入图片描述

如何避免延迟

方法一:静止缩放

<meta name="viewport" content="width=device-width user-scalable= 'no'">
  使用这个方法必须完全禁用缩放来达到目的,虽然大部分移动端能解决这个延迟问题,但是部分苹果手机还是不行。

方法二:fastclick.js

  FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。简而言之,FastClick 在检测到touchend事件的时候,会通过 DOM 自定义事件立即触发一个模拟click事件,并把浏览器在 300 毫秒之后真正触发的click事件阻止掉。使用方法如下。

  第一步:在页面中引入fastclick.js文件。
  第二步:在js文件中添加以下代码
  在 window load 事件之后,在body上调用FastClick.attach()即可。
window.addEventListener(function(){ 
    FastClick.attach( document.body );
},false );

如果你项目使用了JQuery,就将上面的代码改写成:

$(function() {  
    FastClick.attach(document.body);  
});

方法三:使用touchmove模拟

点击事件一定会触发触摸开始和触摸结束事件( 触摸开始和结束之间可能还有触摸移动是事件)
如果出触发触摸移动那么就不是点击事件
没有触发触摸移动事件 那么就是点击事件

var div = document.getElementsByTagName("div")[0];
        div.addEventListener("touchstart", function() {
            console.log("触摸开始事件");
        });
        div.addEventListener("click", function() {
            console.log("这是一个普通的点击事件");
        });
        var isMove = false;
        div.addEventListener("touchmove", function() {
            console.log("触摸滑动事件");
            isMove = true;
        });
        div.addEventListener("touchend", function() {
            console.log("触摸结束事件");
            if (!isMove) {
                console.log("这是一个模拟的点击事件");
            }
            isMove = false;
        });
移动端双指事件通常是用于实现缩放或者旋转操作的,常见的事件touchstart、touchmove、touchend等。以下是一些常用的双指事件: 1. touchstart事件 当有两个手指同时放在屏幕上时,会触发touchstart事件。此时可以通过e.touches来获取所有手指的信息,如下所示: ```javascript document.addEventListener('touchstart', function(e) { if (e.touches.length === 2) { // 获取第一个手指的坐标 var x1 = e.touches[0].clientX; var y1 = e.touches[0].clientY; // 获取第二个手指的坐标 var x2 = e.touches[1].clientX; var y2 = e.touches[1].clientY; // 其他操作 } }, false); ``` 2. touchmove事件 当两个手指在屏幕上移动时,会触发touchmove事件。此时可以通过e.touches来获取所有手指的信息,如下所示: ```javascript document.addEventListener('touchmove', function(e) { if (e.touches.length === 2) { // 获取第一个手指的坐标 var x1 = e.touches[0].clientX; var y1 = e.touches[0].clientY; // 获取第二个手指的坐标 var x2 = e.touches[1].clientX; var y2 = e.touches[1].clientY; // 其他操作 } }, false); ``` 3. touchend事件 当两个手指中的任意一个离开屏幕时,会触发touchend事件。此时可以通过e.touches来获取所有手指的信息,如下所示: ```javascript document.addEventListener('touchend', function(e) { if (e.touches.length === 1) { // 只有一个手指,可以进行单指操作 } }, false); ``` 通过以上三个事件,我们可以实现双指操作的各种需求,比如缩放、旋转等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值