• js触摸事件


    touch事件的绑定

    电脑端的mouseDown,mouseUp,mouseMove分别对应移动端的touchstart,touchend,touchmove

    下面的代码判断浏览器是电脑端还是移动端,如果是电脑端,就绑定鼠标事件;如果是移动端,就绑定触摸事件。
    需要注意的是,绑定触摸事件的时候需要通过addEventListener方式

        function bindEventListenerAccordingPlatform() {
            if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {
                $("#board").addEventListener("touchstart", onBlockMouseDown)
                $("#board").addEventListener("touchend", onBlockMouseUp)
                $("#board").addEventListener("touchmove", onBlockMouseMove)
            } else {
                $("#board").onmousedown = onBlockMouseDown
                $("#board").onmouseup = onBlockMouseUp
                $("#board").onmousemove = onBlockMouseMove
            }
        }
    

    以上绑定的三个函数onBlockMouseDown,onBlockMouseUp,onBlockMouseMove中可能会需要获取鼠标位置或者触点位置,可以通过如下函数实现

        /**根据事件获取坐标,兼容鼠标和触摸两种事件*/
        function getMousePosition(event) { 
            if (event.type.startsWith("mouse")) {
                return {x: event.x, y: event.y}
            } else if (event.type.startsWith("touch")) {
                return {
                    x: event.changedTouches[0].clientX,
                    y: event.changedTouches[0].clientY
                }
            } else {
                console.log("baga==========")
            }
        }
    
    

    TouchEvent有三个touches

    在Chrome上,TouchEvent包含如下属性

    TouchEvent {isTrusted: true, touches: TouchList, targetTouches: TouchList, changedTouches: TouchList, altKey: false, …}
    altKey:false
    bubbles:true
    cancelBubble:false
    cancelable:true
    changedTouches:TouchList {0: Touch, length: 1}
    composed:true
    ctrlKey:false
    currentTarget:null
    defaultPrevented:true
    detail:0
    eventPhase:0
    isTrusted:true
    metaKey:false
    path:(9) [div#block32.block, div#board, div#container, body, shadow, document-fragment, html, document, Window]
    returnValue:false
    shiftKey:false
    sourceCapabilities:InputDeviceCapabilities {firesTouchEvents: true}
    srcElement:div#block32.block
    target:div#block32.block
    targetTouches:TouchList {0: Touch, length: 1}
    timeStamp:1476.3200000000002
    touches:TouchList {0: Touch, length: 1}
    type:"touchmove"
    view:Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
    which:0
    
    • touches: 当前屏幕上所有触摸点的列表;
    • targetTouches: 当前对象上所有触摸点的列表;
    • changedTouches: 涉及当前(引发)事件的触摸点的列表

    通过一个例子来区分一下触摸事件中的这三个属性:

    1、用一个手指接触屏幕,触发事件,此时这三个属性有相同的值。
    2、用第二个手指接触屏幕,此时,touches有两个元素,每个手指触摸点为一个值。当两个手指触摸相同元素时,targetTouches和touches的值相同,否则targetTouches 只有一个值。changedTouches此时只有一个值,
    为第二个手指的触摸点,因为第二个手指是引发事件的原因
    3、用两个手指同时接触屏幕,此时changedTouches有两个值,每一个手指的触摸点都有一个值
    4、手指滑动时,三个值都会发生变化
    5、一个手指离开屏幕,touches和targetTouches中对应的元素会同时移除,而changedTouches仍然会存在元素。
    6、手指都离开屏幕之后,touches和targetTouches中将不会再有值,changedTouches还会有一个值,
    此值为最后一个离开屏幕的手指的接触点。

    触点坐标选取

    在Chrome上,Touch对象包含如下属性:

    Touch
    clientX:326.6669921875
    clientY:415.5559997558594
    force:1
    identifier:0
    pageX:326.6669921875
    pageY:415.5559997558594
    radiusX:25.55555534362793
    radiusY:25.55555534362793
    rotationAngle:0
    screenX:737
    screenY:317
    target:div#block32.block
    

    坐标有三种:
    pageX,pageY:相对于整个document
    clientX,clientY:相对于窗口的客户区
    screenX,screenY:相对于整个屏幕

    使用时: e.targetTouches[0].pageX 或 (jquery)e.originalEvent.targetTouches[0].pageX
    e.changedTouches[0].pageX 或 (jquery)e.originalEvent.changedTouches[0].pageX

    参考资料

    http://blog.sina.com.cn/s/blog_468530a60102wzkw.html

  • 相关阅读:
    软件需求与分析课堂讨论一
    架构漫谈读后感
    Android Studio AVD中文输入法安装
    软件体系结构课后作业01
    寒假阅读笔记六
    寒假阅读笔记五
    寒假阅读笔记三
    寒假阅读笔记二
    寒假阅读笔记一
    mysql绿色版的安装
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/8478731.html
Copyright © 2020-2023  润新知