HTML5觸摸事件演化tap事件介紹,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),呼瑪企業(yè)網(wǎng)站建設(shè),呼瑪品牌網(wǎng)站建設(shè),網(wǎng)站定制,呼瑪網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,呼瑪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
觸摸事件是移動瀏覽器特有的HTML5事件,雖然click事件在pc和移動端更通用,但是在移動端會出現(xiàn)300ms延遲,較為影響用戶體驗,300ms延遲來自判斷雙擊和長按,因為只有默認等待時間結(jié)束以確定沒有后續(xù)動作發(fā)生時,才會觸發(fā)click事件。所以觸摸事件反應(yīng)更快,體驗更好。

觸摸事件的類型:
為了區(qū)別觸摸相關(guān)的狀態(tài)改變,存在多種類型的觸摸事件。可以通過檢查觸摸事件的 TouchEvent.type 屬性來確定當(dāng)前事件屬于哪種類型。
注意: 在很多情況下,觸摸事件和鼠標(biāo)事件會同時被觸發(fā)(目的是讓沒有對觸摸設(shè)備優(yōu)化的代碼仍然可以在觸摸設(shè)備上正常工作)。如果你使用了觸摸事件,可以調(diào)用 event.preventDefault() 來阻止鼠標(biāo)事件被觸發(fā)。
標(biāo)準(zhǔn)的觸摸事件
| 事件名稱 | 描述 | 包含touches數(shù)組 |
touchstart | 當(dāng)用戶在觸摸平面上放置了一個觸點時觸發(fā)。事件的目標(biāo) element 將是觸點位置上的那個目標(biāo) element | 是 |
touchmove | 當(dāng)用戶在觸摸平面上移動觸點時觸發(fā)。 事件的目標(biāo) 哪怕當(dāng) | 是 |
touchend | 當(dāng)一個觸點被用戶從觸摸平面上移除(當(dāng)用戶將一個手指離開觸摸平面)時觸發(fā)。 當(dāng)觸點移出觸摸平面的邊界時也將觸發(fā)。例如用戶將手指劃出屏幕邊緣。 已經(jīng)被從觸摸平面上移除的觸點,可以在 | 是 |
touchenter | 當(dāng)觸點進入某個 element 時觸發(fā)。此事件沒有冒泡過程。 | 是 |
touchleave | 當(dāng)觸點離開某個 element 時觸發(fā)。此事件沒有冒泡過程。 | 是 |
touchcancel | 當(dāng)觸點由于某些原因被中斷時觸發(fā)。有幾種可能的原因如下(具體的原因根據(jù)不同的設(shè)備和瀏覽器有所不同):
| 是 |
觸摸對象屬性
Touch.identifier | 返回一個可以唯一地識別和觸摸平面接觸的點的值. 這個值在這根手指(或觸摸筆等)所引發(fā)的所有事件中保持一致, 直到它離開觸摸平面. |
Touch.screenX | 觸點相對于屏幕左邊沿的的X坐標(biāo). 只讀屬性. |
Touch.screenY | 觸點相對于屏幕上邊沿的的Y坐標(biāo). 只讀屬性. |
Touch.clientX | 觸點相對于可見視區(qū)左邊沿的的X坐標(biāo). 不包括任何滾動偏移. 只讀屬性. |
Touch.clientY | 觸點相對于可見視區(qū)上邊沿的的Y坐標(biāo). 不包括任何滾動偏移. 只讀屬性. |
Touch.pageX | 觸點相對于HTML文檔左邊沿的的X坐標(biāo). 當(dāng)存在水平滾動的偏移時, 這個值包含了水平滾動的偏移. 只讀屬性. |
Touch.pageY | 觸點相對于HTML文檔上邊沿的的Y坐標(biāo). 當(dāng)存在水平滾動的偏移時, 這個值包含了垂直滾動的偏移. 只讀屬性. |
Touch.radiusX | 能夠包圍用戶和觸摸平面的接觸面的最小橢圓的水平軸(X軸)半徑. 這個值的單位和 screenX 相同. 只讀屬性. |
| 手指擠壓觸摸平面的壓力大小, 從0.0(沒有壓力)到1.0(最大壓力)的浮點數(shù). 只讀屬性. |
| 能夠包圍用戶和觸摸平面的接觸面的最小橢圓的垂直軸(Y軸)半徑. 這個值的單位和 screenY 相同. 只讀屬性. |
| 當(dāng)這個觸點最開始被跟蹤時(在 或者這個元素已經(jīng)被從文檔中移除. 需要注意的是, 如果這個元素在觸摸過程中被移除, 這個事件仍然會指向它, 但是不會再冒泡這個事件到 因此, 如果有元素在觸摸過程中可能被移除, 最佳實踐是將觸摸事件的監(jiān)聽器綁定到這個元素本身, 防止元素被移除后, 無法再從它的上一級元素上偵測到從該元素冒泡的事件. 只讀屬性. |
IE10+的觸摸事件
| 事件名稱 | 描述(在觸摸設(shè)備上) |
|---|---|
| MSPointerDown | 觸摸開始 |
| MSPointerMove | 接觸點移動 |
| MSPointerUp | 觸摸結(jié)束 |
| MSPointerOver | 觸摸點移動到元素內(nèi),相當(dāng)于mouseover |
| MSPointerOut | 觸摸點離開元素,相當(dāng)于mouseout |
MSPointerEvent屬性
| 屬性 | 描述 |
|---|---|
| hwTimestamp | 創(chuàng)建事件的時間(ms) |
| isPrimary | 標(biāo)識該指針是不是主指針 |
| pointerId | 指針的唯一ID(類似于觸摸事件的標(biāo)識符) |
| pointerType | 一個整數(shù),標(biāo)識了該事件來自鼠標(biāo)、手寫筆還是手指 |
| pressure | 筆的壓力,0-255,只有手寫筆輸入時才可用 |
| rotation | 0-359的整數(shù),光標(biāo)的旋轉(zhuǎn)度(如果支持的話) |
| tiltX/tiltY | 手寫筆的傾斜度,只有用手寫筆輸入時才支持 |
等價事件
| 鼠標(biāo) | 觸摸 | 鍵盤 |
| mousedown | touchstart | keydown |
| mousemove | touchmove | keydown |
| mouseup | touchend | keyup |
| mouseover | focus |
很顯然,觸摸動作序列:touchstart-touchmove-touchend和鼠標(biāo)序 列:mousedown-mousemove-mouseup以及鍵盤序列:keydown-keypress-keyup很相似,這并不是巧合,因為這 三種交互模式都可以描述為start-move-stop。
話說回來,click要經(jīng)過touchstart-touchmove-touchend流程,300ms延遲,所以需要tap事件,tap就是在同一個點輕觸時間很短。
封裝好的tap和longtap事件
XML/HTML Code復(fù)制內(nèi)容到剪貼板
(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("你已經(jīng)長按了");
},box)看完上述內(nèi)容,你們掌握HTML5觸摸事件演化tap事件介紹的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
標(biāo)題名稱:HTML5觸摸事件演化tap事件的示例分析
文章URL:http://www.chinadenli.net/article46/pgdehg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、動態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、虛擬主機、App設(shè)計、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)