Chỉnh sửa: Tài liệu của Apple mặc dù tôi thực sự không thể làm cho nó hoạt động: WKWebView Hành vi với bàn phím Hiển thị : "Trong iOS 10, các đối tượng WKWebView khớp với hành vi gốc của Safari bằng cách cập nhật thuộc tính window.innerHeight khi bàn phím được hiển thị và không gọi thay đổi kích thước sự kiện "(có lẽ có thể sử dụng tiêu điểm hoặc tiêu điểm cộng với độ trễ để phát hiện bàn phím thay vì sử dụng thay đổi kích thước).
Chỉnh sửa: mã giả định bàn phím trên màn hình, không phải bàn phím ngoài. Rời khỏi nó vì thông tin có thể hữu ích cho những người khác chỉ quan tâm đến bàn phím trên màn hình. Sử dụng http://jsbin.com/AbimiQup/4 để xem thông số trang.
Chúng tôi kiểm tra xem liệu document.activeElement
phần tử có hiển thị bàn phím không (kiểu nhập = văn bản, textarea, v.v.).
Đoạn mã sau làm mờ đi mọi thứ cho mục đích của chúng tôi (mặc dù nói chung không chính xác).
function getViewport() {
if (window.visualViewport && /Android/.test(navigator.userAgent)) {
// https://developers.google.com/web/updates/2017/09/visual-viewport-api Note on desktop Chrome the viewport subtracts scrollbar widths so is not same as window.innerWidth/innerHeight
return {
left: visualViewport.pageLeft,
top: visualViewport.pageTop,
width: visualViewport.width,
height: visualViewport.height
};
}
var viewport = {
left: window.pageXOffset, // http://www.quirksmode.org/mobile/tableViewport.html
top: window.pageYOffset,
width: window.innerWidth || documentElement.clientWidth,
height: window.innerHeight || documentElement.clientHeight
};
if (/iPod|iPhone|iPad/.test(navigator.platform) && isInput(document.activeElement)) { // iOS *lies* about viewport size when keyboard is visible. See http://stackoverflow.com/questions/2593139/ipad-web-app-detect-virtual-keyboard-using-javascript-in-safari Input focus/blur can indicate, also scrollTop:
return {
left: viewport.left,
top: viewport.top,
width: viewport.width,
height: viewport.height * (viewport.height > viewport.width ? 0.66 : 0.45) // Fudge factor to allow for keyboard on iPad
};
}
return viewport;
}
function isInput(el) {
var tagName = el && el.tagName && el.tagName.toLowerCase();
return (tagName == 'input' && el.type != 'button' && el.type != 'radio' && el.type != 'checkbox') || (tagName == 'textarea');
};
Đoạn mã trên chỉ là gần đúng: Đó là sai đối với bàn phím tách, bàn phím không khóa, bàn phím vật lý. Theo nhận xét ở đầu, bạn có thể thực hiện công việc tốt hơn mã đã cho trên Safari (kể từ iOS8?) Hoặc WKWebView (kể từ iOS10) bằng cách sử dụng thuộc window.innerHeight
tính.
Tôi đã tìm thấy thất bại trong các trường hợp khác: ví dụ: tập trung vào đầu vào, sau đó vào màn hình chính rồi quay lại trang; iPad không nên làm cho khung nhìn nhỏ hơn; Các trình duyệt IE cũ sẽ không hoạt động, Opera không hoạt động vì Opera tiếp tục tập trung vào phần tử sau khi đóng bàn phím.
Tuy nhiên, câu trả lời được gắn thẻ (thay đổi cuộn để đo chiều cao) có tác dụng phụ UI khó chịu nếu chế độ xem có thể phóng to (hoặc thu phóng lực trong tùy chọn). Tôi không sử dụng giải pháp được đề xuất khác (thay đổi cuộn) vì trên iOS, khi chế độ xem có thể phóng to và cuộn sang đầu vào tập trung, có các tương tác lỗi giữa cuộn & thu phóng & lấy nét (có thể để đầu vào chỉ tập trung bên ngoài chế độ xem - không có thể nhìn thấy).