当前位置: 首页 > 工具软件 > Curtain.js > 使用案例 >

JavaScript-touch事件及vue的v-touch插件

雍阳
2023-12-01

touch事件

开始的触摸事件touchstart、touchmove和touchend是ios版Safari浏览器为了向开发人员传达一些信息新添加的事件。因为ios设备既没有鼠标也没有键盘,所以在为移动Safari浏览器开发交互性网页的时候,PC端的鼠标和键盘事件是不够用的。

在iPhone 3Gs发布的时候,其自带的移动Safari浏览器就提供了一些与触摸(touch)操作相关的新事件。随后,Android上的浏览器也实现了相同的事件。触摸事件(touch)会在用户手指放在屏幕上面的时候、在屏幕上滑动的时候或者是从屏幕上移开的时候出发。下面具体说明:

touchstart事件:当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发。

touchmove事件:当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间,调用preventDefault()事件可以阻止滚动。

touchend事件:当手指从屏幕上离开的时候触发。

touchcancel事件:当系统停止跟踪触摸的时候触发。关于这个事件的确切出发时间,文档中并没有具体说明,咱们只能去猜测了。

以上事件都会产生冒泡,也都可以取消。虽然这些触摸事件没有在DOM规范中定义,但是它们却是以兼容DOM的方式实现的。所以,每个触摸事件的event对象都提供了在鼠标实践中常见的属性:bubbles(起泡事件的类型)、cancelable(是否用 preventDefault() 方法可以取消与事件关联的默认动作)、clientX(返回当事件被触发时,鼠标指针的水平坐标)、clientY(返回当事件触发时,鼠标指针的垂直坐标)、screenX(当某个事件被触发时,鼠标指针的水平坐标)和screenY(返回当某个事件被触发时,鼠标指针的垂直坐标)。除了常见的DOM属性,触摸事件还包含下面三个用于跟踪触摸的属性。

touches:表示当前跟踪的触摸操作的touch对象的数组。

targetTouches:特定于事件目标的Touch对象的数组。

changeTouches:表示自上次触摸以来发生了什么改变的Touch对象的数组。

每个Touch对象包含的属性如下:

  • clientX:触摸目标在视口中的x坐标。
  • clientY:触摸目标在视口中的y坐标。
  • identifier:标识触摸的唯一ID。
  • pageX:触摸目标在页面中的x坐标。
  • pageY:触摸目标在页面中的y坐标。
  • screenX:触摸目标在屏幕中的x坐标。
  • screenY:触摸目标在屏幕中的y坐标。
  • target:触目的DOM节点目标。
function load (){  
   
    document.addEventListener('touchstart',touch, false);  
    document.addEventListener('touchmove',touch, false);  
    document.addEventListener('touchend',touch, false);  
       
    function touch (event){  
        var event = event || window.event;    
        var oInp = document.getElementById("inp");  
   
        switch(event.type){  
            case "touchstart":  
                oInp.innerHTML = "Touch started (" + event.touches[0].clientX + "," + event.touches[0].clientY + ")";  
                break;  
            case "touchend":  
                oInp.innerHTML = "<br>Touch end (" + event.changedTouches[0].clientX + "," + event.changedTouches[0].clientY + ")";  
                break;  
            case "touchmove":  
                event.preventDefault();  
                oInp.innerHTML = "<br>Touch moved (" + event.touches[0].clientX + "," + event.touches[0].clientY + ")";  
                break;  
        }      
    }  
}  
window.addEventListener('load',load, false);  

上面的小例子。当touchstart事件触发的时候,会将触摸的位置更新到div标签中。当touchmove事件触发的时候,会默认行为的滚动(触摸移动的默认行为是滚动页面),然后触摸操作的变化信息更新到div标签中。而touchend事件会输出有关触摸操作的最终信息。

注意 : 在touchend事件触发的时候,touches集合中就没有任何Touch对象了,因为不存在活动的触摸操作。

这些事件会在文档的所有元素上面触发,因而可以分别操作页面的不同部分。在触摸屏幕上的元素,这些事件(包括鼠标事件)发生的顺序如下:

  1. touchstart
  2. mouseover
  3. mousemove(一次)
  4. mousedown
  5. mouseup
  6. click
  7. touchend

通过原生js监听touch事件

// 监听触摸方向
var EventUtil = {
    addHandler: function (element, type, handler) {
        if (element.addEventListener)
            element.addEventListener(type, handler, false);
        else if (element.attachEvent) element.attachEvent("on" + type, handler);
        else element["on" + type] = handler;
    },
    removeHandler: function (element, type, handler) {
        if (element.removeEventListener)
            element.removeEventListener(type, handler, false);
        else if (element.detachEvent) element.detachEvent("on" + type, handler);
        else element["on" + type] = handler;
    },
    /**
     * @param target 要绑定监听的目标元素
     * @param isPreventDefault 是否屏蔽掉触摸滑动的默认行为(例如页面的上下滚动,缩放等)
     * @param upCallback 向上滑动的监听回调(若不关心,可以不传,或传false)
     * @param rightCallback 向右滑动的监听回调(若不关心,可以不传,或传false)
     * @param downCallback 向下滑动的监听回调(若不关心,可以不传,或传false)
     * @param leftCallback 向左滑动的监听回调(若不关心,可以不传,或传false)*/
    listenTouchDirection: function (target, isPreventDefault, upCallback, rightCallback, downCallback, leftCallback) {
        this.addHandler(target, "touchstart", handleTouchEvent);
        this.addHandler(target, "touchend", handleTouchEvent);
        this.addHandler(target, "touchmove", handleTouchEvent);
        var startX;
        var startY;
 
        function handleTouchEvent(event) {
            switch (event.type) {
                case "touchstart":
                    startX = event.touches[0].pageX;
                    startY = event.touches[0].pageY;
                    break;
                case "touchend":
                    var spanX = event.changedTouches[0].pageX - startX;
                    var spanY = event.changedTouches[0].pageY - startY;
                    if (Math.abs(spanX) > Math.abs(spanY)) { //认定为水平方向滑动
                        if (spanX > 30) { //向右
                            if (rightCallback) {
                                rightCallback();
                                console.log("right");
                            }
 
                        } else if (spanX < -30) { //向左
                            if (leftCallback) {
                                leftCallback();
                                console.log("left");
                            }
                        }
                    } else { //认定为垂直方向滑动
                        if (spanY > 30) { //向下
                            if (downCallback) {
                                downCallback();
                                console.log("down");
                            }
                        } else if (spanY < -30) {//向上
                            if (upCallback) {
                                upCallback();
                                console.log("up");
                            }
                        }
                    }
                    break;
                case "touchmove": //阻止默认行为
                    if (isPreventDefault) event.preventDefault();
                    break;
            }
        }
    }
};
//使用的时候很简单,只需要向下面这样调用即可
// 其中下面监听的是整个DOM
// up, right, down, left为四个回调函数,分别处理上下左右的滑动事件
EventUtil.listenTouchDirection(document, true, up, right, down, left);

v-touch

安装

npm install vue-touch@next --save
// main.js中引入:
import VueTouch from 'vue-touch'
// 全局使用
Vue.use(VueTouch, {name: 'v-touch'})

用法

<template>
  <v-touch @swipeleft="swiperleft" @swiperight="swiperright">
      <img class="device-icon" :src="this.offline ? offlineIcon : backgroundIcon" :style="{'margin-top':this.offline ? '60px' : '20px'}" />
    </v-touch>
</template>
export default {
  name: 'curtain1',
  mixins: [DeviceCurtain],
  data() {
    return {
      curtainTab: true,
    }
  },
  methods: {
    swiperleft() {
      if (this.offline) {
        return
      }
      this.curtainTab = false
    },
    swiperright() {
      if (this.offline) {
        return
      }
      this.curtainTab = true
    },
  },
}
 类似资料: