国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例_javascript技巧

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:24:01
文檔

javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例_javascript技巧

javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例_javascript技巧:在觸屏設(shè)備上,一些比較基礎(chǔ)的手勢(shì)都需要通過(guò)對(duì) touch 事件進(jìn)行二次封裝才能實(shí)現(xiàn)。zepto 是移動(dòng)端上使用率比較高的一個(gè)類庫(kù),但是其 touch 模塊模擬出來(lái)的一些事件存在一些兼容性問(wèn)題,如 tap 事件在某些安卓設(shè)備上存在事件穿透的 bug,其他類型的事件也或
推薦度:
導(dǎo)讀javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例_javascript技巧:在觸屏設(shè)備上,一些比較基礎(chǔ)的手勢(shì)都需要通過(guò)對(duì) touch 事件進(jìn)行二次封裝才能實(shí)現(xiàn)。zepto 是移動(dòng)端上使用率比較高的一個(gè)類庫(kù),但是其 touch 模塊模擬出來(lái)的一些事件存在一些兼容性問(wèn)題,如 tap 事件在某些安卓設(shè)備上存在事件穿透的 bug,其他類型的事件也或

在觸屏設(shè)備上,一些比較基礎(chǔ)的手勢(shì)都需要通過(guò)對(duì) touch 事件進(jìn)行二次封裝才能實(shí)現(xiàn)。
zepto 是移動(dòng)端上使用率比較高的一個(gè)類庫(kù),但是其 touch 模塊模擬出來(lái)的一些事件存在一些兼容性問(wèn)題,如 tap 事件在某些安卓設(shè)備上存在事件穿透的 bug,其他類型的事件也或多或少的存在一些兼容性問(wèn)題。

于是乎,干脆自己動(dòng)手對(duì)這些常用的手勢(shì)事件進(jìn)行了封裝,由于沒(méi)有太多真實(shí)的設(shè)備來(lái)進(jìn)行測(cè)試,可能存在一些兼容性問(wèn)題,下面的代碼也只是在 iOS 7、Andorid 4 上的一些比較常見(jiàn)的瀏覽器中測(cè)試通過(guò)。

tap事件

tap 事件相當(dāng)于 pc 瀏覽器中的 click 效果,雖然在觸屏設(shè)備上 click 事件仍然可用,但是在很多設(shè)備上,click 會(huì)存在一些延遲,如果想要快速響應(yīng)的 “click” 事件,需要借助 touch 事件來(lái)實(shí)現(xiàn)。

代碼如下:
var startTx, startTy;

element.addEventListener( 'touchstart', function( e ){
var touches = e.touches[0];

startTx = touches.clientX;
startTy = touches.clientY;
}, false );

element.addEventListener( 'touchend', function( e ){
var touches = e.changedTouches[0],
endTx = touches.clientX,
endTy = touches.clientY;

// 在部分設(shè)備上 touch 事件比較靈敏,導(dǎo)致按下和松開(kāi)手指時(shí)的事件坐標(biāo)會(huì)出現(xiàn)一點(diǎn)點(diǎn)變化
if( Math.abs(startTx - endTx) < 6 && Math.abs(startTy - endTy) < 6 ){
console.log( 'fire tap event' );
}
}, false );

doubleTap事件

doubleTap 事件是當(dāng)手指在相同位置范圍內(nèi)和極短的時(shí)間內(nèi)兩次敲擊屏幕時(shí)觸發(fā)的事件。在部分瀏覽器下,doubleTap 事件會(huì)選中文本,如果不希望選中文本,可以給元素添加 user-select:none 的 css 屬性。
代碼如下:
var isTouchEnd = false,
lastTime = 0,
lastTx = null,
lastTy = null,
firstTouchEnd = true,
body = document.body,
dTapTimer, startTx, startTy, startTime;

element.addEventListener( 'touchstart', function( e ){
if( dTapTimer ){
clearTimeout( dTapTimer );
dTapTimer = null;
}

var touches = e.touches[0];

startTx = touches.clientX;
startTy = touches.clientY;
}, false );

element.addEventListener( 'touchend', function( e ){
var touches = e.changedTouches[0],
endTx = touches.clientX,
endTy = touches.clientY,
now = Date.now(),
duration = now - lastTime;

// 首先要確保能觸發(fā)單次的 tap 事件
if( Math.abs(startTx - endTx) < 6 && Math.abs(startTx - endTx) < 6 ){
// 兩次 tap 的間隔確保在 500 毫秒以內(nèi)
if( duration < 301 ){
// 本次的 tap 位置和上一次的 tap 的位置允許一定范圍內(nèi)的誤差
if( lastTx !== null &&
Math.abs(lastTx - endTx) < 45 &&
Math.abs(lastTy - endTy) < 45 ){

firstTouchEnd = true;
lastTx = lastTy = null;
console.log( 'fire double tap event' );
}
}
else{
lastTx = endTx;
lastTy = endTy;
}
}
else{
firstTouchEnd = true;
lastTx = lastTy = null;
}

lastTime = now;
}, false );

// 在 iOS 的 safari 上手指敲擊屏幕的速度過(guò)快,
// 有一定的幾率會(huì)導(dǎo)致第二次不會(huì)響應(yīng) touchstart 和 touchend 事件
// 同時(shí)手指長(zhǎng)時(shí)間的touch不會(huì)觸發(fā)click

if( ~navigator.userAgent.toLowerCase().indexOf('iphone os') ){

body.addEventListener( 'touchstart', function( e ){
startTime = Date.now();
}, true );

body.addEventListener( 'touchend', function( e ){
var noLongTap = Date.now() - startTime < 501;

if( firstTouchEnd ){
firstTouchEnd = false;
if( noLongTap && e.target === element ){
dTapTimer = setTimeout(function(){
firstTouchEnd = true;
lastTx = lastTy = null;
console.log( 'fire double tap event' );
}, 400 );
}
}
else{
firstTouchEnd = true;
}
}, true );

// iOS 上手指多次敲擊屏幕時(shí)的速度過(guò)快不會(huì)觸發(fā) click 事件
element.addEventListener( 'click', function( e ){
if( dTapTimer ){
clearTimeout( dTapTimer );
dTapTimer = null;
firstTouchEnd = true;
}
}, false );

}

longTap事件

longTap 事件是當(dāng)手指長(zhǎng)時(shí)間按住屏幕保持不動(dòng)時(shí)觸發(fā)的事件。

代碼如下:
var startTx, startTy, lTapTimer;

element.addEventListener( 'touchstart', function( e ){
if( lTapTimer ){
clearTimeout( lTapTimer );
lTapTimer = null;
}

var touches = e.touches[0];

startTx = touches.clientX;
startTy = touches.clientY;

lTapTimer = setTimeout(function(){
console.log( 'fire long tap event' );
}, 1000 );

e.preventDefault();
}, false );

element.addEventListener( 'touchmove', function( e ){
var touches = e.touches[0],
endTx = touches.clientX,
endTy = touches.clientY;

if( lTapTimer && (Math.abs(endTx - startTx) > 5 || Math.abs(endTy - startTy) > 5) ){
clearTimeout( lTapTimer );
lTapTimer = null;
}
}, false );

element.addEventListener( 'touchend', function( e ){
if( lTapTimer ){
clearTimeout( lTapTimer );
lTapTimer = null;
}
}, false );

swipe事件

swipe 事件是當(dāng)手指在屏幕上滑動(dòng)后觸發(fā)的事件,根據(jù)手指滑動(dòng)的方向又分為 swipeLeft (向左)、swipeRight (向右)、swipeUp (向上)、swipeDown (向下)。

代碼如下:
var isTouchMove, startTx, startTy;

element.addEventListener( 'touchstart', function( e ){
var touches = e.touches[0];

startTx = touches.clientX;
startTy = touches.clientY;
isTouchMove = false;
}, false );

element.addEventListener( 'touchmove', function( e ){
isTouchMove = true;
e.preventDefault();
}, false );

element.addEventListener( 'touchend', function( e ){
if( !isTouchMove ){
return;
}

var touches = e.changedTouches[0],
endTx = touches.clientX,
endTy = touches.clientY,
distanceX = startTx - endTx
distanceY = startTy - endTy,
isSwipe = false;

if( Math.abs(distanceX) >= Math.abs(distanceY) ){
if( distanceX > 20 ){
console.log( 'fire swipe left event' );
isSwipe = true;
}
else if( distanceX < -20 ){
console.log( 'fire swipe right event' );
isSwipe = true;
}
}
else{
if( distanceY > 20 ){
console.log( 'fire swipe up event' );
isSwipe = true;
}
else if( distanceY < -20 ){
console.log( 'fire swipe down event' );
isSwipe = true;
}
}

if( isSwipe ){
console.log( 'fire swipe event' );
}
}, false );

上面模擬的事件都封裝在 MonoEvent 中了。完整代碼地址:https://github.com/chenmnkken/monoevent,需要的朋友看看吧~

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例_javascript技巧

javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例_javascript技巧:在觸屏設(shè)備上,一些比較基礎(chǔ)的手勢(shì)都需要通過(guò)對(duì) touch 事件進(jìn)行二次封裝才能實(shí)現(xiàn)。zepto 是移動(dòng)端上使用率比較高的一個(gè)類庫(kù),但是其 touch 模塊模擬出來(lái)的一些事件存在一些兼容性問(wèn)題,如 tap 事件在某些安卓設(shè)備上存在事件穿透的 bug,其他類型的事件也或
推薦度:
標(biāo)簽: 移動(dòng) 事件 touch
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产精品第1页在线观看 | 一区二区三区视频在线 | 亚洲精品毛片久久久久久久 | 久久91精品国产91 | 精品视频一区二区三区四区五区 | 亚洲综合欧美日韩 | 精品一区二区三区在线视频 | 国内精品一区二区 | 精品日韩一区二区 | 特黄一级毛片 | 国产成人麻豆精品video | 国产成人久久一区二区三区 | 日本a v 黄 | 久久亚洲国产成人精品性色 | 久久中文字幕久久久久91 | 97在线资源 | 欧美国产成人精品一区二区三区 | 亚洲 欧洲 另类 综合 自拍 | 欧美日韩高清一区 | 国产成人精品一区二区免费视频 | 亚洲欧美日本在线观看 | 久久精品国产一区二区三区日韩 | 久久精品a亚洲国产v高清不卡 | 欧美xxxx做受欧美69 | 亚洲成人一区在线 | 亚欧美综合 | 国产日韩一区二区三区 | xx日韩| 欧洲精品欧美精品 | 欧美日韩1区 | 国产欧美日韩另类va在线 | 欧美在线 | 亚洲 | 亚洲最新视频在线观看 | 在线h片 | 与子乱刺激对白在线播放 | 欧美亚洲网站 | 久久精品视频一区二区三区 | 亚洲精品福利 | 一区二区成人国产精品 | 亚洲日本香蕉视频 | 真实的国产乱xxxx在线 |