91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HTML5觸摸事件演化tap事件的示例分析

發布時間:2021-09-15 15:44:18 來源:億速云 閱讀:150 作者:柒染 欄目:web開發

HTML5觸摸事件演化tap事件介紹,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

觸摸事件是移動瀏覽器特有的HTML5事件,雖然click事件在pc和移動端更通用,但是在移動端會出現300ms延遲,較為影響用戶體驗,300ms延遲來自判斷雙擊和長按,因為只有默認等待時間結束以確定沒有后續動作發生時,才會觸發click事件。所以觸摸事件反應更快,體驗更好。

HTML5觸摸事件演化tap事件的示例分析

觸摸事件的類型:

為了區別觸摸相關的狀態改變,存在多種類型的觸摸事件。可以通過檢查觸摸事件的 TouchEvent.type 屬性來確定當前事件屬于哪種類型。

注意: 在很多情況下,觸摸事件和鼠標事件會同時被觸發(目的是讓沒有對觸摸設備優化的代碼仍然可以在觸摸設備上正常工作)。如果你使用了觸摸事件,可以調用 event.preventDefault() 來阻止鼠標事件被觸發。

標準的觸摸事件

事件名稱描述包含touches數組

touchstart

當用戶在觸摸平面上放置了一個觸點時觸發。事件的目標 element 將是觸點位置上的那個目標 element

touchmove

當用戶在觸摸平面上移動觸點時觸發。

事件的目標 element 和這個 touchmove 事件對應的 touchstart 事件的目標 element 相同,

哪怕當 touchmove 事件觸發時,觸點已經移出了該 element 。

touchend

當一個觸點被用戶從觸摸平面上移除(當用戶將一個手指離開觸摸平面)時觸發。

當觸點移出觸摸平面的邊界時也將觸發。例如用戶將手指劃出屏幕邊緣。

已經被從觸摸平面上移除的觸點,可以在 changedTouches 屬性定義的 TouchList 中找到。

touchenter

當觸點進入某個 element 時觸發。此事件沒有冒泡過程。

touchleave

當觸點離開某個 element 時觸發。此事件沒有冒泡過程。

touchcancel

當觸點由于某些原因被中斷時觸發。有幾種可能的原因如下(具體的原因根據不同的設備和瀏覽器有所不同):

  • 由于某個事件取消了觸摸:例如觸摸過程被一個模態的彈出框打斷。

  • 觸點離開了文檔窗口,而進入了瀏覽器的界面元素、插件或者其他外部內容區域。

  • 當用戶產生的觸點個數超過了設備支持的個數,從而導致 TouchList 中最早的 Touch 對象被取消。

觸摸對象屬性

Touch.identifier返回一個可以唯一地識別和觸摸平面接觸的點的值. 這個值在這根手指(或觸摸筆等)所引發的所有事件中保持一致, 直到它離開觸摸平面.
Touch.screenX觸點相對于屏幕左邊沿的的X坐標. 只讀屬性.
Touch.screenY觸點相對于屏幕上邊沿的的Y坐標. 只讀屬性.
Touch.clientX觸點相對于可見視區左邊沿的的X坐標. 不包括任何滾動偏移. 只讀屬性.
Touch.clientY觸點相對于可見視區上邊沿的的Y坐標. 不包括任何滾動偏移. 只讀屬性.
Touch.pageX觸點相對于HTML文檔左邊沿的的X坐標. 當存在水平滾動的偏移時, 這個值包含了水平滾動的偏移只讀屬性.
Touch.pageY觸點相對于HTML文檔上邊沿的的Y坐標. 當存在水平滾動的偏移時, 這個值包含了垂直滾動的偏移只讀屬性.
Touch.radiusX能夠包圍用戶和觸摸平面的接觸面的最小橢圓的水平軸(X軸)半徑. 這個值的單位和 screenX 相同. 只讀屬性.
Touch.force手指擠壓觸摸平面的壓力大小, 從0.0(沒有壓力)到1.0(最大壓力)的浮點數. 只讀屬性.
Touch.radiusY能夠包圍用戶和觸摸平面的接觸面的最小橢圓的垂直軸(Y軸)半徑. 這個值的單位和 screenY 相同. 只讀屬性.
Touch.target

當這個觸點最開始被跟蹤時(在 touchstart 事件中), 觸點位于的HTML元素. 哪怕在觸點移動過程中, 觸點的位置已經離開了這個元素的有效交互區域,

或者這個元素已經被從文檔中移除. 需要注意的是, 如果這個元素在觸摸過程中被移除, 這個事件仍然會指向它, 但是不會再冒泡這個事件到 window 或 document 對象.

因此, 如果有元素在觸摸過程中可能被移除, 最佳實踐是將觸摸事件的監聽器綁定到這個元素本身, 防止元素被移除后, 無法再從它的上一級元素上偵測到從該元素冒泡的事件. 只讀屬性.

IE10+的觸摸事件

IE指針事件
事件名稱描述(在觸摸設備上)
MSPointerDown觸摸開始
MSPointerMove接觸點移動
MSPointerUp觸摸結束
MSPointerOver觸摸點移動到元素內,相當于mouseover
MSPointerOut觸摸點離開元素,相當于mouseout

MSPointerEvent屬性

屬性描述
hwTimestamp創建事件的時間(ms)
isPrimary標識該指針是不是主指針
pointerId指針的唯一ID(類似于觸摸事件的標識符)
pointerType一個整數,標識了該事件來自鼠標、手寫筆還是手指
pressure筆的壓力,0-255,只有手寫筆輸入時才可用
rotation0-359的整數,光標的旋轉度(如果支持的話)
tiltX/tiltY手寫筆的傾斜度,只有用手寫筆輸入時才支持

等價事件

鼠標觸摸鍵盤
mousedowntouchstartkeydown
mousemovetouchmovekeydown
mouseuptouchendkeyup
mouseover focus

很顯然,觸摸動作序列:touchstart-touchmove-touchend和鼠標序 列:mousedown-mousemove-mouseup以及鍵盤序列:keydown-keypress-keyup很相似,這并不是巧合,因為這 三種交互模式都可以描述為start-move-stop。

話說回來,click要經過touchstart-touchmove-touchend流程,300ms延遲,所以需要tap事件,tap就是在同一個點輕觸時間很短。

封裝好的tap和longtap事件

XML/HTML Code復制內容到剪貼板

  1. (function() {    
        var TOUCHSTART, TOUCHEND;    
        if (typeof(window.ontouchstart) != 'undefined') {    
            TOUCHSTART = 'touchstart';    
            TOUCHEND = 'touchend';    
            TOUCHMOVE='touchmove';    
         
        } else if (typeof(window.onmspointerdown) != 'undefined') {    
            TOUCHSTART = 'MSPointerDown';    
            TOUCHEND = 'MSPointerUp';    
            TOUCHMOVE='MSPointerMove';    
        } else {    
            TOUCHSTART = 'mousedown';    
            TOUCHEND = 'mouseup';    
            TOUCHMOVE = 'mousemove';    
        }    
        function NodeTouch(node) {    
            this._node = node;    
        }    
        function tap(node,callback,scope) {    
            node.addEventListener(TOUCHSTART, function(e) {    
                x = e.touches[0].pageX;    
                y = e.touches[0].pageY;    
            });    
            node.addEventListener(TOUCHEND, function(e) {    
                e.stopPropagation();    
                e.preventDefault();    
                var curx = e.changedTouches[0].pageX;    
                var cury = e.changedTouches[0].pageY;    
                if (Math.abs(curx - x) < 6 && Math.abs(cury - y) < 6) {    
                    callback.apply(scope, arguments);    
                }    
            });    
        }    
        function longTap(node,callback,scope) {    
            var x,y,startTime=0,endTime=0,in_dis=false;    
            node.addEventListener(TOUCHSTART, function(e) {    
                x = e.touches[0].pageX;    
                y = e.touches[0].pageY;    
                startTime=(new Date()).getTime();    
            });    
            node.addEventListener(TOUCHEND, function(e) {    
                e.stopPropagation();    
                e.preventDefault();    
                var curx = e.changedTouches[0].pageX;    
                var cury = e.changedTouches[0].pageY;    
                if (Math.abs(curx - x) < 6 && Math.abs(cury - y) < 6) {    
                    in_dis=true;    
                }else{    
                    in_dis=false;    
                }    
                endTime=(new Date()).getTime();    
                if (endTime - startTime > 300 && in_dis) {    
                    callback.apply(scope, arguments);    
                }    
            });    
        }    
        NodeTouch.prototype.on = function(evt, callback, scope) {    
            var scopeObj;    
            var x,y;    
            if (!scope) {    
                scopeObj = this._node;    
            } else {    
                scopescopeObj = scope;    
            }    
            if (evt === 'tap') {    
                tap(this._node,callback,scope);    
            } else if(evt === 'longtap'){    
                longTap(this._node,callback,scope);    
            } else {    
                this._node.addEventListener(evt, function() {    
                    callback.apply(scope, arguments);    
                });    
            }    
            return this;    
        }    
        window.$ = function(selector) {    
            var node = document.querySelector(selector);    
            if (node) {    
                return new NodeTouch(node);    
            } else {    
                return null;    
            }    
        }    
    })();    
    var box=$("#box");    
    box.on("longtap",function(){    
        console.log("你已經長按了");    
    },box)

看完上述內容,你們掌握HTML5觸摸事件演化tap事件介紹的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

迁西县| 电白县| 石渠县| 女性| 呼和浩特市| 静安区| 唐山市| 钟祥市| 阜城县| 罗田县| 思茅市| 甘肃省| 修武县| 永顺县| 陆河县| 广南县| 黄龙县| 甘泉县| 黄陵县| 南木林县| 汽车| 江孜县| 旬阳县| 民县| 滨州市| 临江市| 满城县| 房山区| 南郑县| 大冶市| 望江县| 鄂伦春自治旗| 嘉荫县| 山阳县| 兰溪市| 临夏县| 福建省| 民和| 忻城县| 宝坻区| 政和县|