出現(xiàn)focus無(wú)效原因:
ios的UIWebView 默認(rèn)的KeyboardDisplayRequiresUserAction為false,設(shè)置為true就行,WKWebView 不支持這個(gè)屬性,如果要從原生入手解決,請(qǐng)參考https://stackoverflow.com/questions/32407185/wkwebview-cant-open-keyboard-for-input-field
解決思路:
從無(wú)效原因可以看出,是鍵盤需要用戶觸發(fā)才能彈出,這導(dǎo)致了autofocus或者element.focus()無(wú)效,所以,在鍵盤彈出的情況下再去focus,或者跳轉(zhuǎn)到帶有autofocus的頁(yè)面也就可以正常focus了
解決方法:
通常的場(chǎng)景是,我們點(diǎn)擊頁(yè)面某個(gè)元素 => 邏輯交互 => 希望focus元素、或者跳轉(zhuǎn)到有aotufocus的頁(yè)面。再這里有個(gè)大前提,就是要有點(diǎn)擊頁(yè)面行為。
第一步:在點(diǎn)擊頁(yè)面時(shí)候,給一個(gè)占位的input進(jìn)行focus,調(diào)起鍵盤;
第二步:邏輯交互、異步操作、settimeout延時(shí)處理等,在處理完成再focus到目標(biāo)input,或者跳轉(zhuǎn)到autofocus的頁(yè)面,就可以正常focus了。
劃重點(diǎn)
只要是點(diǎn)擊事件的回調(diào)就具備focus到input的能力,所以無(wú)論是點(diǎn)擊生成input再focus到這個(gè)input、還是跳轉(zhuǎn)到autofocus的頁(yè)面,先利用點(diǎn)擊focus到一個(gè)占位input調(diào)起鍵盤,在鍵盤存在的情況下調(diào)用element.focus()或者跳轉(zhuǎn)到有autofocus的頁(yè)面就都可以正常focus了。
占位input:
.clip{
position: absolute;
clip: rect(0 0 0 0);
}
<input ref="tempFocus" class="clip">
<div @click="gotoCommentClick">快來(lái)留言吧!</div>
gotoCommentClick() {
this.afterLogin().then(_ => {
this.$refs.tempFocus.focus();
this.$router.push(this.$route.path + '/comment');
})
},
comment.vue
mounted() {
this.$refs.editor.focus();
}
UC瀏覽器上注意事項(xiàng):
uc瀏覽器,如果吊起鍵盤focus的input和延時(shí)再去focus的input不是同一個(gè)input,則第二個(gè)input無(wú)法正常focus,會(huì)出現(xiàn)鍵盤彈起又收起。處理方式是第二focus的input由第一個(gè)input復(fù)制插入到頁(yè)面就可以正常了。