js移動(dòng)端事件基礎(chǔ)及常用事件庫詳解
一、事件基礎(chǔ)
PC:click、mouseover、mouseout、mouseenter、mouseleave、mousemove、mousedown、mouseup、mousewheel、keydown、keyup、load、scroll、blur、focus、change...
移動(dòng)端:click(單擊)、load、scroll、blur、focus、change、input(代替keyup、keydown)...TOUCH事件模型(處理單手指操作)、GESTURE事件模型(處理多手指操作)
TOUCH:touchstart、touchmove、touchend、touchcancel
GESTURE:gesturestart、gesturechange、gestureend
1、click:在移動(dòng)端click屬于單擊事件,不是點(diǎn)擊事件,在移動(dòng)端的項(xiàng)目中我們經(jīng)常會(huì)區(qū)分單擊做什么和雙擊做什么,所以移動(dòng)端的瀏覽器在識(shí)別click的時(shí)候,只有確定是單擊后才會(huì)把它執(zhí)行:
在移動(dòng)端使用click會(huì)存在300ms的延遲:瀏覽器在第一次點(diǎn)擊結(jié)束后,還需要等到300ms看是否觸發(fā)了第二次點(diǎn)擊,如果觸發(fā)了第二次點(diǎn)擊就不屬于click了,沒有觸發(fā)第二次點(diǎn)擊才屬于click
下面代碼是移動(dòng)端模擬click時(shí)間的代碼
function on(curEle,type,fn){
curEle.addEventListener(type,fn,false);
}
var oBox = document.querySelector('.box');
//移動(dòng)端采用click存在300ms延遲
// oBox.addEventListener('click',function(){
// this.style.webkitTransform = 'rotate(360deg)'
// },false)
//使用TOUCH事件模型實(shí)現(xiàn)點(diǎn)擊操作(單擊&&雙擊)
on(oBox,'touchstart',function(ev){
//ev:TouchEvent事件 屬性 type、target、preventDefault(returnValue)、stopPropagation、changedTouches、touches
//changedTouches和touches都是手指信息的集合(touchList),touches獲取到值的必要條件只有手指還在屏幕上才可以獲取,所以在touchend事件中如果想獲取手指離開的瞬間坐標(biāo)只能使用changedTouches獲取
var point = ev.touches[0];
this['strX'] = point.clientX;
this['strY'] = point.clientY;
this['isMove'] = false;
})
on(oBox,'touchmove',function(ev){
var point = ev.touches[0];
var newX = point.clientX,
newY = point.clientY;
//判斷是否發(fā)生滑動(dòng),我們需要判斷偏移的值是否在30PX以內(nèi)
if(Math.abs(newX-this['strX'])>30 || Math.abs(newY-this['strY'])>30){
this['isMove'] = true;
}
})
on(oBox,'touchend',function(ev){
if(this['isMove'] === false){
//沒有發(fā)生移動(dòng) 點(diǎn)擊
this.style.webkitTransitionDuration = '1s';
this.style.webkitTransform = 'rotate(360deg)';
var delayTimer = window.setTimeout(function(){
this.style.webkitTransitionDuration = '0s';
this.style.webkitTransform = 'rotate(0deg)';
}.bind(this),1000);
}else{
//滑動(dòng)
this.style.background = 'red';
}
})
同時(shí)也可以使用fastclick.js來解決移動(dòng)端click事件的300ms延遲 (github地址https://github.com/zhouxiaotian/fastclick)
2、點(diǎn)擊、單擊、雙擊、長按、滑動(dòng)、左滑、右滑、上滑、下滑
單擊和雙擊(300MS)
點(diǎn)擊和長按(750MS)
點(diǎn)擊和滑動(dòng)(X/Y軸偏移的距離是否在30PX以內(nèi),超過30PX就是滑動(dòng))
左右滑動(dòng)和上下滑動(dòng)(X軸偏移的距離 > Y軸偏移的距離 = 左右滑 相反就是上下滑)
左滑和右滑(偏移的距離 >0 = 右滑 相反就是左滑)
二、常用的事件庫
FastClick.js :解決CLICK事件300MS的延遲
TOUCH.js:百度云移動(dòng)手勢庫 GitHub地址 https://github.com/Clouda-team/touch.code.baidu.com
實(shí)例如下:
var oBox = document.querySelector('.box');
//單擊
touch.on(oBox,'tap',function(ev){
this.style.webkitTransitionDuration = '1s';
this.style.webkitTransform = 'rotate(360deg)';
var delayTimer = window.setTimeout(function(){
this.style.webkitTransitionDuration = '0s';
this.style.webkitTransform = 'rotate(0deg)';
window.clearTimeout(delayTimer)
}.bind(this),1000)
})
//雙擊
touch.on(oBox,'doubletap',function(ev){
this.style.webkitTransitionDuration = '1s';
this.style.webkitTransform = 'rotate(-360deg)';
var delayTimer = window.setTimeout(function(){
this.style.webkitTransitionDuration = '0s';
this.style.webkitTransform = 'rotate(0deg)';
window.clearTimeout(delayTimer)
}.bind(this),1000)
})
//長按
touch.on(oBox,'hold',function(ev){
this.style.backgroundColor = 'red';
})
HAMMER.js
Zepto.js:被譽(yù)為移動(dòng)端的小型JQ,JQ由于是在PC端使用的,所以代碼中包含了大量對(duì)于ie低版本瀏覽器的兼容處理,而ZEPTO只應(yīng)用在移動(dòng)端開發(fā),所以在JQ的基礎(chǔ)上沒有對(duì)低版本的ie進(jìn)行支持
JQ中提供了很多的選擇器類型及DOM操作方法,但是ZEPTO只是實(shí)現(xiàn)了部分常用的選擇器和方法。例如:JQ中的動(dòng)畫方法有animate、hide、show、fadeIn、fadeOut、fadeToggle、slideDown、slideUp、slideToggle...但是在ZEPTO中只有animate
ZEPTO的源代碼大小比JQ小很多
ZEPTO專門為移動(dòng)端開發(fā)而誕生,所以相對(duì)于JQ來說更適合移動(dòng)端:
ZEPTO的animate動(dòng)畫方法支持了CSS3動(dòng)畫的操作
ZEPTO專門的準(zhǔn)備了移動(dòng)端常用 的事件操作:tap、singleTap、doubleTap、longTap、swipe、swipeUp、swipeDown、swipeLeft、swipeRight
實(shí)例代碼如下:
$('.box').singleTap(function(ev){
$(this).animate({
rotate:'360deg'
},1000,'linear',function(){
this.style.webkitTransform = 'rotate(0)'
})
})
$('.box').on('touchstart',function(){
$(this).css('background','red')
})
$.ajax({
url:'',
type:'get',
dataType:'json',
cache:false,
success:function(){
}
})
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
boostrapTable的refresh和refreshOptions區(qū)別淺析
在使用bootstrapTable時(shí),刷新數(shù)據(jù)有兩個(gè)方法refresh、refreshOptions,在其用法上有點(diǎn)區(qū)別,接下來通過本文給大家分享boostrapTable的refresh和refreshOptions的區(qū)別,需要的朋友可以參考下2017-01-01
一道面試題引發(fā)的對(duì)javascript類型轉(zhuǎn)換的思考
本文主要介紹了javascript類型轉(zhuǎn)換的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03
echarts學(xué)習(xí)之如何給餅圖中間添加文字
這篇文章主要介紹了echarts學(xué)習(xí)之如何給餅圖中間添加文字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
JavaScript選擇排序算法原理與實(shí)現(xiàn)方法示例
這篇文章主要介紹了JavaScript選擇排序算法原理與實(shí)現(xiàn)方法,簡單分析了選擇排序算法的概念、原理并結(jié)合實(shí)例形式分析了JavaScript選擇排序算法的相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
Javascript下的urlencode編碼解碼方法附decodeURIComponent
而本文,就大概說說如何在js中通過系統(tǒng)自帶的函數(shù)去解決這個(gè)問題。2010-04-04
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯(cuò)誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯(cuò)誤的解決方法,涉及針對(duì)字符串參數(shù)的處理方法,需要的朋友可以參考下2016-08-08

