解决ios 输入后键盘收起,页面卡住不回落、fixed定位元素随键盘弹起。andriod键盘弹起时,输入框被遮盖、fixed定位元素随键盘弹起等bug

前言:最近在写h5,发现以下几个问题
1.iphone xs设备上,input框或textarea框输入弹起键盘后,点击确定收回键盘时,键盘消失,但是键盘所占的框还在,页面没有回落。
2.ios和andriod设备上fixed定位元素随键盘弹起。
解决ios 输入后键盘收起,页面卡住不回落、fixed定位元素随键盘弹起。andriod键盘弹起时,输入框被遮盖、fixed定位元素随键盘弹起等bug_第1张图片解决ios 输入后键盘收起,页面卡住不回落、fixed定位元素随键盘弹起。andriod键盘弹起时,输入框被遮盖、fixed定位元素随键盘弹起等bug_第2张图片

3.andriod键盘弹起时,页面未随着键盘弹起而向上移,导致输入框被遮盖
本文主要解决上诉三个问题
问题分析:ios可以通过监听onBlur(键盘收起)和onFocus(键盘弹出)来模拟获取键盘的弹出和收起事件,因为ios键盘收起的时候会触发onBlur失去焦点。但是andriod却无法通过onBlur和onFocus事件取监听键盘的弹出和收起,因为andriod键盘收起的时候并没有像ios一样会让input框失去焦点,它依旧在focus状态。所有andriod需要通过resize事件监听到键盘的弹出和收起。
我把所有的问题都集中在一起了,有需要的对应着问题找代码中备注就可以了找到具体的bug解决方案,如果还是无法解决或找到,留言给我就可以。

import React, { Component } from 'react'
import { List, InputItem, Toast,Icon,Button,Tag,Flex } from 'antd-mobile';
import $ from  'jquery'

class Input extends Component{
	constructor(props) {
        super(props);
        this.state = {
            isIOS:false,
            clientHeight: 0,
        };
	}
	componentWillMount(){  
 
	}
	componentDidMount(){
        const isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //  ios终端
        this.setState({
            isIOS:isIOS,
        })
        let clientHeight = document.documentElement.clientHeight || document.body.clientHeight
        this.setState({ clientHeight })
        window.addEventListener('resize', this.resize)//添加监听事件
    }
    resize = () => {//监听andriod键盘弹出和收起事件
        let clientHeight = document.documentElement.clientHeight || document.body.clientHeight
        if (this.state.clientHeight > clientHeight) { //键盘弹出
          this.onKeyboardPopUp()
        } else { //键盘收起
          this.onKeyboardPopDown()
        }
    }
    onKeyboardPopUp = () => { //键盘弹出要处理的事情
        $('.footer').css({'opacity':'0','display':'none','position':'static'})//解决andriod 固定定位随着键盘弹起的问题
    }
    onKeyboardPopDown = () => {//键盘收起要处理的事情
        $('.footer').css({'opacity':'1','display':'block','position':'fixed'})//解决andriod 固定定位随着键盘弹起的问题
    }
    
    onFocus =()=>{
    	const { isIOS } = this.state
        $('.footer').css({'opacity':'0','display':'none','position':'static'})//解决ios固定定位随着键盘弹起的问题
        if(!isIOS){//如果是andriod手机才做处理,ios无需处理
	         let input = $('#input')[0]
	         input.scrollIntoView()   //解决键盘弹出页面不上移,导致input框被遮挡问题
	         window.scroll(0,window.scrollY-50) //防止键盘弹出页面上移到最顶部,让它保持距离顶部一定距离
        }
    }
	onBlur =(obj)=>{//只有ios键盘收起时会触发失去焦点事件,andriod键盘收起不触发失去焦点事件
        $('.historyBtn,.footer').css({'opacity':'1','display':'block','position':'fixed'})//解决ios 固定定位随着键盘弹起的问题
         window.scroll(0,window.scrollY) //解决键盘收起页面卡住不会落问题
    }
 
	componentWillUnmount() {
        window.removeEventListener('resize', this.resize)//移除监听事件
    }
	render(){
        return (
          
) } } export default Input;

你可能感兴趣的:(H5,app端,微信公众号)