最近ios發佈新版本系統12.1,隨着部分用戶的系統更新,一些問題也漸漸暴露出來。。。ios
公司作個活動頁,在ios系統中彈出登陸界面,在鍵盤彈出再收起後,反應點擊區域會無效瀏覽器
在H5端是無法監控鍵盤的彈出與收起的,resize事件觸發的機型極其有限,況且我在ios中實測沒有觸發,安卓反而能夠。由於安卓彈起鍵盤時會修改視窗的大小,可是ios並不會,若是你在ios上設置一個100%高度的body,彈起鍵盤後你會發現這個body是能夠上下滾動的,即100%高度的body超出了視窗。app
如圖所示,點擊輸入手機號以後,在收起鍵盤以後,驗證碼輸入框點擊區域都不觸發事件了,若是往手機號上面的視圖區域再點擊,會觸發驗證碼等點擊事件iphone
推測是body沒有正確從新渲染,致使點擊事件不處於body內而沒法觸發。因此再正確推回來應該就能夠解決了測試
(/iphone|ipod|ipad/i.test(navigator.appVersion)) && document.addEventListener('blur', (e) => { document.body && (document.body.scrollTop = document.body.scrollTop); }, true)
在input輸入框失去焦點的鉤子中設置滾動到原有位置(document.body.scrollTop = document.body.scrollTop)
,觸發瀏覽器的重繪,使的錯誤的渲染回覆正常,滾動位置也不會有改變,沒有影響體驗。3d
覺得問題就此解決,可是又有新的問題,若是點擊手機號輸入框以後,再點擊驗證碼輸入框,視圖會往下又立馬往上,感受體驗有點怪怪的。code
修改代碼blog
var iscanscrollpage = false; (/iphone|ipod|ipad/i.test(navigator.appVersion)) && document.addEventListener('blur', (e) => { // 這裏加了個類型判斷,由於a等元素也會觸發blur事件 if(['input', 'textarea'].includes(e.target.localName)) { iscanscrollpage = true; setTimeout(function() { if(iscanscrollpage) { document.body && (document.body.scrollTop = document.body.scrollTop); } }, 200); } }, true) $("#userphone").focus(function() { iscanscrollpage = false; }); $("#logincode").focus(function() { iscanscrollpage = false; });
延遲200ms執行,主要用iscanscrollpage來判斷是否切換輸入了輸入框,測試解決問題。事件
補充:用document.body.scrollIntoView(false)方法也能夠ip