近期為自己的app增加一個(gè)通訊錄首字母導(dǎo)航的功能,如下圖藍(lán)色框部分,需求很好理解,在手指觸摸相應(yīng)字母時(shí),通訊錄自動(dòng)滾動(dòng)到相應(yīng)首字母的聯(lián)系人。

這邊通過需求分析,很容易聯(lián)想到,使用touchstart和touchmove這兩個(gè)方法來處理響應(yīng)操作,touchstart比較簡單就不說了,監(jiān)聽touchmove事件時(shí),發(fā)現(xiàn)一個(gè)問題,當(dāng)我無論如何在監(jiān)聽元素上移動(dòng)我的手指,所返回的event.touches[0].target永遠(yuǎn)指向第一個(gè)觸摸元素的event對象,而不會指向我當(dāng)前手指所觸摸的元素。
這也就意味著我無法通過回調(diào)返回的event來獲取當(dāng)前手指觸摸的元素
通過查閱資料,這是普遍存在的問題,最推薦的解決方案是使用
elementFromPoint
語法:
getMyElement = document.elementFromPoint ( myX , myY )
參數(shù):
myX : 必選項(xiàng)。整數(shù)(Integer)。單位:象素(Pixel)。定位橫坐標(biāo)偏移量。
myY : 必選項(xiàng)。整數(shù)(Integer)。單位:象素(Pixel)。定位縱坐標(biāo)偏移量。
返回值:
getMyElement : 對象(Element)。返回當(dāng)前文檔上處于指定坐標(biāo)位置最頂層的Dom元素。
我們通過touchmove事件返回的event對象,可以獲取當(dāng)前手指觸摸元素的clientX和clientY的值,將值傳入document.elementFromPoint就可獲取當(dāng)前觸摸的值,這里需要注意的是此方法返回的是最頂層的Dom,所以務(wù)必將你需要的Dom的z-index設(shè)置為最高,分享些許我在此項(xiàng)目的核心代碼:
/**
*獲取存儲當(dāng)前Dom位置的對象
**/
var myLocation = e.originalEvent.changedTouches[0];
/**
*取clientX及clientY并傳入elementFromPoint獲取當(dāng)前手指觸摸的Dom,大功告成,現(xiàn)在此Dom可以任你擺布了
**/
var realTarget = document.elementFromPoint(myLocation.clientX, myLocation.clientY);