Edycja: udokumentowane przez Apple, chociaż nie mogłem go uruchomić: Zachowanie WKWebView z wyświetlaczami klawiatury : „W systemie iOS 10 obiekty WKWebView pasują do natywnego zachowania Safari, aktualizując ich właściwość window.innerHeight, gdy klawiatura jest wyświetlana, i nie wywołują zdarzenia zmiany rozmiaru ”(może użyć fokusu lub fokusu z opóźnieniem do wykrywania klawiatury zamiast zmiany rozmiaru).
Edycja: kod zakłada klawiaturę ekranową, a nie zewnętrzną. Zostawiam to, ponieważ informacje mogą być przydatne dla innych, którzy interesują się tylko klawiaturami ekranowymi. Użyj http://jsbin.com/AbimiQup/4, aby wyświetlić parametry strony.
Testujemy, czy document.activeElement
jest to element, który pokazuje klawiaturę (typ wejścia = tekst, obszar tekstowy itp.).
Poniższy kod fałszuje rzeczy dla naszych celów (chociaż ogólnie nie jest to poprawne).
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');
};
Powyższy kod jest tylko przybliżony: jest nieprawidłowy dla podzielonej klawiatury, niezadokowanej klawiatury, klawiatury fizycznej. Zgodnie z komentarzem u góry, możesz być w stanie wykonać lepszą pracę niż podany kod w Safari (od iOS8?) Lub WKWebView (od iOS10) przy użyciu window.innerHeight
właściwości.
Znalazłem awarie w innych okolicznościach: np. Skup się na wprowadzaniu, a następnie przejdź do ekranu głównego, a następnie wróć do strony; iPad nie powinien zmniejszać widocznego obszaru; stare przeglądarki IE nie będą działać, Opera nie działała, ponieważ Opera skupiała się na elemencie po zamknięciu klawiatury.
Jednak oznaczona odpowiedź (zmiana przewijania w celu pomiaru wysokości) ma nieprzyjemne efekty uboczne interfejsu użytkownika, jeśli można powiększać widok (lub powiększanie wymuszone w preferencjach). Nie używam innego sugerowanego rozwiązania (zmiana przewijania), ponieważ na iOS, gdy widok jest powiększalny i przewijany do skoncentrowanego wejścia, występują błędne interakcje między przewijaniem, powiększaniem i ostrością (które mogą pozostawić skoncentrowane wejście poza rzutnią - nie widoczny).