blog icon indicating copy to clipboard operation
blog copied to clipboard

移动端监听软键盘弹出和收起,区分Android和IOS

Open xianzou opened this issue 3 years ago • 0 comments

移动端监听软键盘弹出和收起,区分Android和IOS

实现监听移动端软键盘弹出和收起,并可以获取到软键盘的高度,IOS可以采用底部放置输入框来实现位置差的变化

代码

export const useKeyboard  = (nodeClassName, keyWordUp, keyWordDown) => {

    const originHeight = document.documentElement.clientHeight || document.body.clientHeight;
    const screenHieght = useRef(0);
    // 上一次键盘弹起之后的屏幕的值
    const prevHieght = useRef(0);

    const allNodeClassName = document.querySelector(nodeClassName);

    if (allNodeClassName){
        screenHieght.current = allNodeClassName.getBoundingClientRect().top;
        // showToast(`${screenHieght.current}-nodeTop`);
    }

    const iosFocusinHandler  = () => {
        // 键盘展开
        setTimeout(() => {
            const nodeHeight = document.querySelector(nodeClassName);

            if (nodeHeight){
                const nodeTop = nodeHeight.getBoundingClientRect().top;
                const sum = screenHieght.current - nodeTop;

                prevHieght.current = sum;
                keyWordUp();
            }
        }, 300);
    };
    const iosFocusoutHandler  = () => {
        // 键盘收起
        setTimeout(() => {
            keyWordDown();
            prevHieght.current = 0;
        }, 100);
    };
    const resizeHandler = () => {
        const resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;

        if (resizeHeight < originHeight) {
            // 键盘弹起后逻辑
            const val = originHeight - resizeHeight;

            prevHieght.current = val;
            setTimeout(() => {
                keyWordUp(val);
            }, 100);
        } else {
            // 键盘收起后逻辑
            setTimeout(() => {
                keyWordDown(prevHieght.current);
                prevHieght.current = 0;
            }, 100);
        }

    };

    useEffect(() => {
        const terminal = getTerminalType();

        if (terminal === 'IOS'){
            document.body.addEventListener('focusin', iosFocusinHandler);
            document.body.addEventListener('focusout', iosFocusoutHandler);
        }
        if (terminal === 'ANDROID'){

            window.addEventListener('resize', resizeHandler);
        }
        return () => {
            if (terminal === 'IOS'){
                document.body.removeEventListener('focusin', iosFocusinHandler);
                document.body.removeEventListener('focusout', iosFocusoutHandler);
            }
            if (terminal === 'ANDROID'){
                window.removeEventListener('resize', resizeHandler);
            }
        };
    }, []);//eslint-disable-line
};

使用

import { useKeyboard } from '@/utils/hooks';

const List =() => {
    useKeyboard('.commitWrap', keyWordUp, keyWordDown);
    return (
    	<div>sss</div>
    )
}

xianzou avatar Mar 10 '21 03:03 xianzou