Editar: Documentado por Apple, aunque en realidad no pude hacerlo funcionar: Comportamiento WKWebView con pantallas de teclado : "En iOS 10, los objetos WKWebView coinciden con el comportamiento nativo de Safari al actualizar su propiedad window.innerHeight cuando se muestra el teclado, y no invocan cambiar el tamaño de los eventos "(quizás puede usar el enfoque o el enfoque más el retraso para detectar el teclado en lugar de usar el cambio de tamaño).
Editar: el código presupone el teclado en pantalla, no el teclado externo. Dejarlo porque la información puede ser útil para otros que solo se preocupan por los teclados en pantalla. Use http://jsbin.com/AbimiQup/4 para ver los parámetros de la página.
Probamos para ver si document.activeElement
es un elemento que muestra el teclado (tipo de entrada = texto, área de texto, etc.).
El siguiente código falsifica las cosas para nuestros propósitos (aunque generalmente no es correcto).
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');
};
El código anterior es solo aproximado: es incorrecto para teclado dividido, teclado desacoplado, teclado físico. Según el comentario en la parte superior, es posible que pueda hacer un mejor trabajo que el código dado en Safari (¿desde iOS8?) O WKWebView (desde iOS10) usando la window.innerHeight
propiedad.
He encontrado fallas en otras circunstancias: por ejemplo, enfocar la entrada, luego ir a la pantalla de inicio y luego volver a la página; iPad no debería hacer que la ventana gráfica sea más pequeña; los antiguos navegadores IE no funcionarán, Opera no funcionó porque Opera mantuvo el foco en el elemento después de cerrar el teclado.
Sin embargo, la respuesta etiquetada (cambiar la tapa de desplazamiento para medir la altura) tiene efectos secundarios desagradables en la interfaz de usuario si la ventana se puede ampliar (o el zoom forzado está habilitado en las preferencias). No utilizo la otra solución sugerida (cambiar el scrolltop) porque en iOS, cuando la ventana gráfica se puede ampliar y desplazarse a la entrada enfocada, hay interacciones con errores entre desplazamiento y zoom y enfoque (que pueden dejar una entrada enfocada solo fuera de la ventana gráfica, no visible).