Bearbeiten: Von Apple dokumentiert, obwohl ich es nicht zum Laufen bringen konnte: WKWebView- Verhalten mit Tastaturanzeigen : "In iOS 10 entsprechen WKWebView-Objekte dem nativen Verhalten von Safari, indem sie ihre window.innerHeight-Eigenschaft aktualisieren, wenn die Tastatur angezeigt wird, und rufen nicht auf Ereignisse in der Größe ändern "(kann möglicherweise Fokus oder Fokus plus Verzögerung verwenden, um die Tastatur zu erkennen, anstatt die Größe zu ändern).
Bearbeiten: Code setzt Bildschirmtastatur voraus, keine externe Tastatur. Lassen Sie es, weil Informationen für andere nützlich sein können, die sich nur für Bildschirmtastaturen interessieren. Verwenden Sie http://jsbin.com/AbimiQup/4 , um Seitenparameter anzuzeigen.
Wir testen, ob document.activeElement
es sich um ein Element handelt, das die Tastatur anzeigt (Eingabetyp = Text, Textbereich usw.).
Der folgende Code fummelt Dinge für unsere Zwecke (obwohl nicht allgemein korrekt).
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');
};
Der obige Code ist nur ungefähr: Er ist falsch für geteilte Tastatur, nicht angedockte Tastatur und physische Tastatur. Laut Kommentar oben können Sie möglicherweise einen besseren Job als den angegebenen Code auf Safari (seit iOS8?) Oder WKWebView (seit iOS10) mit machenwindow.innerHeight
Eigenschaft .
Ich habe unter anderen Umständen Fehler festgestellt: z. B. den Fokus auf die Eingabe legen, dann zum Startbildschirm gehen und dann zur Seite zurückkehren; Das iPad sollte das Ansichtsfenster nicht verkleinern. alte IE-Browser funktionieren nicht, Opera hat nicht funktioniert, da Opera nach dem Schließen der Tastatur den Fokus auf das Element gelegt hat.
Die markierte Antwort (Ändern des Bildlauffelds zum Messen der Höhe) hat jedoch unangenehme Nebenwirkungen auf der Benutzeroberfläche, wenn das Ansichtsfenster zoombar ist (oder das Zoomen in den Einstellungen aktiviert ist). Ich verwende nicht die andere vorgeschlagene Lösung (Ändern des Bildlaufs), da unter iOS, wenn das Ansichtsfenster zoombar ist und zur fokussierten Eingabe gescrollt wird, fehlerhafte Interaktionen zwischen Scrollen & Zoomen & Fokussieren auftreten (die eine nur fokussierte Eingabe außerhalb des Ansichtsfensters belassen können - nicht sichtbar).