Редагувати: Документовано Apple, хоча я фактично не міг змусити його працювати: WKWebView Behavior with Keyboard Display : "В iOS 10 об'єкти WKWebView відповідають власній поведінці Safari, оновивши властивість window.innerHeight, коли клавіатура відображається, і не дзвоніть змінити розмір подій "(можливо, можна використовувати фокус або фокус плюс затримку для виявлення клавіатури замість зміни розміру).
Редагувати: код передбачає екранну клавіатуру, а не зовнішню клавіатуру. Залишаючи її, оскільки інформація може бути корисною іншим, хто хвилює лише екранні клавіатури. Використовуйте http://jsbin.com/AbimiQup/4 для перегляду парам сторінки.
Ми перевіряємо, чи document.activeElement
є елементом, який показує клавіатуру (тип вводу = текст, текстова область тощо).
У наведеному нижче коді викриваються речі для наших цілей (хоча вони взагалі не вірні).
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');
};
Наведений вище код є лише приблизним: він неправильний для розбитої клавіатури, незакріпленої клавіатури, фізичної клавіатури. Відповідно до коментаря вгорі, ви можете зробити кращу роботу, ніж заданий код на Safari (з iOS8?) Або WKWebView (з iOS10), використовуючи window.innerHeight
властивість.
Я виявив невдачі за інших обставин: наприклад, зосередьтесь на введенні, потім перейдіть на головний екран, а потім поверніться на сторінку; iPad не повинен зменшити вікно перегляду; старі браузери IE не працюватимуть, Opera не працювала, оскільки Opera залишала фокус на елементі після закриття клавіатури.
Однак відповідь з міткою (зміна вершини прокрутки для вимірювання висоти) має неприємні побічні ефекти інтерфейсу користувача, якщо область перегляду масштабується (або в налаштуваннях активовано зусилля масштабування). Я не використовую іншого запропонованого рішення (зміна прокрутки), оскільки в iOS, коли область перегляду масштабується та прокручується до зосередженого вводу, між прокруткою та збільшенням та фокусуванням спостерігаються помилкові взаємодії (які можуть залишати точно зосереджений вхід поза вікном перегляду - не видно).