• touch事件


    原生写法:

    document.getElementById("id").addEventListener("touchstart",function(e)
    {
        var _x=e.touches[0].pageX;
        var _y=e.touches[0].pageY;
        console.log("start",_x)
    })
    document.getElementById("id").addEventListener("touchmove",function(e)
    {
        var _x=e.touches[0].pageX;
        var _y=e.touches[0].pageY;
        console.log("move",_x)
    })
    document.getElementById("id").addEventListener("touchend",function(e)
    {
        var _x=e.changedTouches[0].pageX;
        var _y=e.changedTouches[0].pageY;
        console.log("end",_x)
    })

    JQuery写法:

    $('#id').on('touchstart',function(e) {
        var _touch = e.originalEvent.targetTouches[0];
        var _x= _touch.pageX;
    });

    $('#id').on('touchmove',function(e) {
        var _touch = e.originalEvent.targetTouches[0];
        var _x= _touch.pageX;
    });

    $('#id').on('touchend',function(e) {
        var _touch = e.originalEvent.changedTouches[0];
        var _x= _touch.pageX;
    }

    1、touch事件的回调参数event有targetTouches,touches以及changedTouches三个手指对象列表,如果是用JQuery进行绑定,则三个对象列表包含在回调函数event参数的originalEvent属性里面。

    2、touchend事件中只有一个changedTouches触摸实例列表,而没有其他两个。

    3、touchmove 是按一定的时间频率触发的,不同的浏览器可能触发频率不一样。

    4、touchcancel事件,它是在touchmove事件被中断的时候被触发,比如,你在touchmove事件中写个弹窗,这个事件就是被中断,这样touchcancel就会被触发。

    三个手指对象列表存储了触摸事件的位置等等属性,类似于鼠标事件:

    touches是在屏幕上的所有手指列表;所以当手指移开触发touchend事件时,此时的手指已经不在当屏幕上,所以event是没有touches这个手指列表的。

    targetTouches是当前DOM上的手指列表;所以当手指移开触发touchend事件时,此时的手指不一定在当前DOM对象上,所以event是没有targetTouches这个手指列表的。

    changedTouches列表是涉及当前事件的手指列表,例如touchend事件中,移开的手指的列表,没有移开的不包含。

    这三个列表都包含下面的属性:

    identifier:标识触摸的唯一ID。

    target:触目的DOM节点目标。

    clientX:触摸目标在视口中的x坐标。

    clientY:触摸目标在视口中的y坐标。

    pageX:触摸目标在页面中的x坐标。

    pageY:触摸目标在页面中的y坐标。

    screenX:触摸目标在屏幕中的x坐标。

    screenY:触摸目标在屏幕中的y坐标。

    radiusX/radiusY/rotationAngle:画出大约相当于手指形状的椭圆形,分别为椭圆形的两个半径和旋转角度。目前浏览器一般不支持这3个值

    移动到屏幕边界的问题:

    touchmove在移动过程中如果移动到移动设备的边界,touchend事件在不指定的情况下是不会执行的,当你再次触摸一下屏幕才会被触发。

    对于触发超出了边界,可以这样处理:

    var body = document.querySelector('body');

    var pk = document.body.scrollWidth;
    var pg = document.body.scrollHeight;

    var pointX,pointY,targetX,targetY;

    body.addEventListener('touchstart', function(e){
             pointX = e.touches[0].pageX;
             pointX = e.touches[0].pageX;
    }, false);

    body.addEventListener('touchmove', function(e){
             targetX = e.targetTouches[0].pageX;
             targetY = e.targetTouches[0].pageY;

    if( targetX<=0 || target>=pk || targetY<=0 || targetY>=pg ){

    body.ontouchend();

    }
    }, false);

    body.ontouchend = function(){

    alert("超出边界啦");

    }

    body.addEventListener('touchend', function(e){
    alert("触摸停止");
    }, false);

    这里通过给节点绑定触发停止事件,在touchmove里面判断触摸点是否超出边界,如果超出,执行绑定停止事件。

    touch使用实例:

    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);

    如何适配PC和移动端,看如下代码:

    var touchEvents = {
            touchstart: "touchstart",
            touchmove: "touchmove",
            touchend: "touchend",
    
            /**
             * @desc:判断是否pc设备,若是pc,需要更改touch事件为鼠标事件,否则默认触摸事件
             */
            initTouchEvents: function () {
                if (isPC()) {
                    this.touchstart = "mousedown";
                    this.touchmove = "mousemove";
                    this.touchend = "mouseup";
                }
            }
        };

    $(document).bind(touchEvents.touchstart, function (event) {
        event.preventDefault();            
    });
    $(document).bind(touchEvents.touchmove, function (event) {
        event.preventDefault();
    });
    
    $(document).bind(touchEvents.touchend, function (event) {
        event.preventDefault();
    });
     
    关于a标签
    a标签的四个伪类link,visited,active,hover是专为click事件设计的,所以在触屏网站中尽量不要使用它们。
    大部分伪类事件也是不可用的。但是hover需要注意,当你点击过一个按钮之后,这个按钮就会一直处于hover的状态,此时你基于这个伪类所设置的css也是起作用的。
    直到你用手指点击另外一个按钮,hover状态就会转移到另一个按钮。
  • 相关阅读:
    MyBatis——调用存储过程
    企业信息化快速开发平台JeeSite
    JavaWeb网页聊天室(WebSocket即时通讯)
    Java用webSocket实现tomcat的日志实时输出到web页面
    Java用WebSocket + tail命令实现Web实时日志
    linux 跨IP拷贝命令 scp
    在map中根据value获取key
    mysql 常用函数
    Nexus中自定义私服,每个项目都用独立的工厂,仓库
    button 默认类型是submit
  • 原文地址:https://www.cnblogs.com/lbnnbs/p/6685959.html
Copyright © 2020-2023  润新知