click事件延遲300ms以及點擊穿透的原因及解決


 移動端click事件延遲300ms的原因

這要追溯至 2007 年初。蘋果公司在發布首款 iPhone 前夕,遇到一個問題—— 當時的網站都是為大屏幕設備所設計的。於是蘋果的工程師們做了一些約定,應對 iPhone這種小屏幕瀏覽桌面端站點的問題。這當中最出名的,當屬雙擊縮放(double tap to zoom)。這也是會有上述 300 毫秒延遲的主要原因。當用戶一次點擊屏幕之后,瀏覽器並不能立刻判斷用戶是要進行雙擊縮放,還是想要進行單擊操作。因此,iOS Safari 就等待 300 毫秒,以判斷用戶是否再次點擊了屏幕。

以及解決辦法

禁用縮放:簡單,但同時也使的網頁無法縮放,不適用於未對移動端瀏覽做適配優化的網頁。
更改默認視口寬度:簡單,但需要瀏覽器支持。
指針事件和css touch-action:新屬性,可能存在瀏覽器兼容問題,如僅為解決點擊延遲問題兒引入一整套指針事件有點過了。
tap事件:能較好解決點擊延遲,並且對其他移動端觸摸事件也有較好支持,但存在點透問題,不知最新版是否解決。
fastclick:當前較好的專門解決點擊延遲的庫,腳本尺寸相對較大。
基本原理:FastClick的實現原理是在檢測到touchend事件的時候,會通過DOM自定義事件立即出發模擬一個click事件,並把瀏覽器在300ms之后真正的click事件阻止掉。

點擊穿透發生的條件

A 和 B不是后代繼承關系(如果是后代繼承關系的話,就直接是冒泡子類的話題了)

A發生touch, A touch后立即消失, B事件綁定click

A z-index大於B,即A顯示在B浮層之上

解析:

事件執行順序,touchstart -> touchmove -> touchend -> click
當手指觸摸到屏幕的時候,系統生成兩個事件,一個是touch 一個是click,touch先執行,touch執行完成后,A從文檔樹上面消失了,而且由於移動端click還有延遲200-300ms的關系,當系統要觸發click的時候,發現在用戶點擊的位置上面,目前離用戶最近的元素是B,所以就直接把click事件作用在B元素上面了.
解決方法:

只用touch或只用click,注意a標簽的href也是click,需要去掉換成js控制的跳轉

fastclick:在沒有標記使用click的元素上,阻止click事件的派發,即阻止事件冒泡。將click事件在外層父盒子就隔斷。

在項目中,某些用touchend事件作為click事件補充的兄弟,點擊穿透的事情你遇見了嗎?如果用到touch事件,在一些效果實現上面,使用touchstart事件會比touchend事件給人的感覺靈敏!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM