appKeyboardState.js
(function () {
const VIEWPORT_VS_SCREEN_HEIGHT_RATIO = 0.75
const HEIGHT_DELTA_THRESHOLD = 100
let initialInnerHeight = window.innerHeight
let keyboardVisible = false
let listenersAttached = false
function detectKeyboardState() {
const visualHeight = window.visualViewport?.height * window.visualViewport?.scale || window.innerHeight
const screenHeight = window.screen.height
const ratio = visualHeight / screenHeight
const heightDelta = initialInnerHeight - window.innerHeight
const isKeyboardVisible = ratio < VIEWPORT_VS_SCREEN_HEIGHT_RATIO || heightDelta > HEIGHT_DELTA_THRESHOLD
if (isKeyboardVisible && !keyboardVisible) {
keyboardVisible = true
console.debug('keyboard opened')
document.dispatchEvent(new Event('keyboardDidShow'))
} else if (!isKeyboardVisible && keyboardVisible) {
keyboardVisible = false;
console.debug('keyboard closed')
document.dispatchEvent(new Event('keyboardDidHide'))
}
}
function attachKeyboardListeners() {
if (listenersAttached) {
return
}
const inputs = document.querySelectorAll('input, textarea')
inputs.forEach((el) => {
el.addEventListener('focus', () => setTimeout(detectKeyboardState, 300))
el.addEventListener('blur', () => setTimeout(detectKeyboardState, 300))
})
if ('visualViewport' in window) {
window.visualViewport.addEventListener('resize', detectKeyboardState)
}
window.addEventListener('orientationchange', () => {
setTimeout(() => {
initialInnerHeight = window.innerHeight
}, 500)
})
listenersAttached = true
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', attachKeyboardListeners)
} else {
attachKeyboardListeners()
}
window.KeyboardStateMonitor = {
init: attachKeyboardListeners,
isVisible: () => keyboardVisible,
}
})()
사용 예시
// 1. 키보드 열림/닫힘 이벤트 리스닝
document.addEventListener('keyboardDidShow', () => {
console.log('키보드가 열렸습니다!');
// 원하는 동작 수행
});
document.addEventListener('keyboardDidHide', () => {
console.log('키보드가 닫혔습니다!');
// 원하는 동작 수행
});
// 2. 현재 키보드 상태 확인
if (window.KeyboardStateMonitor.isVisible()) {
console.log('키보드가 현재 열려있습니다');
}'javascript' 카테고리의 다른 글
| 자바스크립트 얕은 복사, 깊은 복사 (0) | 2022.12.02 |
|---|
댓글