總結(jié)幾個移動端H5軟鍵盤的大坑
1. 部分機(jī)型軟鍵盤彈起擋住原來的視圖
解決方法:可以通過監(jiān)聽移動端軟鍵盤彈起。
Element.scrollIntoView() 方法讓當(dāng)前的元素滾動到瀏覽器窗口的可視區(qū)域內(nèi)。參數(shù)如下:
- true,表示元素的頂部與當(dāng)前區(qū)域的可見部分的頂部對齊
 - false,表示元素的底部與當(dāng)前區(qū)域的可見部分的尾部對齊
 
Element.scrollIntoViewIfNeeded()方法也是用來將不在瀏覽器窗口的可見區(qū)域內(nèi)的元素滾動到瀏覽器窗口的可見區(qū)域。但如果該元素已經(jīng)在瀏覽器窗口的可見區(qū)域內(nèi),則不會發(fā)生滾動。此方法是標(biāo)準(zhǔn)的Element.scrollIntoView()方法的專有變體。
- window.addEventListener('resize', function() {
 - if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') {
 - window.setTimeout(function() {
 - if ('scrollIntoView' in document.activeElement) {
 - document.activeElement.scrollIntoView(false)
 - } else {
 - document.activeElement.scrollIntoViewIfNeeded(false)
 - }
 - }, 0)
 - }
 - })
 
2. ios 鍵盤收起時頁面沒有回落,底部會留白
部分蘋果手機(jī)填寫表單的時候的,輸入內(nèi)容后關(guān)閉軟鍵盤,底部會留一塊空白。這種情況可以通過監(jiān)聽鍵盤回落時間滾動到原來的位置。
- window.addEventListener('focusout', function() {
 - window.scrollTo(0, 0)
 - })
 - //input輸入框彈起軟鍵盤的解決方案。
 - var bfscrolltop = document.body.scrollTop
 - $('input')
 - .focus(function() {
 - documentdocument.body.scrollTop = document.body.scrollHeight
 - //console.log(document.body.scrollTop);
 - })
 - .blur(function() {
 - document.body.scrollTop = bfscrolltop
 - //console.log(document.body.scrollTop);
 - })
 
3. onkeyUp 和 onKeydown 兼容性問題
部分 ios 機(jī)型 中 input 鍵盤事件 keyup、keydown、等支持不是很好, 用 input 監(jiān)聽鍵盤 keyup 事件,在安卓手機(jī)瀏覽器中沒有問題,但是在 ios 手機(jī)瀏覽器中用輸入法輸入之后,并未立刻相應(yīng) keyup 事件:
- onkeypress 用戶按下并放開任何字母數(shù)字鍵時發(fā)生。系統(tǒng)按鈕(箭頭鍵和功能鍵)無法得到識別。
 - onkeyup 用戶放開任何先前按下的鍵盤鍵時發(fā)生。
 - onkeydown 用戶按下任何鍵盤鍵(包括系統(tǒng)按鈕,如箭頭鍵和功能鍵)時發(fā)生。
 
4. ios12 輸入框難以點(diǎn)擊獲取焦點(diǎn),彈不出軟鍵盤
定位找到問題是 fastclick.js 對 ios12 的兼容性,可在 fastclick.js 源碼或者 main.js 做以下修改:
- FastClick.prototype.focus = function(targetElement) {
 - var length
 - if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {
 - length = targetElement.value.length
 - targetElement.setSelectionRange(length, length)
 - targetElement.focus()
 - } else {
 - targetElement.focus()
 - }
 - }
 
5. fastclick 導(dǎo)致下拉框焦點(diǎn)沖突
移動端使用 fastclick 之后,在 ios 環(huán)境下,有幾個連續(xù)的下拉框 第一個 select 框突然填充了第二個下拉框的內(nèi)容。
根本原因是 Fastclick 導(dǎo)致 ios 下多個 select ,點(diǎn)擊某一個,焦點(diǎn)不停變換的 bug。修改源碼,在 onTouchStart 事件內(nèi)判斷設(shè)備是否為 ios,再判斷當(dāng)前 nodeName 是否為 select,如果是 return false 去阻止 fastClick 執(zhí)行其他事件。
- //line 391行
 - FastClick.prototype.onTouchStart = function(event) {
 - //在其方法中添加判斷 符合ios select的時候 不返回事件
 - if (deviceIsIOS && this.targetElement == 'select') this.targetElement = null
 - event.preventDefault()
 - }
 - //line521 或者講源碼中 有關(guān)touchEnd判斷非ios或者非select的事件注釋,
 - if (!deviceIsIOS || targetTagName !== 'select') {
 - this.targetElement = null
 - event.preventDefault()
 - }
 
6. ios 下 fixed 失效的原因
軟鍵盤喚起后,頁面的 fixed 元素將失效,變成了 absolute,所以當(dāng)頁面超過一屏且滾動時,失效的 fixed 元素就會跟隨滾動了。不僅限于 type=text 的輸入框,凡是軟鍵盤(比如時間日期選擇、select 選擇等等)被喚起,都會遇到同樣地問題。
解決方法: 不讓頁面滾動,而是讓主體部分自己滾動,主體部分高度設(shè)為 100%,overflow:scroll
- <body>
 - <div class='warper'>
 - <div class='main'></div>
 - <div>
 - <div class="fix-bottom"></div>
 - </body>
 
- .warper {
 - position: absolute;
 - width: 100%;
 - left: 0;
 - right: 0;
 - top: 0;
 - bottom: 0;
 - overflow-y: scroll;
 - -webkit-overflow-scrolling: touch; /* 解決ios滑動不流暢問題 */
 - }
 - .fix-bottom {
 - position: fixed;
 - bottom: 0;
 - width: 100%;
 - }
 
7. ios 鍵盤換行變?yōu)樗阉?/strong>
- input type="search"
 - input 外面套 form,必須要有 action,action="javascript:return true"
 - 表單提交阻止默認(rèn)提交事件
 
- <form action="javascript:return true" @submit.prevent="formSubmit">
 - <input type="search" placeholder="請輸入訴求名稱" id="search" />
 - </form>
 















 
 
 










 
 
 
 