javascript - 在移動(dòng)設(shè)備上快速滾動(dòng)屏幕然后點(diǎn)擊使?jié)L動(dòng)停止,如何盡量避免在點(diǎn)擊時(shí)誤觸<a>標(biāo)簽,跳轉(zhuǎn)到其他頁(yè)?
問(wèn)題描述
1 問(wèn)題:在移動(dòng)設(shè)備上快速滾動(dòng)屏幕然后點(diǎn)擊使?jié)L動(dòng)停止,如何盡量避免在點(diǎn)擊時(shí)誤觸a標(biāo)簽,跳轉(zhuǎn)到其他頁(yè)?
2 這也是在移動(dòng)端的前端開(kāi)發(fā)中實(shí)際遇到的一個(gè)問(wèn)題,詳細(xì)說(shuō)來(lái)就是在正常情況下,當(dāng)我們的當(dāng)前頁(yè)面內(nèi)容較多,高度上較高,出現(xiàn)滾動(dòng)條的時(shí)候,當(dāng)我們用手滑動(dòng)屏幕,屏幕上頁(yè)面內(nèi)容會(huì)快速滾動(dòng),不會(huì)因?yàn)槭忠呀?jīng)離開(kāi)了屏幕而滾動(dòng)停止。這個(gè)時(shí)候,當(dāng)我們想要停止?jié)L動(dòng)的時(shí)候,我們也輕輕點(diǎn)擊屏幕,讓屏幕停止。但是這個(gè)時(shí)候有個(gè)問(wèn)題,如果屏幕上點(diǎn)擊的位置,正好有一個(gè)a標(biāo)簽,或者有一個(gè)button,這個(gè)時(shí)候就很容易進(jìn)入下一個(gè)路由。查看了mdn上的關(guān)于scroll事件的一些說(shuō)明,并沒(méi)有對(duì)scroll過(guò)程中的速度和停止的反應(yīng)時(shí)間這方面的說(shuō)明。
我的思路是先判斷滾動(dòng)事件是否已經(jīng)停止,當(dāng)停止之后,再給一定時(shí)間的延時(shí),之后的點(diǎn)擊才有效。這樣的話,當(dāng)快速滾動(dòng)之后,第一次點(diǎn)擊屏幕,讓屏幕滾動(dòng)停止,第二次點(diǎn)擊屏幕,如果是點(diǎn)擊了一個(gè)a標(biāo)簽才能跳轉(zhuǎn)到其他路由。應(yīng)該如何實(shí)現(xiàn)呢。
問(wèn)題解答
回答1:你們產(chǎn)品要求這么苛刻嗎,我感覺(jué)這不應(yīng)該成為問(wèn)題,應(yīng)該遵循這樣的物理邏輯,我是沒(méi)見(jiàn)過(guò)哪個(gè)產(chǎn)品規(guī)避了這個(gè)邏輯。如果非要解決,你的思路是可行的,那樣的話,你需要代理所有鏈接或有點(diǎn)擊行為的元素,個(gè)人認(rèn)為是一種得不償失的做法。
回答2:設(shè)一個(gè)狀態(tài)值就可以,就比如說(shuō),你滾動(dòng)的時(shí)候狀態(tài)值isScrolling = true;當(dāng)滾動(dòng)完成或者被點(diǎn)擊停止時(shí)設(shè)置isScrolling = false. 事件觸發(fā)只能在isScrolling= false時(shí)有效。
回答3:我也處理過(guò)相同的問(wèn)題
區(qū)分點(diǎn)擊事件,點(diǎn)擊事件用touch替換
計(jì)算點(diǎn)擊的時(shí)長(zhǎng)和判斷的距離,兩個(gè)參數(shù),判斷是不是觸發(fā)點(diǎn)擊事件
如果還不清楚的話 我晚點(diǎn)給你一下demo
$(’#allItems’).delegate(’.js-snifferFullNet’,’click touchend’,function(e) { console.log(’touchend test2 數(shù)據(jù)是:’+(document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop)); var endTime = new Date().getTime() - startTime; console.log(endTime); if(e.type==’touchend’ &&((10<endTime)|| (Math.abs(touch_pos-(document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop))>3))) return; else{console.log(this);var type = e.currentTarget.childNodes[2].innerText;regClickBtn.snifferAllNetBtn(type); }});
