54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
![]() |
import { isIOS } from '@tencentcloud/universal-api';
|
|||
|
const ua = navigator.userAgent;
|
|||
|
|
|||
|
function getScrollTypeByPlatform() {
|
|||
|
if (isIOS) {
|
|||
|
if (/Safari\//.test(ua) || /IOS 11_[0-3]\D/.test(ua)) {
|
|||
|
// Safari IOS 11.0-11.3 exclude(`scrollTop`/`scrolIntoView` not working)
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// IOS: use `scrollTop`
|
|||
|
return 1;
|
|||
|
}
|
|||
|
// Android: use `scrollIntoView`
|
|||
|
return 2;
|
|||
|
}
|
|||
|
|
|||
|
export default function riseInput(input: HTMLElement, target?: HTMLElement) {
|
|||
|
const scrollType = getScrollTypeByPlatform();
|
|||
|
let scrollTimer: ReturnType<typeof setTimeout>;
|
|||
|
|
|||
|
if (!target) {
|
|||
|
// eslint-disable-next-line no-param-reassign
|
|||
|
target = input;
|
|||
|
}
|
|||
|
|
|||
|
const scrollIntoView = () => {
|
|||
|
if (scrollType === 0) return;
|
|||
|
if (scrollType === 1) {
|
|||
|
document.body.scrollTop = document.body.scrollHeight;
|
|||
|
} else {
|
|||
|
target?.scrollIntoView(false);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
input.addEventListener('focus', () => {
|
|||
|
const timer = setTimeout(() => {
|
|||
|
scrollIntoView();
|
|||
|
clearTimeout(timer);
|
|||
|
}, 300);
|
|||
|
scrollTimer = setTimeout(scrollIntoView, 1000);
|
|||
|
});
|
|||
|
|
|||
|
input.addEventListener('blur', () => {
|
|||
|
clearTimeout(scrollTimer);
|
|||
|
// Handle IOS issues about keyboard is hidden but page not refreshed
|
|||
|
if (scrollType && isIOS) {
|
|||
|
const timer = setTimeout(() => {
|
|||
|
document.body.scrollIntoView();
|
|||
|
clearTimeout(timer);
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
}
|