最近在做webapp搜索功能時,用到兩個input同時存在時,輕點input聚焦時,ios手機軟鍵盤彈起又失效,一直在尋找合理的解決辦法,現在最簡單的總結回顧:
<一>bug顯示
<二> 最終測試通過的修改方案
1. 安卓保持不動,原生input當點擊的時候可以自動聚焦;
2. ios單個input的也是正常的,就是兩個input在一起失效;
3. 當兩個input在一起的時候,每一個input外面包裹一層div,里面有一個span標簽。
測試代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div { width: 120px; height:24px; border: 1px solid #ccc; position: relative; } div span { display: block; width: 120px; height:24px; position: absolute; top:0; left:0; } </style> </head> <body> <div> <input type="text" id="iosInput"> <span id="iosContainer"></span> </div> </body> <script type="text/javascript"> iosContainer.addEventListener("click",function(e){ iosInput.focus(); }); </script> </html>
備注: 我最終的代碼結構,在ios手機和安卓手機表現度正常了
ios事件執行代碼
componentDidMount:function(){ if(/(APPLEWEBKIT|Safari|Android)/i.test(this._ua)) { $('.cmr-sr_notice').css({'position':'fixed'}); }else{ iosContainer_01.addEventListener("click",function(e){ iosInput_01.focus(); }); iosContainer_02.addEventListener("click",function(e){ iosInput_02.focus(); }); } },
布局結構
timelyNotice:function(){ var _this = this, iosInput_01='', iosInput_02=''; // ios 通過外部點擊事件來取貨焦點,安卓還保持原生的不動 if(/(APPLEWEBKIT|Safari|Android)/i.test(this._ua)) { iosInput_01 = ( <input type='text' placeholder='書名' maxLength='100' className='co-font-biggest cmr-sr_notice-input' onChange={_this.valChange.bind(_this,1)} value={_this.state.valBookname} onBlur={_this.inputBlur} ref='valBookname' /> ); iosInput_02 = ( <input type='text' placeholder='作者' maxLength='100' className='co-font-biggest cmr-sr_notice-input' onChange={_this.valChange.bind(_this,2)} onBlur={_this.inputBlur} value={_this.state.valAuhtorname} ref='valAuhtorname' /> ) }else { iosInput_01 = ( <div style={{position:'relative'}}> <input type='text' placeholder='書名' maxLength='100' className='co-font-biggest cmr-sr_notice-input' onChange={_this.valChange.bind(_this,1)} value={_this.state.valBookname} id='iosInput_01' onBlur={_this.inputBlur} ref='valBookname' /> <span id='iosContainer_01' style={{display:'block',width:'100%',height:'100%',position:'absolute',top:'0',left:'0'}}></span> </div> ); iosInput_02 = ( <div style={{position:'relative'}}> <input type='text' placeholder='作者' maxLength='100' className='co-font-biggest cmr-sr_notice-input' onChange={_this.valChange.bind(_this,2)} onBlur={_this.inputBlur} id='iosInput_02' value={_this.state.valAuhtorname} ref='valAuhtorname' /> <span id='iosContainer_02' style={{display:'block',width:'100%',height:'100%',position:'absolute',top:'0',left:'0'}}></span> </div> ) } /**/ return( <section className='cmr-sr_notice' style={{display:_this.state.timelyNotice}}> <div className='cmr-sr_notice-con' ref='mainPupop'> <p className='co-font-large cmr-sr_notice-title'>填寫書籍信息</p> {iosInput_01} <img src={_this.state.close_img} className='cmr-sr_notice-img' style={{"display":_this.state.close_button_01?"block":"none"}} onClick={_this.emptyInput.bind(_this,1)} /> {iosInput_02} <img src={_this.state.close_img} className='cmr-sr_notice-img cmr-sr_notice-img2' style={{"display":_this.state.close_button_02?"block":"none"}} onClick={_this.emptyInput.bind(_this,2)} /> <p className='co-font-normal cmr-sr_notice-pro'>~ 該書上架后將第一時間通知您 ~</p> <div className='co-font-largest cmr-sr_notice-sure'> <span className='cmr-sr_notice-no' onClick={_this.closePupop}>取消</span> <span style={{color:_this.state.colorConfirm}} className='cmr-sr_notice-yes' onClick={_this.propmtBook}>提交</span> </div> </div> </section> ) },