1. 程式人生 > >移動端點選穿透和click事件300ms延遲問題

移動端點選穿透和click事件300ms延遲問題

場景描述(類似):
一個頁面裡存在A元素和B元素;B元素浮在A元素之上,A元素裡具有a標籤或者綁定了點選事件或表單元素;點選B元素後,隱藏或者刪除B元素;再B元素隱藏或者刪除的同時觸發A元素裡的a標籤或者點選事件;點選穿透的現象發生;


問題產生的原因分析:
當我們在觸屏上點選某個位置時候的時候,瀏覽器依次響應產生了幾個事件,它們分別是:touchStart、touchEnd、click 事件,且click具有300毫秒的延遲時間。注意:即使你沒有監聽事件,事件依然存在的,瀏覽器預設行為。當單擊B元素時候,事件觸發先後順序是先touchestart->touchend->click , 問題將在這裡出現。
當發生了單擊事件後,touchstart事件先執行B元素被隱藏了,接下來到touchend事件由於速度很快,所以A元素並沒有響應;此時click事件由於延遲了300ms才執行,B元素已經隱藏,click單擊發生了,由於沒有了B元素,瀏覽器實現上會認為當次單擊是對頁面上的某個部分實行的,A元素裡相應的位置的地方(元素)響應了click事件。於是就出現了穿透現象;


注:
給B元素繫結click事件 (點選訪問DEMO) —— 不會穿透;
給B元素繫結touchstart事件 (點選訪問DEMO) ——出現穿透現象
給B元素繫結touchend事件 (點選訪問DEMO) ——出現穿透現象



移動端click事件300毫秒延遲:
使用者在 iOS Safari 裡邊點選了一個連結。由於使用者可以進行雙擊縮放或者雙擊滾動的操作,當用戶一次點選螢幕之後,瀏覽器並不能立刻判斷使用者是確實要開啟這個連結,還是想要進行雙擊操作。因此,iOS Safari 就等待 300 毫秒,以判斷使用者是否再次點選了螢幕。(幾乎現在所有的移動端瀏覽器都有這個雙擊操作的功能,所以...)