移動端瀏覽器的默認顯示寬度是980px(不一樣機型各異,但相差不大),而不是屏幕的寬度(320px或其餘)。爲了對早期普通網頁更好的體驗,iphone設計了雙擊放大顯示的功能--這就是300ms延遲的來源:若是用戶一次點擊後300ms內沒有其餘操做,則認爲是個單擊行爲;不然爲雙擊放大行爲。css
假設有兩個層級,A和B;A在上面,B在下面。 若是A監聽touch事件(zepto的tap事件),並且B上有個連接(或者監聽click事件),那麼當touch A後,前後觸發了touchStart和touchEnd事件,touchEnd後A層隱藏,而此刻會觸發在document最前面B的click事件;這就是點透行爲。html
user-scalable=no
。 不能縮放就不會有雙擊縮放操做,所以click事件也就沒了300ms延遲,這個是Chrome首先在Android中提出的。width=device-width
。Chrome 開發團隊不久前宣佈,在 Chrome 32 這一版中,他們將在包含 width=device-width 或者置爲比 viewport 值更小的頁面上禁用雙擊縮放。固然,沒有雙擊縮放就沒有 300 毫秒點擊延遲。touch-action:none
,根據規範,touch-action 屬性決定
鑑於上述的3種解決方案,如今較爲通用的meta設置爲:git
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> 複製代碼
上述的3種解決方案能夠解決Chrome Android和IE10+下的300ms問題,可是對其餘瀏覽器還須要特定的解決方案。github
現階段FastClick被更多使用,藉助它經過監聽click事件,便可消除300ms的問題。
經過閱讀源碼可知:瀏覽器
ontouchstart
事件的瀏覽器user-scalable="no"
clickEvent = document.createEvent('MouseEvents'); initMouseEvent; dispatchEvent
手動觸發click事件。