在 Android 手機瀏覽器中,當使用者點擊輸入框彈出軟鍵盤時,頁面底部的表單欄位被鍵盤遮蓋,導致使用者無法看見輸入內容或點擊送出按鈕。監聽 keydown/keyup 事件無法捕捉鍵盤上的「隱藏/完成」鍵(keyCode 均為 0),resize 事件在部分機型也不可靠。
軟鍵盤彈出/收起會改變 window.innerHeight。利用 setInterval 定時檢測高度變化,即可判斷鍵盤狀態。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
</head>
<body>
<input type="text" id="txt" placeholder="點擊輸入..." />
<div id="dv" style="margin-top:20px; color:#333;"></div>
<script>
var timer, windowInnerHeight;
function eventCheck(e) {
if (e) { // 由 focus/blur/click 觸發
$('#dv').html('Android 鍵盤' + (e.type === 'focus' ? '彈出' : '隱藏') + ' -- 透過 ' + e.type + ' 事件');
if (e.type === 'click') {
// 點擊輸入框時啟動定時器,等待鍵盤動畫結束
setTimeout(function() {
windowInnerHeight = window.innerHeight; // 記錄鍵盤彈出後的高度
timer = setInterval(eventCheck, 100); // 開始輪詢
}, 500);
} else {
clearInterval(timer); // blur 時停止輪詢
}
} else { // 由定時器觸發
// 若視窗高度變大,表示鍵盤已收起(使用者按下隱藏鍵)
if (window.innerHeight > windowInnerHeight) {
clearInterval(timer);
$('#dv').html('Android 鍵盤隱藏 -- 偵測到視窗高度增加');
}
}
}
$('#txt').on('click focus blur', eventCheck);
</script>
</body>
</html>
window.innerHeight。click(啟動輪詢)、focus/blur(輔助顯示狀態)。position: fixed; bottom: 0 讓關鍵按鈕固定在可視區底部(需注意 iOS 鍵盤彈出時 fixed 定位失效問題)。visualViewport API(現代瀏覽器支援)精確獲取可視區尺寸變化。cordova-plugin-ionic-keyboard(Hybrid App)或 react-native-keyboard-aware-scroll-view(React Native)。透過定時器監測 window.innerHeight 變化,是目前純 Web 端偵測 Android 軟鍵盤隱藏/顯示最穩健的通用方案。結合適當的 CSS 佈局,可有效解決表單被遮擋的體驗問題。